Changed to new modular upload function

This commit is contained in:
Michiel Broek 2004-11-06 22:01:51 +00:00
parent 0bc80c5eec
commit d7242cd944
16 changed files with 257 additions and 300 deletions

View File

@ -25,9 +25,13 @@ v0.71.0 27-Oct-2004
Removed support for non-batching protocols (xmodem) and for Removed support for non-batching protocols (xmodem) and for
bidirectional protocols. bidirectional protocols.
Removed Ctrl-F G, this is of no use anymore. 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 With download from file areas, the long filename is sent to
the users, we will only support protocols that allow this. 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: mbnewusr:
Rewrote terminal i/o. Rewrote terminal i/o.
@ -41,7 +45,7 @@ v0.71.0 27-Oct-2004
Changed width of prompt 261. Changed width of prompt 261.
Added prompt 28. Added prompt 28.
Removed leading spaces of prompt 151. Removed leading spaces of prompt 151.
Removed prompt 276. Removed prompts 259 and 276.
script: script:
Modified rundoor.sh so that it uses two different dosemu Modified rundoor.sh so that it uses two different dosemu

View File

@ -257,7 +257,7 @@
256 offline.c |Untag Offline Reader message areas 256 offline.c |Untag Offline Reader message areas
257 filesub.c |Found FILEID.DIZ in 257 filesub.c |Found FILEID.DIZ in
258 file.c |No files marked for download. 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): 260 offline.c |You have selected the following Conference(s):
261 file.c |Filename Size Date 261 file.c |Filename Size Date
262 change.c |Protocol: Can't open protocol file. 262 change.c |Protocol: Can't open protocol file.

View File

@ -257,7 +257,7 @@ JN|Node onbekend, toch doorgaan [j/N]:
|Verwijder selectie Offline Reader berichten gebieden |Verwijder selectie Offline Reader berichten gebieden
|FILEID.DIZ gevonden in |FILEID.DIZ gevonden in
|Geen bestanden gemarkeerd voor download. |Geen bestanden gemarkeerd voor download.
|extra minuten. |
|De volgende conferentie(s) zijn geselecteerd: |De volgende conferentie(s) zijn geselecteerd:
|Bestand Grootte Datum |Bestand Grootte Datum
|Protocol: Kan protocollen bestand niet openen. |Protocol: Kan protocollen bestand niet openen.

View File

@ -257,7 +257,7 @@ YN|Node not known, continue anyway [y/N]:
|Untag Offline Reader message areas |Untag Offline Reader message areas
|Found FILEID.DIZ in |Found FILEID.DIZ in
|No files marked for download. |No files marked for download.
|extra minutes. |
|You have selected the following Conference(s): |You have selected the following Conference(s):
|Filename Size Date |Filename Size Date
|Protocol: Can't open protocol file. |Protocol: Can't open protocol file.

View File

@ -257,7 +257,7 @@ ON|Node inconnu, continue quand m
|Untag Offline Reader message areas |Untag Offline Reader message areas
|Found FILEID.DIZ in |Found FILEID.DIZ in
|No files marked for download. |No files marked for download.
|extra minutes. |
|You have selected the following Conference(s): |You have selected the following Conference(s):
|Filename Size Date |Filename Size Date
|Protocol: Can't open protocol file. |Protocol: Can't open protocol file.

View File

@ -257,7 +257,7 @@ SN|Nodo desco
|Desmarcar  reas para lectura Off-Line |Desmarcar  reas para lectura Off-Line
|Atopado FILEID.DIZ en |Atopado FILEID.DIZ en
|Non hai ficheiros marcados. |Non hai ficheiros marcados.
|minutos extra. |
|Escolleche-las seguintes  reas: |Escolleche-las seguintes  reas:
|Ficheiro Tama¤o Fecha |Ficheiro Tama¤o Fecha
|Protocolo: Non podo abrir ficheiro de protocolos. |Protocolo: Non podo abrir ficheiro de protocolos.

View File

