From d7242cd9447279c481c36f83455b80e5e97e0e57 Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Sat, 6 Nov 2004 22:01:51 +0000 Subject: [PATCH] Changed to new modular upload function --- ChangeLog | 8 +- lang/Language.xref | 2 +- lang/dutch.txt | 2 +- lang/english.txt | 2 +- lang/french.txt | 2 +- lang/galego.txt | 2 +- lang/german.txt | 2 +- lang/germandu.txt | 2 +- lang/italian.txt | 2 +- lang/spanish.txt | 2 +- mbsebbs/file.c | 315 ++++++++++++++------------------------------- mbsebbs/filesub.c | 15 +-- mbsebbs/filesub.h | 2 +- mbsebbs/offline.c | 66 +++------- mbsebbs/transfer.c | 116 ++++++++++++++++- mbsebbs/transfer.h | 17 ++- 16 files changed, 257 insertions(+), 300 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7135fe1a..641cbbf7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -25,9 +25,13 @@ v0.71.0 27-Oct-2004 Removed support for non-batching protocols (xmodem) and for bidirectional protocols. Removed Ctrl-F G, this is of no use anymore. - Switched to new modular download function. + Switched to new modular download and upload functions. With download from file areas, the long filename is sent to the users, we will only support protocols that allow this. + When an invalid OLR reply packet is received, it is removed + from the users upload directory. + We don't reward upload time anymore, only bytes. It's more + troubles to implement right then it's worth these days. mbnewusr: Rewrote terminal i/o. @@ -41,7 +45,7 @@ v0.71.0 27-Oct-2004 Changed width of prompt 261. Added prompt 28. Removed leading spaces of prompt 151. - Removed prompt 276. + Removed prompts 259 and 276. script: Modified rundoor.sh so that it uses two different dosemu diff --git a/lang/Language.xref b/lang/Language.xref index 60f0a3d2..7cbacb97 100644 --- a/lang/Language.xref +++ b/lang/Language.xref @@ -257,7 +257,7 @@ 256 offline.c |Untag Offline Reader message areas 257 filesub.c |Found FILEID.DIZ in 258 file.c |No files marked for download. -259 filesub.c |extra minutes. +259 .c | 260 offline.c |You have selected the following Conference(s): 261 file.c |Filename Size Date 262 change.c |Protocol: Can't open protocol file. diff --git a/lang/dutch.txt b/lang/dutch.txt index 6f5682c7..a6cd9498 100644 --- a/lang/dutch.txt +++ b/lang/dutch.txt @@ -257,7 +257,7 @@ JN|Node onbekend, toch doorgaan [j/N]: |Verwijder selectie Offline Reader berichten gebieden |FILEID.DIZ gevonden in |Geen bestanden gemarkeerd voor download. -|extra minuten. +| |De volgende conferentie(s) zijn geselecteerd: |Bestand Grootte Datum |Protocol: Kan protocollen bestand niet openen. diff --git a/lang/english.txt b/lang/english.txt index 02915270..117d6a66 100644 --- a/lang/english.txt +++ b/lang/english.txt @@ -257,7 +257,7 @@ YN|Node not known, continue anyway [y/N]: |Untag Offline Reader message areas |Found FILEID.DIZ in |No files marked for download. -|extra minutes. +| |You have selected the following Conference(s): |Filename Size Date |Protocol: Can't open protocol file. diff --git a/lang/french.txt b/lang/french.txt index 9eb0a24f..5b04c376 100644 --- a/lang/french.txt +++ b/lang/french.txt @@ -257,7 +257,7 @@ ON|Node inconnu, continue quand m |Untag Offline Reader message areas |Found FILEID.DIZ in |No files marked for download. -|extra minutes. +| |You have selected the following Conference(s): |Filename Size Date |Protocol: Can't open protocol file. diff --git a/lang/galego.txt b/lang/galego.txt index 59e61640..69b91c56 100644 --- a/lang/galego.txt +++ b/lang/galego.txt @@ -257,7 +257,7 @@ SN|Nodo desco |Desmarcar  reas para lectura Off-Line |Atopado FILEID.DIZ en |Non hai ficheiros marcados. -|minutos extra. +| |Escolleche-las seguintes  reas: |Ficheiro Tama¤o Fecha |Protocolo: Non podo abrir ficheiro de protocolos. diff --git a/lang/german.txt b/lang/german.txt index 86606ccb..9c334992 100644 --- a/lang/german.txt +++ b/lang/german.txt @@ -257,7 +257,7 @@ JN|Adresse unbekannt, dennoch fortfahren [j/N]: |Mitteilungsbereiche fuer den "Offline Reader" abwaehlen |FILEID.DIZ gefunden in |Es sind keine Dateien zum Herunterladen markiert. -|extra Minuten. +| |Sie haben folgende Bereiche fuer den "Offline Reader" markiert: |Dateiname Groesse Datum |Protokoll: Protokolldatei kann nicht geoeffnet werden. diff --git a/lang/germandu.txt b/lang/germandu.txt index 8fcbe169..a580df11 100644 --- a/lang/germandu.txt +++ b/lang/germandu.txt @@ -257,7 +257,7 @@ JN|Adresse unbekannt, dennoch fortfahren [a/ein]: |Mitteilungsbereiche fuer den "Offline Reader" abwaehlen |FILEID.DIZ gefunden in |Es sind keine Dateien zum Herunterladen markiert. -|extra Minuten. +| |Du hast folgende Bereiche fuer den "Offline Reader" markiert: |Dateiname Groesse Datum |Protokoll: Protokolldatei kann nicht geoeffnet werden. diff --git a/lang/italian.txt b/lang/italian.txt index 5614b5d6..2cdcc337 100644 --- a/lang/italian.txt +++ b/lang/italian.txt @@ -257,7 +257,7 @@ SN|Nodo sconosciuto, continua lo stesso [s/N]: |Untag aree messaggi per l'Offline Reader |Trovato FILEID.DIZ in |Nessun file selezionato per il download. -|minuti extra. +| |Hai selezionato le seguenti Conferenze: |Filename Dimensione Data |Protocollo: Non posso aprire il file del protocollo. diff --git a/lang/spanish.txt b/lang/spanish.txt index 3874d7fb..b59efef1 100644 --- a/lang/spanish.txt +++ b/lang/spanish.txt @@ -257,7 +257,7 @@ SN|Nodo desconocido. |Desmarcar  reas para lectura Off-Line |Encontrado FILEID.DIZ en |No hay ficheros marcados. -|minutos extra. +| |Has seleccionado las siguientes  reas: |Fichero Tama¤o Fecha |Protocolo: No puedo abrir fichero de protocolos. diff --git a/mbsebbs/file.c b/mbsebbs/file.c index cc0d287b..5a1f8de4 100644 --- a/mbsebbs/file.c +++ b/mbsebbs/file.c @@ -882,24 +882,12 @@ int NewfileScan(int AskStart) */ int Upload() { - char temp[81]; - int Area, err; + int Area, rc; unsigned long OldArea; - time_t ElapstimeStart, ElapstimeFin, iTime; - DIR *dirp; - struct dirent *dp; - struct stat statfile; - char *arc; - + char *arc, *temp; + up_list *up = NULL, *tmpf; WhosDoingWhat(UPLOAD, NULL); - - /* - * Select default protocol if users hasn't any. - */ - if (!ForceProtocol()) - return 0; - Enter(1); Area = OldArea = iAreaNumber; @@ -910,8 +898,6 @@ int Upload() if (area.Upload) Area = area.Upload; SetFileArea(Area); - - SetFileArea(Area); Syslog('+', "Upload area is %d %s", Area, area.Name); /* @@ -929,113 +915,66 @@ int Upload() clear(); Enter(2); - colour(CFG.HiliteF, CFG.HiliteB); - /* Please start your upload now ...*/ - pout(CFG.HiliteF, CFG.HiliteB, sProtAdvice); - PUTCHAR(' '); - PUTSTR((char *) Language(283)); - Enter(2); - Syslog('+', "Upload using %s", sProtName); + rc = upload(&up); - sprintf(temp, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); - if (chdir(temp)) { - WriteError("$Can't chdir to %s", temp); + if (rc) { + Syslog('+', "Upload failed, rc=%d", rc); SetFileArea(OldArea); return 0; } - - sleep(2); - ElapstimeStart = time(NULL); - - /* - * Get the file(s). Set the Client/Server time to 2 hours. - * This is not a nice solution, at least it works and prevents - * that the bbs will hang. - */ - Altime(7200); - alarm_set(7190); - err = execute_str(sProtUp, (char *)"", NULL, NULL, NULL, NULL); - rawport(); - - if (err) { - /* - * Log any errors - */ - WriteError("$Upload error %d, prot: %s", err, sProtUp); - } - Altime(0); - alarm_off(); - alarm_on(); - Enter(3); - ElapstimeFin = time(NULL); - - /* - * Get time from Before Upload and After Upload to get - * upload time, if the time is zero, it will be one. - */ - iTime = ElapstimeFin - ElapstimeStart; - if (!iTime) - iTime = 1; - - Syslog('b', "Transfer time %ld", iTime); - - if ((dirp = opendir(".")) == NULL) { - WriteError("$Upload: can't open ./upl"); - Home(); - SetFileArea(OldArea); - return 1; - } + Syslog('b', "upload done, start checks"); Enter(2); pout(CFG.UnderlineColourF, CFG.UnderlineColourB, (char *)"Checking your upload(s)"); Enter(1); - while ((dp = readdir(dirp)) != NULL) { - if (*(dp->d_name) != '.') { - stat(dp->d_name, &statfile); - Syslog('+', "Uploaded \"%s\", %ld bytes", dp->d_name, statfile.st_size); + temp = calloc(PATH_MAX, sizeof(char)); + for (tmpf = up; tmpf; tmpf = tmpf->next) { + sprintf(temp, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); + chdir(temp); - if ((arc = GetFileType(dp->d_name)) == NULL) { - /* - * If the filetype is unknown, it is probably - * a textfile or so. Import it direct. - */ - Syslog('b', "Unknown file type"); - if (!ScanDirect(dp->d_name)) - ImportFile(dp->d_name, Area, FALSE, iTime, statfile.st_size); + Syslog('b', "Checking upload %s", tmpf->filename); + if ((arc = GetFileType(tmpf->filename)) == NULL) { + /* + * If the filetype is unknown, it is probably + * a textfile or so. Import it direct. + */ + Syslog('b', "Unknown file type"); + if (!ScanDirect(basename(tmpf->filename))) + ImportFile(tmpf->filename, Area, FALSE, tmpf->size); + } else { + /* + * We figured out the type of the uploaded file. + */ + Syslog('b', "File type is %s", arc); + + /* + * MS-DOS executables are handled direct. + */ + if ((strcmp("EXE", arc) == 0) || (strcmp("COM", arc) == 0)) { + if (!ScanDirect(basename(tmpf->filename))) + ImportFile(tmpf->filename, Area, FALSE, tmpf->size); } else { - /* - * We figured out the type of the uploaded file. - */ - Syslog('b', "File type is %s", arc); - - /* - * MS-DOS executables are handled direct. - */ - if ((strcmp("EXE", arc) == 0) || (strcmp("COM", arc) == 0)) { - if (!ScanDirect(dp->d_name)) - ImportFile(dp->d_name, Area, FALSE, iTime, statfile.st_size); - } else { - switch (ScanArchive(dp->d_name, arc)) { - case 0: ImportFile(dp->d_name, Area, TRUE, iTime, statfile.st_size); - break; - case 1: break; - case 2: break; - case 3: /* - * No valid unarchiver found, just import after scanning, - * may catch macro viri. - */ - if (!ScanDirect(dp->d_name)) - ImportFile(dp->d_name, Area, FALSE, iTime, statfile.st_size); - break; - } + switch (ScanArchive(basename(tmpf->filename), arc)) { + case 0: ImportFile(tmpf->filename, Area, TRUE, tmpf->size); + break; + case 1: break; + case 2: break; + case 3: /* + * No valid unarchiver found, just import after scanning, + * may catch macro viri. + */ + if (!ScanDirect(basename(tmpf->filename))) + ImportFile(tmpf->filename, Area, FALSE, tmpf->size); + break; } } } } - closedir(dirp); + tidy_upload(&up); + free(temp); Home(); SetFileArea(OldArea); Pause(); @@ -1168,7 +1107,7 @@ void List_Home() */ void Delete_Home() { - char *temp, *temp1; + char *temp, *temp1, msg[81]; int i; temp = calloc(PATH_MAX, sizeof(char)); @@ -1198,8 +1137,8 @@ void Delete_Home() if ((access(temp, R_OK)) == 0) { Enter(1); /* Delete file: */ /* Are you Sure? [Y/n]: */ - sprintf(temp1, "%s %s, %s", (char *) Language(368), temp1, (char *) Language(369)); - pout(LIGHTGREEN, BLACK, temp1); + sprintf(msg, "%s %s, %s", (char *) Language(368), temp1, (char *) Language(369)); + pout(LIGHTGREEN, BLACK, msg); i = toupper(Readkey()); if (i == Keystroke(369, 0) || i == 13) { @@ -1306,142 +1245,84 @@ int Download_Home() */ int Upload_Home() { - DIR *dirp; - struct dirent *dp; - char *File, *sFileName, *temp, *arc; - time_t ElapstimeStart, ElapstimeFin, iTime; - int err; - struct stat statfile; - - WhosDoingWhat(UPLOAD, NULL); - if (!ForceProtocol()) - return 0; + char *temp, *arc; + int rc = 0, Count = 0; + up_list *up = NULL, *tmpf; + + WhosDoingWhat(UPLOAD, NULL); - File = calloc(PATH_MAX, sizeof(char)); - sFileName = calloc(PATH_MAX, sizeof(char)); temp = calloc(PATH_MAX, sizeof(char)); clear(); Enter(2); - /* Please start your upload now ...*/ - sprintf(temp, "%s, %s", sProtAdvice, (char *) Language(283)); - pout(CFG.HiliteF, CFG.HiliteB, temp); - Enter(2); - Syslog('+', "Upload using %s", sProtName); - sprintf(temp, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); - if (chdir(temp)) { - WriteError("$Can't chdir to %s", temp); - free(File); - free(sFileName); - free(temp); - return 0; - } + rc = upload(&up); - sleep(2); - ElapstimeStart = time(NULL); - - /* - * Get the file(s). Set the Client/Server time to 2 hours. - * This is not a nice solution, at least it works and prevents - * that the bbs will hang. - */ - Altime(7200); - alarm_set(7190); - err = execute_str(sProtUp, (char *)"", NULL, NULL, NULL, NULL); - rawport(); - - if (err) { - /* - * Log any errors - */ - WriteError("$Upload error %d, prot: %s", err, sProtUp); - } - - Altime(0); - alarm_off(); - alarm_on(); - Enter(3); - ElapstimeFin = time(NULL); - - /* - * Get time from Before Upload and After Upload to get - * upload time, if the time is zero, it will be one. - */ - iTime = ElapstimeFin - ElapstimeStart; - if (!iTime) - iTime = 1; - - Syslog('b', "Transfer time %ld", iTime); - - if ((dirp = opendir(".")) == NULL) { - WriteError("$Upload: can't open ./upl"); + if (rc) { + Syslog('+', "Upload home failed, rc=%d", rc); Home(); - free(File); - free(sFileName); - free(temp); return 1; } - + Syslog('b', "Start checking uploaded files"); Enter(2); pout(CFG.UnderlineColourF, CFG.UnderlineColourB, (char *)"Checking your upload(s)"); Enter(2); - while ((dp = readdir(dirp)) != NULL) { + for (tmpf = up; tmpf; tmpf = tmpf->next) { + sprintf(temp, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); + chdir(temp); - if (*(dp->d_name) != '.') { - stat(dp->d_name, &statfile); - Syslog('+', "Uploaded \"%s\", %ld bytes", dp->d_name, statfile.st_size); + Syslog('b', "Checking upload %s", tmpf->filename); + if ((arc = GetFileType(tmpf->filename)) == NULL) { + /* + * If the filetype is unknown, it is probably + * a textfile or so. Import it direct. + */ + Syslog('b', "Unknown file type"); + ImportHome(basename(tmpf->filename)); + Count++; + } else { + /* + * We figured out the type of the uploaded file. + */ + Syslog('b', "File type is %s", arc); - if ((arc = GetFileType(dp->d_name)) == NULL) { - /* - * If the filetype is unknown, it is probably - * a textfile or so. Import it direct. - */ - Syslog('b', "Unknown file type"); - ImportHome(dp->d_name); + /* + * MS-DOS executables are handled direct. + */ + if ((strcmp("EXE", arc) == 0) || (strcmp("COM", arc) == 0)) { + if (!ScanDirect(basename(tmpf->filename))) { + ImportHome(basename(tmpf->filename)); + Count++; + } } else { - /* - * We figured out the type of the uploaded file. - */ - Syslog('b', "File type is %s", arc); - - /* - * MS-DOS executables are handled direct. - */ - if ((strcmp("EXE", arc) == 0) || (strcmp("COM", arc) == 0)) { - if (!ScanDirect(dp->d_name)) - ImportHome(dp->d_name); - } else { - switch(ScanArchive(dp->d_name, arc)) { - case 0: ImportHome(dp->d_name); - break; - case 1: break; - case 2: break; - case 3: /* - * No valid unarchiver found, just import - */ - ImportHome(dp->d_name); - break; - } + switch(ScanArchive(basename(tmpf->filename), arc)) { + case 0: ImportHome(basename(tmpf->filename)); + Count++; + break; + case 1: break; + case 2: break; + case 3: /* + * No valid unarchiver found, just import + */ + ImportHome(basename(tmpf->filename)); + Count++; + break; } } } } - - closedir(dirp); Home(); ReadExitinfo(); - exitinfo.Uploads++; + exitinfo.Uploads += Count; WriteExitinfo(); + tidy_upload(&up); Pause(); - free(File); - free(sFileName); free(temp); - return 1; + return rc; } diff --git a/mbsebbs/filesub.c b/mbsebbs/filesub.c index 172b87e7..7fc2b7bc 100644 --- a/mbsebbs/filesub.c +++ b/mbsebbs/filesub.c @@ -759,20 +759,20 @@ char *GetFileType(char *fn) /* * Import file in area. Returns TRUE if successfull. */ -int ImportFile(char *fn, int Area, int fileid, time_t iTime, off_t Size) +int ImportFile(char *fn, int Area, int fileid, off_t Size) { char *temp, *temp1, msg[81]; temp = calloc(PATH_MAX, sizeof(char)); temp1 = calloc(PATH_MAX, sizeof(char)); - sprintf(temp, "%s/%s", area.Path, fn); - sprintf(temp1, "%s/%s/upl/%s", CFG.bbs_usersdir, exitinfo.Name, fn); + sprintf(temp, "%s/%s", area.Path, basename(fn)); + sprintf(temp1, "%s", fn); if ((file_mv(temp1, temp))) { WriteError("$Can't move %s to %s", fn, area.Path); } else { chmod(temp, 0664); - if (Addfile(fn, Area, fileid)) { + if (Addfile(basename(fn), Area, fileid)) { ReadExitinfo(); @@ -794,13 +794,6 @@ int ImportFile(char *fn, int Area, int fileid, time_t iTime, off_t Size) Syslog('b', "DownloadKToday %d", exitinfo.DownloadKToday); } - iTime /= 60; /* Divide Seconds by 60 to give minutes */ - /* You have */ /* extra minutes. */ - sprintf(msg, "%s %ld %s", (char *) Language(249), iTime, (char *) Language(259)); - PUTSTR(msg); - Enter(1); - exitinfo.iTimeLeft += iTime; - WriteExitinfo(); free(temp); free(temp1); diff --git a/mbsebbs/filesub.h b/mbsebbs/filesub.h index 701aa8ec..32ce1d84 100644 --- a/mbsebbs/filesub.h +++ b/mbsebbs/filesub.h @@ -20,7 +20,7 @@ char *GetFileType(char *); void Home(void); int ScanDirect(char *); int ScanArchive(char *, char *); -int ImportFile(char *, int, int, time_t, off_t); +int ImportFile(char *, int, int, off_t); unsigned long Quota(void); void ImportHome(char *); diff --git a/mbsebbs/offline.c b/mbsebbs/offline.c index 42ffcc13..b9e09b0b 100644 --- a/mbsebbs/offline.c +++ b/mbsebbs/offline.c @@ -1011,10 +1011,10 @@ USHORT TOffline::TooOld (ULONG Restrict, class TMsgBase *Msg) */ void OLR_Upload(void) { - char *File, *temp, *Arc, Dirpath[PATH_MAX], Filename[81], msg[81]; - time_t ElapstimeStart, ElapstimeFin, iTime; - int err, RetVal = FALSE; + char *File, *temp, *Arc, Dirpath[PATH_MAX], Filename[81]; + int rc = 0, RetVal = FALSE; FILE *fp; + up_list *up = NULL, *tmpf; if (strlen(CFG.bbsid) == 0) { PUTSTR((char *)"System configuration error, inform sysop"); @@ -1029,57 +1029,17 @@ void OLR_Upload(void) /* Offline Reader Upload */ poutCR(LIGHTMAGENTA, BLACK, (char *)Language(439)); - if (!ForceProtocol()) - return; - File = calloc(PATH_MAX, sizeof(char)); temp = calloc(PATH_MAX, sizeof(char)); Enter(1); - /* Please start your upload now */ - sprintf(msg, "%s, %s", sProtAdvice, (char *) Language(283)); - pout(CFG.HiliteF, CFG.HiliteB, msg); - Enter(2); - Syslog('+', "Upload using %s", sProtName); - sprintf(temp, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); - - if (chdir(temp)) { - WriteError("$Can't chdir to %s", temp); + if ((rc = upload(&up))) { + Syslog('+', "Upload failed, rc=%d", rc); return; } - - sleep(2); - ElapstimeStart = time(NULL); - - /* - * Get the file - */ - Altime(7200); - alarm_set(7190); - err = execute_str(sProtUp, (char *)"", NULL, NULL, NULL, NULL); - if (rawport() != 0) { - WriteError("Unable to set raw mode"); - } - if (err) { - WriteError("$Upload error %d, prot: %s", err, sProtUp); - } - Altime(0); - alarm_off(); - alarm_on(); - - Enter(1); - ElapstimeFin = time(NULL); - - /* - * Get the upload time. - */ - iTime = ElapstimeFin - ElapstimeStart; - if (!iTime) - iTime = 1; - - Syslog('m', "Transfer time %ld", iTime); Home(); + Enter(1); sprintf(Dirpath, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); sprintf(Filename, "%s.NEW", CFG.bbsid); @@ -1097,12 +1057,18 @@ void OLR_Upload(void) if (RetVal == FALSE) { WriteError("Invalid OLR packed received"); + for (tmpf = up; tmpf; tmpf = tmpf->next) { + Syslog('+', "Delete %s", tmpf->filename); + unlink(tmpf->filename); + } + tidy_upload(&up); /* Invalid packet received */ pout(LIGHTRED, BLACK, (char *)Language(440)); Enter(2); - sleep(2); + sleep(3); return; } + tidy_upload(&up); sprintf(File, "%s/%s", Dirpath, Filename); Syslog('+', "Received OLR packet %s", File); @@ -1112,6 +1078,7 @@ void OLR_Upload(void) poutCR(LIGHTRED, BLACK, (char *)Language(441)); Syslog('+', "Unknown compression type"); Pause(); + unlink(File); return; } @@ -1134,6 +1101,7 @@ void OLR_Upload(void) /* Archiver not available */ poutCR(LIGHTRED, BLACK, (char *)Language(442)); Pause(); + unlink(File); return; } @@ -1147,11 +1115,11 @@ void OLR_Upload(void) Syslog('m', "Unarc %s", temp); colour(CFG.HiliteF, CFG.HiliteB); - err = execute_str(archiver.funarc, File, NULL, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null"); + rc = execute_str(archiver.funarc, File, NULL, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null"); if (rawport() != 0) { WriteError("Unable to set raw mode"); } - if (err) { + if (rc) { WriteError("$Failed %s", temp); /* ERROR */ poutCR(LIGHTRED, BLACK, (char *) Language(217)); diff --git a/mbsebbs/transfer.c b/mbsebbs/transfer.c index dcbffba0..9ab1e700 100644 --- a/mbsebbs/transfer.c +++ b/mbsebbs/transfer.c @@ -349,14 +349,42 @@ int download(down_list *download_list) +void tidy_upload(up_list **fdp) +{ + up_list *tmp, *old; + + for (tmp = *fdp; tmp; tmp = old) { + old = tmp->next; + if (tmp->filename) + free(tmp->filename); + free(tmp); + } + + *fdp = NULL; + return; +} + + + /* * Upload files from the user. * Returns: * 0 - All seems well * 1 - No transfer protocol selected. + * 2 - Transfer failed */ -int upload(up_list *upload_list) +int upload(up_list **upload_list) { + char *temp; + struct dirent *dp; + DIR *dirp; + struct stat statfile; + struct timeval starttime, endtime; + struct timezone tz; + unsigned long Size = 0; + int err, Count = 0, rc = 0; + up_list *tmp, *ta; + /* * If user has no default protocol, make sure he has one. */ @@ -364,7 +392,91 @@ int upload(up_list *upload_list) return 1; } - return 0; + temp = calloc(PATH_MAX, sizeof(char)); + + /* Please start your upload now */ + sprintf(temp, "%s, %s", sProtAdvice, (char *) Language(283)); + pout(CFG.HiliteF, CFG.HiliteB, temp); + Enter(2); + Syslog('+', "Upload using %s", sProtName); + + sprintf(temp, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); + + if (chdir(temp)) { + WriteError("$Can't chdir to %s", temp); + free(temp); + return 1; + } + sleep(2); + + if (uProtInternal) { + } else { + /* + * External protocol + */ + gettimeofday(&starttime, &tz); + + Altime(7200); + alarm_set(7190); + err = execute_str(sProtUp, (char *)"", NULL, NULL, NULL, NULL); + if (rawport() != 0) { + WriteError("Unable to set raw mode"); + } + if (err) { + WriteError("$Upload error %d, prot: %s", err, sProtUp); + rc = 2; + } + Altime(0); + alarm_off(); + alarm_on(); + + gettimeofday(&endtime, &tz); + + /* + * With external protocols we don't know anything about what we got. + * Just check the files in the users upload directory. + */ + if ((dirp = opendir(".")) == NULL) { + WriteError("$Upload: can't open ./upl"); + Home(); + rc = 1; + } else { + while ((dp = readdir(dirp)) != NULL) { + if (*(dp->d_name) != '.') { + stat(dp->d_name, &statfile); + Syslog('+', "Uploaded \"%s\", %ld bytes", dp->d_name, statfile.st_size); + Count++; + Size += statfile.st_size; + sprintf(temp, "%s/%s/upl/%s", CFG.bbs_usersdir, exitinfo.Name, dp->d_name); + chmod(temp, 0660); + + /* + * Add uploaded file to the list + */ + tmp = (up_list *)malloc(sizeof(up_list)); + tmp->next = NULL; + tmp->filename = xstrcpy(temp); + tmp->size = Size; + + if (*upload_list == NULL) { + *upload_list = tmp; + } else { + for (ta = *upload_list; ta; ta = ta->next) { + if (ta->next == NULL) { + ta->next = (up_list *)tmp; + break; + } + } + } + } + } + closedir(dirp); + Syslog('+', "Upload %s in %d file(s)", transfertime(starttime, endtime, (unsigned long)Size, FALSE), Count); + } + } + free(temp); + + return rc; } diff --git a/mbsebbs/transfer.h b/mbsebbs/transfer.h index 034f18ec..a1c95cc9 100644 --- a/mbsebbs/transfer.h +++ b/mbsebbs/transfer.h @@ -27,18 +27,17 @@ typedef struct _down_list { */ typedef struct _up_list { struct _up_list *next; - char *remote; /* Remote filename */ - char *local; /* Local filename */ - long cps; /* CPS after received */ - unsigned success : 1; /* If received Ok. */ + char *filename; /* Filename */ + unsigned long size; /* Filesize */ } up_list; -int ForceProtocol(void); -void add_download(down_list **, char *, char *, long, unsigned long, int); -void tidy_download(down_list **); -int download(down_list *); -int upload(up_list *); +int ForceProtocol(void); +void add_download(down_list **, char *, char *, long, unsigned long, int); +void tidy_download(down_list **); +int download(down_list *); +void tidy_upload(up_list **); +int upload(up_list **); #endif