From 1ddd81ef80bdc51b250634fc02877099d5cee003 Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Fri, 5 Nov 2004 22:10:28 +0000 Subject: [PATCH] Added first part of new download code --- mbsebbs/Makefile | 2 +- mbsebbs/transfer.c | 185 +++++++++++++++++++++++++++++++++++++++++++-- mbsebbs/transfer.h | 3 + 3 files changed, 184 insertions(+), 6 deletions(-) diff --git a/mbsebbs/Makefile b/mbsebbs/Makefile index 18115dee..4354a2c3 100644 --- a/mbsebbs/Makefile +++ b/mbsebbs/Makefile @@ -109,7 +109,7 @@ newuser.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h funcs.h inp pinfo.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h pinfo.h input.h term.h ttyio.h timecheck.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h timecheck.h funcs.h bye.h exitinfo.h language.h input.h term.h ttyio.h change.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h change.h dispfile.h funcs.h input.h language.h misc.h timeout.h exitinfo.h bye.h term.h ttyio.h -transfer.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h transfer.h change.h +transfer.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h transfer.h change.h whoson.h funcs.h term.h ttyio.h filesub.h language.h openport.h timeout.h exitinfo.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h funcs.h input.h language.h oneline.h misc.h bye.h timeout.h timecheck.h exitinfo.h mbsebbs.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h ../lib/msg.h mbsebbs.h user.h dispfile.h language.h menu.h misc.h bye.h timeout.h funcs.h term.h ttyio.h openport.h menu.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h oneline.h mail.h bbslist.h change.h chat.h file.h funcs.h input.h misc.h timeout.h menu.h page.h pinfo.h bye.h timecheck.h whoson.h language.h offline.h email.h door.h dispfile.h userlist.h timestats.h logentry.h morefile.h lastcallers.h signature.h term.h ttyio.h diff --git a/mbsebbs/transfer.c b/mbsebbs/transfer.c index 251db0fc..22bf759b 100644 --- a/mbsebbs/transfer.c +++ b/mbsebbs/transfer.c @@ -34,6 +34,15 @@ #include "../lib/users.h" #include "transfer.h" #include "change.h" +#include "whoson.h" +#include "funcs.h" +#include "term.h" +#include "ttyio.h" +#include "filesub.h" +#include "language.h" +#include "openport.h" +#include "timeout.h" + /* @@ -83,12 +92,18 @@ int ForceProtocol() * Download files to the user. * Returns: * 0 - All seems well - * 1 - No tranfer protocol selected + * 1 - No transfer protocol selected + * 2 - No files to download. */ int download(down_list *download_list) { - down_list *tmpf; - int rc, maxrc = 0; + down_list *tmpf; + int err, maxrc = 0, Count = 0; + char *temp, *symTo, *symFrom; + unsigned long Size = 0; + time_t ElapstimeStart, ElapstimeFin, iTime; + struct dirent *dp; + DIR *dirp; /* * If user has no default protocol, make sure he has one. @@ -97,10 +112,170 @@ int download(down_list *download_list) return 1; } - for (tmpf = download_list; tmpf && (maxrc < 2); tmpf = tmpf->next) { + /* + * Clean users tag directory. + */ + WhosDoingWhat(DOWNLOAD, NULL); + temp = calloc(PATH_MAX, sizeof(char)); + sprintf(temp, "-rf %s/%s/tag", CFG.bbs_usersdir, exitinfo.Name); + execute_pth((char *)"rm", temp, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null"); + sprintf(temp, "%s/%s/tag", CFG.bbs_usersdir, exitinfo.Name); + CheckDir(temp); + + symTo = calloc(PATH_MAX, sizeof(char)); + symFrom = calloc(PATH_MAX, sizeof(char)); + + /* + * Build symlinks into the users tag directory. + */ + chdir("./tag"); + for (tmpf = download_list; tmpf; tmpf = tmpf->next) { + if (!tmpf->sent && !tmpf->failed) { + unlink(tmpf->remote); + sprintf(symFrom, "%s", tmpf->remote); + sprintf(symTo, "%s", tmpf->local); + if (symlink(symTo, symFrom)) { + WriteError("$Can't create symlink %s %s %d", symTo, symFrom, errno); + tmpf->failed = TRUE; + } else { + Syslog('b', "Created symlink %s -> %s", symFrom, symTo); + } + if ((access(symFrom, R_OK)) != 0) { + /* + * Extra check, is symlink really there? + */ + WriteError("Symlink %s check failed, unmarking download", symFrom); + tmpf->failed = TRUE; + } else { + Count++; + Size += tmpf->size; + } + } + } + Home(); + + if (!Count) { + /* + * Nothing to download + */ + free(temp); + free(symTo); + free(symFrom); + return 2; } - return 0; + clear(); + /* File(s) : */ + pout(YELLOW, BLACK, (char *) Language(349)); sprintf(temp, "%d", Count); PUTSTR(temp); Enter(1); + /* Size : */ + pout( CYAN, BLACK, (char *) Language(350)); sprintf(temp, "%lu", Size); PUTSTR(temp); Enter(1); + /* Protocol : */ + pout( CYAN, BLACK, (char *) Language(351)); sprintf(temp, "%s", sProtName); PUTSTR(temp); Enter(1); + + Syslog('+', "Download tagged files start, protocol: %s", sProtName); + + PUTSTR(sProtAdvice); + Enter(2); + + /* + * Wait a while before download + */ + sleep(2); + + if (uProtInternal) { + for (tmpf = download_list; tmpf && (maxrc < 2); tmpf = tmpf->next) { + } + } else { + ElapstimeStart = time(NULL); + + /* + * Transfer the files. Set the Client/Server time at the maximum + * time the user has plus 10 minutes. The overall timer 10 seconds + * less. Not a nice but working solution. + */ + alarm_set(((exitinfo.iTimeLeft + 10) * 60) - 10); + Altime((exitinfo.iTimeLeft + 10) * 60); + + sprintf(temp, "%s/%s/tag", CFG.bbs_usersdir, exitinfo.Name); + if ((dirp = opendir(temp)) == NULL) { + WriteError("$Download: Can't open dir: %s", temp); + free(temp); + } else { + chdir(temp); + free(temp); + temp = NULL; + while ((dp = readdir(dirp)) != NULL ) { + if (*(dp->d_name) != '.') { + if (temp != NULL) { + temp = xstrcat(temp, (char *)" "); + temp = xstrcat(temp, dp->d_name); + } else { + temp = xstrcpy(dp->d_name); + } + } + } + if (temp != NULL) { + if ((err = execute_str(sProtDn, temp, NULL, NULL, NULL, NULL))) { + WriteError("$Download error %d, prot: %s", err, sProtDn); + } + /* + * Restore rawport + */ + rawport(); + free(temp); + } else { + WriteError("No filebatch created"); + } + closedir(dirp); + } + Altime(0); + alarm_off(); + alarm_on(); + Home(); + ElapstimeFin = time(NULL); + + /* + * Get time from Before Download and After Download to get + * download time, if the time is zero, it will be one. + */ + iTime = ElapstimeFin - ElapstimeStart; + if (!iTime) + iTime = 1; + /* + * Checking the successfull sent files, they are missing from + * the ./tag directory. Failed files are still there. + */ + Count = Size = 0; + + for (tmpf = download_list; tmpf && (maxrc < 2); tmpf = tmpf->next) { + if (!tmpf->sent && !tmpf->failed) { + sprintf(symTo, "./tag/%s", tmpf->remote); + /* + * If symlink is gone the file is sent. + */ + if ((access(symTo, R_OK)) != 0) { + Syslog('+', "File %s from area %d sent ok", tmpf->remote, tmpf->area); + tmpf->sent = TRUE; + Size += tmpf->size; + Count++; + } else { + Syslog('+', "Failed to sent %s from area %d", Tag.LFile, Tag.Area); + } + } + } + + /* + * Work out transfer rate in seconds by dividing the + * Size of the File by the amount of time it took to download + * the file. + */ + Syslog('+', "Download time %ld seconds (%lu cps), %d files", iTime, Size / iTime, Count); + } + + free(symTo); + free(symFrom); + + return maxrc; } diff --git a/mbsebbs/transfer.h b/mbsebbs/transfer.h index f27af66e..3bcad5c2 100644 --- a/mbsebbs/transfer.h +++ b/mbsebbs/transfer.h @@ -13,12 +13,15 @@ typedef struct _down_list { char *local; /* Local filename */ char *remote; /* Remove filename */ long cps; /* CPS after sent */ + long area; /* File area or 0 */ unsigned long size; /* File size */ unsigned kfs : 1; /* Kill File Sent */ unsigned sent : 1; /* File is Sent */ + unsigned failed : 1; /* Transfer failed */ } down_list; + /* * List of uploaded files. */