@ -257,7 +257,7 @@ JN|Adresse unbekannt, dennoch fortfahren [j/N]:
|Mitteilungsbereiche fuer den "Offline Reader" abwaehlen |Mitteilungsbereiche fuer den "Offline Reader" abwaehlen
|FILEID.DIZ gefunden in |FILEID.DIZ gefunden in
|Es sind keine Dateien zum Herunterladen markiert. |Es sind keine Dateien zum Herunterladen markiert.
|extra Minuten. |
|Sie haben folgende Bereiche fuer den "Offline Reader" markiert: |Sie haben folgende Bereiche fuer den "Offline Reader" markiert:
|Dateiname Groesse Datum |Dateiname Groesse Datum
|Protokoll: Protokolldatei kann nicht geoeffnet werden. |Protokoll: Protokolldatei kann nicht geoeffnet werden.

View File

@ -257,7 +257,7 @@ JN|Adresse unbekannt, dennoch fortfahren [<j>a/<N>ein]:
|Mitteilungsbereiche fuer den "Offline Reader" abwaehlen |Mitteilungsbereiche fuer den "Offline Reader" abwaehlen
|FILEID.DIZ gefunden in |FILEID.DIZ gefunden in
|Es sind keine Dateien zum Herunterladen markiert. |Es sind keine Dateien zum Herunterladen markiert.
|extra Minuten. |
|Du hast folgende Bereiche fuer den "Offline Reader" markiert: |Du hast folgende Bereiche fuer den "Offline Reader" markiert:
|Dateiname Groesse Datum |Dateiname Groesse Datum
|Protokoll: Protokolldatei kann nicht geoeffnet werden. |Protokoll: Protokolldatei kann nicht geoeffnet werden.

View File

@ -257,7 +257,7 @@ SN|Nodo sconosciuto, continua lo stesso [s/N]:
|Untag aree messaggi per l'Offline Reader |Untag aree messaggi per l'Offline Reader
|Trovato FILEID.DIZ in |Trovato FILEID.DIZ in
|Nessun file selezionato per il download. |Nessun file selezionato per il download.
|minuti extra. |
|Hai selezionato le seguenti Conferenze: |Hai selezionato le seguenti Conferenze:
|Filename Dimensione Data |Filename Dimensione Data
|Protocollo: Non posso aprire il file del protocollo. |Protocollo: Non posso aprire il file del protocollo.

View File

@ -257,7 +257,7 @@ SN|Nodo desconocido.
|Desmarcar  reas para lectura Off-Line |Desmarcar  reas para lectura Off-Line
|Encontrado FILEID.DIZ en |Encontrado FILEID.DIZ en
|No hay ficheros marcados. |No hay ficheros marcados.
|minutos extra. |
|Has seleccionado las siguientes  reas: |Has seleccionado las siguientes  reas:
|Fichero Tama¤o Fecha |Fichero Tama¤o Fecha
|Protocolo: No puedo abrir fichero de protocolos. |Protocolo: No puedo abrir fichero de protocolos.

View File

