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

@@ -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;
}

View File

@@ -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);

View File

@@ -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 *);

View File

@@ -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));

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.
* 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;
}

View File

@@ -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