Added long filename support to filerequests

This commit is contained in:
Michiel Broek 2001-12-02 14:01:49 +00:00
parent cd7bf461e6
commit 8f1f76998c
6 changed files with 95 additions and 61 deletions

View File

@ -4304,6 +4304,12 @@ v0.33.19 26-Oct-2001
mbcico:
Removed IEMSI support since mbsebbs doesn't support it
anymore.
Filerequest responses are now created with long filenames.
When sending files, if the remote has the FNC link flag, the
filename is mangled to DOS 8.3 format when transmitted.
File request response messages now displayy the long and
short filename in the reply.
Filerequest resonse messages now have a random quote added.
mbtask:
Changed to handle the External Doors flag in the lastcaller

View File

@ -122,6 +122,7 @@ charset.o: libs.h structs.h common.h clcomm.h
ftn.o: libs.h structs.h records.h clcomm.h dbftn.h common.h
nodelist.o: libs.h structs.h records.h clcomm.h common.h
pktname.o: libs.h structs.h records.h clcomm.h common.h
mangle.o: libs.h structs.h clcomm.h common.h
charconv.o: libs.h structs.h records.h common.h clcomm.h
dostran.o: libs.h structs.h records.h common.h
ftnmsg.o: libs.h structs.h common.h clcomm.h

View File