@ -882,24 +882,12 @@ int NewfileScan(int AskStart)
*/ */
int Upload() int Upload()
{ {
char temp[81]; int Area, rc;
int Area, err;
unsigned long OldArea; unsigned long OldArea;
time_t ElapstimeStart, ElapstimeFin, iTime; char *arc, *temp;
DIR *dirp; up_list *up = NULL, *tmpf;
struct dirent *dp;
struct stat statfile;
char *arc;
WhosDoingWhat(UPLOAD, NULL); WhosDoingWhat(UPLOAD, NULL);
/*
* Select default protocol if users hasn't any.
*/
if (!ForceProtocol())
return 0;
Enter(1); Enter(1);
Area = OldArea = iAreaNumber; Area = OldArea = iAreaNumber;
@ -910,8 +898,6 @@ int Upload()
if (area.Upload) if (area.Upload)
Area = area.Upload; Area = area.Upload;
SetFileArea(Area); SetFileArea(Area);
SetFileArea(Area);
Syslog('+', "Upload area is %d %s", Area, area.Name); Syslog('+', "Upload area is %d %s", Area, area.Name);
/* /*
@ -929,113 +915,66 @@ int Upload()
clear(); clear();
Enter(2); 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 (rc) {
if (chdir(temp)) { Syslog('+', "Upload failed, rc=%d", rc);
WriteError("$Can't chdir to %s", temp);
SetFileArea(OldArea); SetFileArea(OldArea);
return 0; return 0;
} }
Syslog('b', "upload done, start checks");
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;
}
Enter(2); Enter(2);
pout(CFG.UnderlineColourF, CFG.UnderlineColourB, (char *)"Checking your upload(s)"); pout(CFG.UnderlineColourF, CFG.UnderlineColourB, (char *)"Checking your upload(s)");
Enter(1); Enter(1);
while ((dp = readdir(dirp)) != NULL) { temp = calloc(PATH_MAX, sizeof(char));
if (*(dp->d_name) != '.') { for (tmpf = up; tmpf; tmpf = tmpf->next) {
stat(dp->d_name, &statfile); sprintf(temp, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name);
Syslog('+', "Uploaded \"%s\", %ld bytes", dp->d_name, statfile.st_size); chdir(temp);
if ((arc = GetFileType(dp->d_name)) == NULL) { 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. * 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)) Syslog('b', "Unknown file type");
ImportFile(dp->d_name, Area, FALSE, iTime, statfile.st_size); 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 { } else {
/* switch (ScanArchive(basename(tmpf->filename), arc)) {
* We figured out the type of the uploaded file. case 0: ImportFile(tmpf->filename, Area, TRUE, tmpf->size);
*/ break;
Syslog('b', "File type is %s", arc); case 1: break;
case 2: break;
/* case 3: /*
* MS-DOS executables are handled direct. * No valid unarchiver found, just import after scanning,
*/ * may catch macro viri.
if ((strcmp("EXE", arc) == 0) || (strcmp("COM", arc) == 0)) { */
if (!ScanDirect(dp->d_name)) if (!ScanDirect(basename(tmpf->filename)))
ImportFile(dp->d_name, Area, FALSE, iTime, statfile.st_size); ImportFile(tmpf->filename, Area, FALSE, tmpf->size);
} else { break;
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;
}
} }
} }
} }
} }
closedir(dirp);
tidy_upload(&up);
free(temp);
Home(); Home();
SetFileArea(OldArea); SetFileArea(OldArea);
Pause(); Pause();
@ -1168,7 +1107,7 @@ void List_Home()
*/ */
void Delete_Home() void Delete_Home()
{ {
char *temp, *temp1; char *temp, *temp1, msg[81];
int i; int i;
temp = calloc(PATH_MAX, sizeof(char)); temp = calloc(PATH_MAX, sizeof(char));
@ -1198,8 +1137,8 @@ void Delete_Home()
if ((access(temp, R_OK)) == 0) { if ((access(temp, R_OK)) == 0) {
Enter(1); Enter(1);
/* Delete file: */ /* Are you Sure? [Y/n]: */ /* Delete file: */ /* Are you Sure? [Y/n]: */
sprintf(temp1, "%s %s, %s", (char *) Language(368), temp1, (char *) Language(369)); sprintf(msg, "%s %s, %s", (char *) Language(368), temp1, (char *) Language(369));
pout(LIGHTGREEN, BLACK, temp1); pout(LIGHTGREEN, BLACK, msg);
i = toupper(Readkey()); i = toupper(Readkey());
if (i == Keystroke(369, 0) || i == 13) { if (i == Keystroke(369, 0) || i == 13) {
@ -1306,142 +1245,84 @@ int Download_Home()
*/ */
int Upload_Home() int Upload_Home()
{ {
DIR *dirp; char *temp, *arc;
struct dirent *dp; int rc = 0, Count = 0;
char *File, *sFileName, *temp, *arc; up_list *up = NULL, *tmpf;
time_t ElapstimeStart, ElapstimeFin, iTime;
int err; WhosDoingWhat(UPLOAD, NULL);
struct stat statfile;
WhosDoingWhat(UPLOAD, NULL);
if (!ForceProtocol())
return 0;
File = calloc(PATH_MAX, sizeof(char));
sFileName = calloc(PATH_MAX, sizeof(char));
temp = calloc(PATH_MAX, sizeof(char)); temp = calloc(PATH_MAX, sizeof(char));
clear(); clear();
Enter(2); 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); rc = upload(&up);
if (chdir(temp)) {
WriteError("$Can't chdir to %s", temp);
free(File);
free(sFileName);
free(temp);
return 0;
}
sleep(2); if (rc) {
ElapstimeStart = time(NULL); Syslog('+', "Upload home failed, rc=%d", rc);
/*
* 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(); Home();
free(File);
free(sFileName);
free(temp);
return 1; return 1;
} }
Syslog('b', "Start checking uploaded files"); Syslog('b', "Start checking uploaded files");
Enter(2); Enter(2);
pout(CFG.UnderlineColourF, CFG.UnderlineColourB, (char *)"Checking your upload(s)"); pout(CFG.UnderlineColourF, CFG.UnderlineColourB, (char *)"Checking your upload(s)");
Enter(2); 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) != '.') { Syslog('b', "Checking upload %s", tmpf->filename);
stat(dp->d_name, &statfile); if ((arc = GetFileType(tmpf->filename)) == NULL) {
Syslog('+', "Uploaded \"%s\", %ld bytes", dp->d_name, statfile.st_size); /*
* 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) { /*
/* * MS-DOS executables are handled direct.
* If the filetype is unknown, it is probably */
* a textfile or so. Import it direct. if ((strcmp("EXE", arc) == 0) || (strcmp("COM", arc) == 0)) {
*/ if (!ScanDirect(basename(tmpf->filename))) {
Syslog('b', "Unknown file type"); ImportHome(basename(tmpf->filename));
ImportHome(dp->d_name); Count++;
}
} else { } else {
/* switch(ScanArchive(basename(tmpf->filename), arc)) {
* We figured out the type of the uploaded file. case 0: ImportHome(basename(tmpf->filename));
*/ Count++;
Syslog('b', "File type is %s", arc); break;
case 1: break;
/* case 2: break;
* MS-DOS executables are handled direct. case 3: /*
*/ * No valid unarchiver found, just import
if ((strcmp("EXE", arc) == 0) || (strcmp("COM", arc) == 0)) { */
if (!ScanDirect(dp->d_name)) ImportHome(basename(tmpf->filename));
ImportHome(dp->d_name); Count++;
} else { break;
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;
}
} }
} }
} }
} }
closedir(dirp);
Home(); Home();
ReadExitinfo(); ReadExitinfo();
exitinfo.Uploads++; exitinfo.Uploads += Count;
WriteExitinfo(); WriteExitinfo();
tidy_upload(&up);
Pause(); Pause();
free(File);
free(sFileName);
free(temp); free(temp);
return 1; return rc;
} }

