Changed to new modular upload function
This commit is contained in:
315
mbsebbs/file.c
315
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;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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 *);
|
||||
|
||||
|
@@ -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));
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user