From 8f1f76998c4dd184064d6f5fa5373bf076c501e6 Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Sun, 2 Dec 2001 14:01:49 +0000 Subject: [PATCH] Added long filename support to filerequests --- ChangeLog | 6 +++++ lib/Makefile | 1 + mbcico/filelist.c | 53 ++++++++------------------------------- mbcico/mbcico.c | 28 +++++++++++++++++++++ mbcico/respfreq.c | 64 +++++++++++++++++++++++++++++++++++------------ mbfido/mbflist.c | 4 +-- 6 files changed, 95 insertions(+), 61 deletions(-) diff --git a/ChangeLog b/ChangeLog index a03584f9..21a579ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/lib/Makefile b/lib/Makefile index a27edd64..15084f29 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -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 diff --git a/mbcico/filelist.c b/mbcico/filelist.c index 687fe7cc..ff8f194a 100644 --- a/mbcico/filelist.c +++ b/mbcico/filelist.c @@ -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); } diff --git a/mbcico/mbcico.c b/mbcico/mbcico.c index c5984f30..8a12e351 100644 --- a/mbcico/mbcico.c +++ b/mbcico/mbcico.c @@ -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) || diff --git a/mbcico/respfreq.c b/mbcico/respfreq.c index 51be00a0..dc41384e 100644 --- a/mbcico/respfreq.c +++ b/mbcico/respfreq.c @@ -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; } diff --git a/mbfido/mbflist.c b/mbfido/mbflist.c index 1fed33b9..b7dc07db 100644 --- a/mbfido/mbflist.c +++ b/mbfido/mbflist.c @@ -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; }