@ -1,8 +1,7 @@
/*****************************************************************************
*
* File ..................: mbcico/filelist.c
* $Id$
* Purpose ...............: fidonet mailer
* Last modification date : 07-Aug-2001
*
*****************************************************************************
* Copyright (C) 1997-2001
@ -61,58 +60,26 @@ static char *tmpkname(void)
char *xtodos(char *orig)
{
int i;
char buf[8+1+3+1],*copy,*p,*q,*r;
char buf[13], *copy, *p;
if (orig == NULL)
return NULL;
if ((remote_flags & SESSION_FNC) == 0) {
Syslog('o', "No filename conversion for \"%s\"",MBSE_SS(orig));
Syslog('o', "No filename conversion for \"%s\"", MBSE_SS(orig));
return xstrcpy(orig);
}
copy=xstrcpy(orig);
if ((p=strrchr(copy,'/')))
copy = xstrcpy(orig);
if ((p = strrchr(copy,'/')))
p++;
else
p=copy;
if (strcmp(q=copy+strlen(copy)-strlen(".tar.gz"),".tar.gz") == 0) {
*q='\0';
q=(char *)"tgz";
} else if (strcmp(q=copy+strlen(copy)-strlen(".tar.z"),".tar.z") == 0) {
*q='\0';
q=(char *)"tgz";
} else if (strcmp(q=copy+strlen(copy)-strlen(".tar.Z"),".tar.Z") == 0) {
*q='\0';
q=(char *)"taz";
} else if ((q=strrchr(p,'.')))
*q++='\0';
else
q=NULL;
r=buf;
for (i=0;(i<8) && (*p);i++,p++,r++)
switch (*p) {
case '.':
case '\\': *r='_'; break;
default: *r=toupper(*p);
}
if (q) {
*r++='.';
for (i=0;(i<3) && (*q);i++,q++,r++)
switch (*q) {
case '.':
case '\\': *r='_'; break;
default: *r=toupper(*q);
}
}
*r++='\0';
Syslog('o', "name \"%s\" converted to \"%s\"",MBSE_SS(orig),MBSE_SS(buf));
p = copy;
name_mangle(p);
memset(&buf, 0, sizeof(buf));
strncpy(buf, p, 12);
Syslog('o', "name \"%s\" converted to \"%s\"", MBSE_SS(orig), MBSE_SS(buf));
free(copy);
return xstrcpy(buf);
}

View File

@ -155,6 +155,9 @@ int main(int argc, char *argv[])
char *answermode = NULL, *p = NULL, *cmd = NULL;
struct passwd *pw;
FILE *fp;
#ifdef IEMSI
char temp[81];
#endif
#ifdef MEMWATCH
mwInit();
@ -286,7 +289,32 @@ int main(int argc, char *argv[])
tmpl = &callist;
while (argv[optind]) {
for (p = argv[optind]; (*p) && (*p == '*'); p++);
#ifdef IEMSI
if (strncasecmp(p, "EMSI_NAKEEC3", 12) == 0) {
Syslog('+', "Detected IEMSI client, starting BBS");
sprintf(temp, "%s/bin/mbsebbs", getenv("MBSE_ROOT"));
socket_shutdown(mypid);
if (execl(temp, "mbsebbs", (char *)NULL) == -1)
perror("FATAL: Error loading BBS!");
/*
* If this happens, nothing is logged!
*/
printf("\n\nFATAL: Loading of the BBS failed!\n\n");
sleep(3);
free_mem();
if (envptr)
free(envptr);
#ifdef MEMWATCH
mwTerm();
#endif
exit(100);
}
#endif
if ((strcasecmp(argv[optind],"tsync") == 0) ||
(strcasecmp(argv[optind],"yoohoo") == 0) ||
(strcasecmp(argv[optind],"ibn") == 0) ||

View File

@ -1,8 +1,7 @@
/*****************************************************************************
*
* File ..................: mbcico/respfreq.c
* Purpose ...............: Fidonet mailer
* Last modification date : 04-Oct-2001
* $Id$
* Purpose ...............: Fidonet mailer - respond to filerequests
*
*****************************************************************************
* Copyright (C) 1997-2001
@ -296,14 +295,12 @@ file_list *respfreq(char *nm, char *pw, char *dt)
WriteError("$Can't read filerecord %d", idx.Record);
} else {
Send = FALSE;
Syslog('f', "Found \"%s\" in %s", file.Name, area.Name);
Syslog('f', "Found \"%s\" in %s", file.LName, area.Name);
tnm = xstrcpy(area.Path);
tnm = xstrcat(tnm, (char *)"/");
tnm = xstrcat(tnm, file.Name);
if ((stat(tnm, &st) == 0) &&
(S_ISREG(st.st_mode)) &&
(access(tnm, R_OK) == 0) &&
((upd == 0L) ||
tnm = xstrcat(tnm, file.LName);
if ((stat(tnm, &st) == 0) && (S_ISREG(st.st_mode)) &&
(access(tnm, R_OK) == 0) && ((upd == 0L) ||
((newer) && (st.st_mtime <= upd)))) {
Send = TRUE;
}
@ -320,7 +317,8 @@ file_list *respfreq(char *nm, char *pw, char *dt)
if (strcasecmp(area.Password, pw)) {
Send = FALSE;
Syslog('+', "Bad password for area %s", area.Name);
add_report((char *)"ER: bad password for area %s", area.Name);
add_report((char *)"ER: bad password for area %s",
area.Name);
}
} else {
Send = FALSE;
@ -332,7 +330,8 @@ file_list *respfreq(char *nm, char *pw, char *dt)
if (strcasecmp(file.Password, pw)) {
Send = FALSE;
Syslog('+', "Bad password for file %s", file.Name);
add_report((char *)"ER: bad password for file %s", file.Name);
add_report((char *)"ER: bad password for file %s",
file.LName);
}
} else {
Send = FALSE;
@ -351,7 +350,8 @@ file_list *respfreq(char *nm, char *pw, char *dt)
if (Send && CFG.Req_MBytes) {
if ((st.st_size + report_total) > (CFG.Req_MBytes * 1048576)) {
Send = FALSE;
add_report((char *)"ER: file %s will exceed the request limit", file.Name);
add_report((char *)"ER: file %s will exceed the request limit",
file.Name);
Syslog('+', "Exceeding request size limit");
no_more = TRUE;
}
@ -361,8 +361,14 @@ file_list *respfreq(char *nm, char *pw, char *dt)
Syslog('f', "Will send %s", file.LName);
report_total += st.st_size;
report_count++;
add_report((char *)"OK: Sending \"%s\" (%lu bytes)", file.Name, file.Size);
add_list(&fl, tnm, file.Name, 0, 0L, NULL, 1);
if (strcasecmp(file.Name, file.LName))
add_report((char *)"OK: Sending \"%s\" as \"%s\" (%lu bytes)",
file.LName, file.Name, file.Size);
else
add_report((char *)"OK: Sending \"%s\" (%lu bytes)",
file.LName, file.Size);
add_list(&fl, tnm, file.LName, 0, 0L, NULL, 1);
/*
* Update file information
*/
@ -568,12 +574,14 @@ file_list *respmagic(char *cmd) /* must free(cmd) before exit */
static void attach_report(file_list **fl)
{
FILE *fp;
char tmpfn[PATH_MAX];
char *tmpfn;
char remname[14];
long zeroes = 0L;
long zeroes = 0L, recno, records;
ftnmsg fmsg;
char *svname;
tmpfn = calloc(PATH_MAX, sizeof(char));
if (report_text == NULL) {
WriteError("Empty FREQ report");
add_report((char *)"ER: empty request report, contact sysop");
@ -590,6 +598,29 @@ static void attach_report(file_list **fl)
else
add_report((char *)"Maximum size : %d MBytes", CFG.Req_MBytes);
/*
* Add random quote
*/
sprintf(tmpfn, "%s/etc/oneline.data", getenv("MBSE_ROOT"));
if ((fp = fopen(tmpfn, "r+")) != NULL) {
fread(&olhdr, sizeof(olhdr), 1, fp);
fseek(fp, 0, SEEK_END);
records = (ftell(fp) - olhdr.hdrsize) / olhdr.recsize;
srand(getpid());
recno = 1+(int) (1.0 * records * rand() / (RAND_MAX + 1.0));
Syslog('f', "Selected quote %d out of %d records", recno, records);
if (fseek(fp, olhdr.hdrsize + (recno * olhdr.recsize), SEEK_SET) == 0) {
if (fread(&ol, olhdr.recsize, 1, fp) == 1) {
add_report((char *)"\r... %s", ol.Oneline);
} else {
WriteError("Can't read %s", tmpfn);
}
} else {
WriteError("$Can't seek record %d in %s", recno, tmpfn);
}
fclose(fp);
}
add_report((char *)"\r--- mbcico v%s\r", VERSION);
sprintf(tmpfn, "%s/tmp/%08lX.rpl", getenv((char *)"MBSE_ROOT"), (unsigned long)sequencer());
@ -628,6 +659,7 @@ static void attach_report(file_list **fl)
report_total = 0L;
free(report_text);
free(tmpfn);
report_text = NULL;
}

View File

@ -124,8 +124,8 @@ void ListFileAreas(int Area)
if (strlen(file.Desc[0]) > 36)
file.Desc[0][36] = '\0';
printf("%-12s %6ld %s %5ld %s %s\n",
file.Name, file.Size / 1024, StrDateDMY(file.FileDate),
file.TimesDL + file.TimesFTP + file.TimesReq, flags, file.Desc[0]);
file.Name, (long)(file.Size / 1024), StrDateDMY(file.FileDate),
(long)(file.TimesDL + file.TimesFTP + file.TimesReq), flags, file.Desc[0]);
fcount++;
fsize = fsize + file.Size;
}