View File

@ -759,20 +759,20 @@ char *GetFileType(char *fn)
/* /*
* Import file in area. Returns TRUE if successfull. * 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]; char *temp, *temp1, msg[81];
temp = calloc(PATH_MAX, sizeof(char)); temp = calloc(PATH_MAX, sizeof(char));
temp1 = calloc(PATH_MAX, sizeof(char)); temp1 = calloc(PATH_MAX, sizeof(char));
sprintf(temp, "%s/%s", area.Path, fn); sprintf(temp, "%s/%s", area.Path, basename(fn));
sprintf(temp1, "%s/%s/upl/%s", CFG.bbs_usersdir, exitinfo.Name, fn); sprintf(temp1, "%s", fn);
if ((file_mv(temp1, temp))) { if ((file_mv(temp1, temp))) {
WriteError("$Can't move %s to %s", fn, area.Path); WriteError("$Can't move %s to %s", fn, area.Path);
} else { } else {
chmod(temp, 0664); chmod(temp, 0664);
if (Addfile(fn, Area, fileid)) { if (Addfile(basename(fn), Area, fileid)) {
ReadExitinfo(); 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); 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(); WriteExitinfo();
free(temp); free(temp);
free(temp1); free(temp1);

View File

@ -20,7 +20,7 @@ char *GetFileType(char *);
void Home(void); void Home(void);
int ScanDirect(char *); int ScanDirect(char *);
int ScanArchive(char *, 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); unsigned long Quota(void);
void ImportHome(char *); void ImportHome(char *);

View File

@ -1011,10 +1011,10 @@ USHORT TOffline::TooOld (ULONG Restrict, class TMsgBase *Msg)
*/ */
void OLR_Upload(void) void OLR_Upload(void)
{ {
char *File, *temp, *Arc, Dirpath[PATH_MAX], Filename[81], msg[81]; char *File, *temp, *Arc, Dirpath[PATH_MAX], Filename[81];
time_t ElapstimeStart, ElapstimeFin, iTime; int rc = 0, RetVal = FALSE;
int err, RetVal = FALSE;
FILE *fp; FILE *fp;
up_list *up = NULL, *tmpf;
if (strlen(CFG.bbsid) == 0) { if (strlen(CFG.bbsid) == 0) {
PUTSTR((char *)"System configuration error, inform sysop"); PUTSTR((char *)"System configuration error, inform sysop");
@ -1029,57 +1029,17 @@ void OLR_Upload(void)
/* Offline Reader Upload */ /* Offline Reader Upload */
poutCR(LIGHTMAGENTA, BLACK, (char *)Language(439)); poutCR(LIGHTMAGENTA, BLACK, (char *)Language(439));
if (!ForceProtocol())
return;
File = calloc(PATH_MAX, sizeof(char)); File = calloc(PATH_MAX, sizeof(char));
temp = calloc(PATH_MAX, sizeof(char)); temp = calloc(PATH_MAX, sizeof(char));
Enter(1); 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 ((rc = upload(&up))) {
Syslog('+', "Upload failed, rc=%d", rc);
if (chdir(temp)) {
WriteError("$Can't chdir to %s", temp);
return; 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(); Home();
Enter(1);
sprintf(Dirpath, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); sprintf(Dirpath, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name);
sprintf(Filename, "%s.NEW", CFG.bbsid); sprintf(Filename, "%s.NEW", CFG.bbsid);
@ -1097,12 +1057,18 @@ void OLR_Upload(void)
if (RetVal == FALSE) { if (RetVal == FALSE) {
WriteError("Invalid OLR packed received"); 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 */ /* Invalid packet received */
pout(LIGHTRED, BLACK, (char *)Language(440)); pout(LIGHTRED, BLACK, (char *)Language(440));
Enter(2); Enter(2);
sleep(2); sleep(3);
return; return;
} }
tidy_upload(&up);
sprintf(File, "%s/%s", Dirpath, Filename); sprintf(File, "%s/%s", Dirpath, Filename);
Syslog('+', "Received OLR packet %s", File); Syslog('+', "Received OLR packet %s", File);
@ -1112,6 +1078,7 @@ void OLR_Upload(void)
poutCR(LIGHTRED, BLACK, (char *)Language(441)); poutCR(LIGHTRED, BLACK, (char *)Language(441));
Syslog('+', "Unknown compression type"); Syslog('+', "Unknown compression type");
Pause(); Pause();
unlink(File);
return; return;
} }
@ -1134,6 +1101,7 @@ void OLR_Upload(void)
/* Archiver not available */ /* Archiver not available */
poutCR(LIGHTRED, BLACK, (char *)Language(442)); poutCR(LIGHTRED, BLACK, (char *)Language(442));
Pause(); Pause();
unlink(File);
return; return;
} }
@ -1147,11 +1115,11 @@ void OLR_Upload(void)
Syslog('m', "Unarc %s", temp); Syslog('m', "Unarc %s", temp);
colour(CFG.HiliteF, CFG.HiliteB); 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) { if (rawport() != 0) {
WriteError("Unable to set raw mode"); WriteError("Unable to set raw mode");
} }
if (err) { if (rc) {
WriteError("$Failed %s", temp); WriteError("$Failed %s", temp);
/* ERROR */ /* ERROR */
poutCR(LIGHTRED, BLACK, (char *) Language(217)); poutCR(LIGHTRED, BLACK, (char *) Language(217));

View File

@ -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. * Upload files from the user.
* Returns: * Returns:
* 0 - All seems well * 0 - All seems well
* 1 - No transfer protocol selected. * 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. * If user has no default protocol, make sure he has one.
*/ */
@ -364,7 +392,91 @@ int upload(up_list *upload_list)
return 1; 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;
} }

View File

@ -27,18 +27,17 @@ typedef struct _down_list {
*/ */
typedef struct _up_list { typedef struct _up_list {
struct _up_list *next; struct _up_list *next;
char *remote; /* Remote filename */ char *filename; /* Filename */
char *local; /* Local filename */ unsigned long size; /* Filesize */
long cps; /* CPS after received */
unsigned success : 1; /* If received Ok. */
} up_list; } up_list;
int ForceProtocol(void);
void add_download(down_list **, char *, char *, long, unsigned long, int); int ForceProtocol(void);
void tidy_download(down_list **); void add_download(down_list **, char *, char *, long, unsigned long, int);
int download(down_list *); void tidy_download(down_list **);
int upload(up_list *); int download(down_list *);
void tidy_upload(up_list **);
int upload(up_list **);
#endif #endif