|
|
1.1 root 1: /* upload.cpp */
2:
3: /* Synchronet file upload-related routines */
4:
1.1.1.2 ! root 5: /* $Id: upload.cpp,v 1.42 2004/10/21 08:43:33 rswindell Exp $ */
1.1 root 6:
7: /****************************************************************************
8: * @format.tab-size 4 (Plain Text/Source Code File Header) *
9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
10: * *
1.1.1.2 ! root 11: * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html *
1.1 root 12: * *
13: * This program is free software; you can redistribute it and/or *
14: * modify it under the terms of the GNU General Public License *
15: * as published by the Free Software Foundation; either version 2 *
16: * of the License, or (at your option) any later version. *
17: * See the GNU General Public License for more details: gpl.txt or *
18: * http://www.fsf.org/copyleft/gpl.html *
19: * *
20: * Anonymous FTP access to the most recent released source is available at *
21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
22: * *
23: * Anonymous CVS access to the development source and modification history *
24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
26: * (just hit return, no password is necessary) *
27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
28: * *
29: * For Synchronet coding style and modification guidelines, see *
30: * http://www.synchro.net/source.html *
31: * *
32: * You are encouraged to submit any modifications (preferably in Unix diff *
33: * format) via e-mail to [email protected] *
34: * *
35: * Note: If this box doesn't appear square, then you need to fix your tabs. *
36: ****************************************************************************/
37:
38: #include "sbbs.h"
39:
40: /****************************************************************************/
41: /* Adds file data in 'f' to DIR#.DAT and DIR#.IXB and updates user */
42: /* info for uploader. Must have .name, .desc and .dir fields filled prior */
43: /* to a call to this function. */
44: /* Returns 1 if file uploaded sucessfully, 0 if not. */
45: /****************************************************************************/
46: bool sbbs_t::uploadfile(file_t *f)
47: {
1.1.1.2 ! root 48: char path[MAX_PATH+1];
! 49: char str[MAX_PATH+1],fname[25];
! 50: char ext[F_EXBSIZE+1];
! 51: char desc[F_EXBSIZE+1];
! 52: char tmp[MAX_PATH+1];
! 53: int file;
! 54: uint i;
! 55: long length;
! 56: FILE* stream;
1.1 root 57:
1.1.1.2 ! root 58: // f->misc=0; Removed AUG-22-2001 - broken anonymous uploads
1.1 root 59: curdirnum=f->dir;
60: if(findfile(&cfg,f->dir,f->name)) {
61: errormsg(WHERE,ERR_CHK,f->name,f->dir);
1.1.1.2 ! root 62: return(0);
! 63: }
1.1 root 64: sprintf(path,"%s%s",f->altpath>0 && f->altpath<=cfg.altpaths
65: ? cfg.altpath[f->altpath-1]
66: : cfg.dir[f->dir]->path,unpadfname(f->name,fname));
1.1.1.2 ! root 67: sprintf(tmp,"%s%s",cfg.temp_dir,fname);
! 68: if(!fexistcase(path) && fexistcase(tmp))
! 69: mv(tmp,path,0);
! 70: if(!fexistcase(path)) {
1.1 root 71: bprintf(text[FileNotReceived],f->name);
1.1.1.2 ! root 72: sprintf(str,"%s attempted to upload %s to %s %s (Not received)"
! 73: ,useron.alias
! 74: ,f->name
1.1 root 75: ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname);
76: logline("U!",str);
1.1.1.2 ! root 77: return(0);
! 78: }
1.1 root 79: strcpy(tmp,f->name);
80: truncsp(tmp);
81: for(i=0;i<cfg.total_ftests;i++)
1.1.1.2 ! root 82: if(cfg.ftest[i]->ext[0]=='*' || !stricmp(tmp+9,cfg.ftest[i]->ext)) {
1.1 root 83: if(!chk_ar(cfg.ftest[i]->ar,&useron))
84: continue;
85: attr(LIGHTGRAY);
86: bputs(cfg.ftest[i]->workstr);
87:
1.1.1.2 ! root 88: sprintf(sbbsfilename,"SBBSFILENAME=%.64s",unpadfname(f->name,fname));
1.1 root 89: putenv(sbbsfilename);
90: sprintf(sbbsfiledesc,"SBBSFILEDESC=%.*s",LEN_FDESC,f->desc);
91: putenv(sbbsfiledesc);
1.1.1.2 ! root 92: sprintf(str,"%ssbbsfile.nam",cfg.node_dir);
1.1 root 93: if((stream=fopen(str,"w"))!=NULL) {
94: fwrite(fname,1,strlen(fname),stream);
1.1.1.2 ! root 95: fclose(stream);
! 96: }
! 97: sprintf(str,"%ssbbsfile.des",cfg.node_dir);
1.1 root 98: if((stream=fopen(str,"w"))!=NULL) {
99: fwrite(f->desc,1,strlen(f->desc),stream);
1.1.1.2 ! root 100: fclose(stream);
! 101: }
! 102: if(external(cmdstr(cfg.ftest[i]->cmd,path,f->desc,NULL),EX_OFFLINE)) {
1.1 root 103: bprintf(text[FileHadErrors],f->name,cfg.ftest[i]->ext);
104: if(SYSOP) {
1.1.1.2 ! root 105: if(!yesno(text[DeleteFileQ])) return(0);
! 106: }
1.1 root 107: remove(path);
1.1.1.2 ! root 108: sprintf(str,"%s attempted to upload %s to %s %s (%s Errors)"
! 109: ,useron.alias
! 110: ,f->name
1.1 root 111: ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname,cfg.ftest[i]->ext);
112: logline("U!",str);
1.1.1.2 ! root 113: return(0);
! 114: } else {
1.1 root 115: sprintf(str,"%ssbbsfile.nam",cfg.node_dir);
116: if((stream=fopen(str,"r"))!=NULL) {
117: if(fgets(str,128,stream)) {
118: truncsp(str);
119: padfname(str,f->name);
120: strcpy(tmp,f->name);
121: truncsp(tmp);
122: sprintf(path,"%s%s",f->altpath>0 && f->altpath<=cfg.altpaths
123: ? cfg.altpath[f->altpath-1] : cfg.dir[f->dir]->path
1.1.1.2 ! root 124: ,unpadfname(f->name,fname));
! 125: }
1.1 root 126: fclose(stream);
127: }
128: sprintf(str,"%ssbbsfile.des",cfg.node_dir);
129: if((stream=fopen(str,"r"))!=NULL) {
130: if(fgets(str,128,stream)) {
131: truncsp(str);
1.1.1.2 ! root 132: sprintf(f->desc,"%.*s",LEN_FDESC,str);
! 133: }
! 134: fclose(stream);
! 135: }
! 136: CRLF;
! 137: }
! 138: }
1.1 root 139:
140: if((length=flength(path))<=0L) {
141: bprintf(text[FileZeroLength],f->name);
142: remove(path);
1.1.1.2 ! root 143: sprintf(str,"%s attempted to upload %s to %s %s (Zero length)"
! 144: ,useron.alias
! 145: ,f->name
1.1 root 146: ,cfg.lib[cfg.dir[f->dir]->lib]->sname,cfg.dir[f->dir]->sname);
147: logline("U!",str);
1.1.1.2 ! root 148: return(0);
! 149: }
1.1 root 150: if(cfg.dir[f->dir]->misc&DIR_DIZ) {
151: for(i=0;i<cfg.total_fextrs;i++)
152: if(!stricmp(cfg.fextr[i]->ext,tmp+9) && chk_ar(cfg.fextr[i]->ar,&useron))
153: break;
154: if(i<cfg.total_fextrs) {
155: sprintf(str,"%sFILE_ID.DIZ",cfg.temp_dir);
1.1.1.2 ! root 156: if(fexistcase(str))
1.1 root 157: remove(str);
1.1.1.2 ! root 158: external(cmdstr(cfg.fextr[i]->cmd,path,"FILE_ID.DIZ",NULL),EX_OFFLINE);
! 159: if(!fexistcase(str)) {
! 160: sprintf(str,"%sDESC.SDI",cfg.temp_dir);
! 161: if(fexistcase(str))
! 162: remove(str);
! 163: external(cmdstr(cfg.fextr[i]->cmd,path,"DESC.SDI",NULL),EX_OFFLINE);
! 164: fexistcase(str);
! 165: }
1.1 root 166: if((file=nopen(str,O_RDONLY))!=-1) {
1.1.1.2 ! root 167: memset(ext,0,F_EXBSIZE+1);
! 168: read(file,ext,F_EXBSIZE);
! 169: for(i=F_EXBSIZE;i;i--)
! 170: if(ext[i-1]>' ')
1.1 root 171: break;
172: ext[i]=0;
173: if(!f->desc[0]) {
174: strcpy(desc,ext);
175: strip_exascii(desc);
1.1.1.2 ! root 176: prep_file_desc(desc);
1.1 root 177: for(i=0;desc[i];i++)
178: if(isalnum(desc[i]))
179: break;
1.1.1.2 ! root 180: sprintf(f->desc,"%.*s",LEN_FDESC,desc+i);
! 181: }
1.1 root 182: close(file);
183: remove(str);
1.1.1.2 ! root 184: f->misc|=FM_EXTDESC;
! 185: }
! 186: }
! 187: }
1.1 root 188:
1.1.1.2 ! root 189: if(!(cfg.dir[f->dir]->misc&DIR_NOSTAT)) {
! 190: logon_ulb+=length; /* Update 'this call' stats */
! 191: logon_uls++;
! 192: }
1.1 root 193: if(cfg.dir[f->dir]->misc&DIR_AONLY) /* Forced anonymous */
194: f->misc|=FM_ANON;
195: f->cdt=length;
196: f->dateuled=time(NULL);
197: f->timesdled=0;
198: f->datedled=0L;
199: f->opencount=0;
200: strcpy(f->uler,useron.alias);
201: bprintf(text[FileNBytesReceived],f->name,ultoac(length,tmp));
202: if(!f->desc[0])
203: sprintf(f->desc,"%.*s",LEN_FDESC,text[NoDescription]);
204: if(!addfiledat(&cfg,f))
205: return(0);
206:
207: if(f->misc&FM_EXTDESC)
1.1.1.2 ! root 208: putextdesc(&cfg,f->dir,f->datoffset,ext);
1.1 root 209:
1.1.1.2 ! root 210: sprintf(str,"%s uploaded %s to %s %s"
! 211: ,useron.alias
! 212: ,f->name,cfg.lib[cfg.dir[f->dir]->lib]->sname
1.1 root 213: ,cfg.dir[f->dir]->sname);
214: if(cfg.dir[f->dir]->upload_sem[0])
1.1.1.2 ! root 215: ftouch(cmdstr(cfg.dir[f->dir]->upload_sem,nulstr,nulstr,NULL));
1.1 root 216: logline("U+",str);
217: /**************************/
218: /* Update Uploader's Info */
219: /**************************/
220: useron.uls=(ushort)adjustuserrec(&cfg,useron.number,U_ULS,5,1);
221: useron.ulb=(ushort)adjustuserrec(&cfg,useron.number,U_ULB,10,length);
222: if(cfg.dir[f->dir]->up_pct && cfg.dir[f->dir]->misc&DIR_CDTUL) { /* credit for upload */
223: if(cfg.dir[f->dir]->misc&DIR_CDTMIN && cur_cps) /* Give min instead of cdt */
224: useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10
225: ,((ulong)(length*(cfg.dir[f->dir]->up_pct/100.0))/cur_cps)/60);
226: else
227: useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10
1.1.1.2 ! root 228: ,(ulong)(f->cdt*(cfg.dir[f->dir]->up_pct/100.0)));
! 229: }
1.1 root 230:
1.1.1.2 ! root 231: user_event(EVENT_UPLOAD);
1.1 root 232:
1.1.1.2 ! root 233: return(true);
1.1 root 234: }
235:
236: /****************************************************************************/
237: /* Uploads files */
238: /****************************************************************************/
1.1.1.2 ! root 239: bool sbbs_t::upload(uint dirnum)
1.1 root 240: {
1.1.1.2 ! root 241: char descbeg[25]={""},descend[25]={""}
1.1 root 242: ,fname[13],keys[256],ch,*p;
1.1.1.2 ! root 243: char str[MAX_PATH+1];
! 244: char path[MAX_PATH+1];
! 245: char spath[MAX_PATH+1];
1.1 root 246: char tmp[512];
247: time_t start,end;
248: uint i,j,k,destuser[MAX_USERXFER],destusers=0;
249: int file;
250: ulong space;
251: file_t f;
252: user_t user;
253: node_t node;
254:
1.1.1.2 ! root 255: /* Security Checks */
! 256: if(useron.rest&FLAG('U')) {
! 257: bputs(text[R_Upload]);
! 258: return(false);
! 259: }
! 260: if(dirnum==INVALID_DIR) {
! 261: bputs(text[CantUploadHere]);
! 262: return(false);
! 263: }
! 264: if(!chk_ar(cfg.dir[dirnum]->ul_ar,&useron)) {
! 265: bputs(dirnum==cfg.user_dir ? text[CantUploadToUser] :
! 266: dirnum==cfg.sysop_dir ? text[CantUploadToSysop] : text[CantUploadHere]);
! 267: return(false);
! 268: }
! 269: if(getfiles(&cfg,dirnum)>=cfg.dir[dirnum]->maxfiles) {
! 270: bputs(dirnum==cfg.user_dir ? text[UserDirFull] : text[DirFull]);
! 271: return(false);
! 272: }
! 273:
1.1 root 274: if(sys_status&SS_EVENT && online==ON_REMOTE && !dir_op(dirnum))
275: bprintf(text[UploadBeforeEvent],timeleft/60);
276: if(altul)
277: strcpy(path,cfg.altpath[altul-1]);
278: else
279: strcpy(path,cfg.dir[dirnum]->path);
280:
281:
282: /* get free disk space */
1.1.1.2 ! root 283: space=getfreediskspace(path,1024);
! 284: if(space<(ulong)cfg.min_dspace) {
1.1 root 285: bputs(text[LowDiskSpace]);
1.1.1.2 ! root 286: sprintf(str,"Diskspace is low: %s (%lu kilobytes)",path,space);
1.1 root 287: errorlog(str);
288: if(!dir_op(dirnum))
1.1.1.2 ! root 289: return(false);
! 290: }
1.1 root 291: bprintf(text[DiskNBytesFree],ultoac(space,tmp));
292:
293: f.dir=curdirnum=dirnum;
294: f.misc=0;
295: f.altpath=altul;
296: bputs(text[Filename]);
1.1.1.2 ! root 297: if(!getstr(fname,12,0) || strchr(fname,'?') || strchr(fname,'*')
1.1 root 298: || !checkfname(fname) || (trashcan(fname,"file") && !dir_op(dirnum))) {
299: if(fname[0])
300: bputs(text[BadFilename]);
1.1.1.2 ! root 301: return(false);
! 302: }
1.1 root 303: if(dirnum==cfg.sysop_dir)
304: sprintf(str,text[UploadToSysopDirQ],fname);
305: else if(dirnum==cfg.user_dir)
306: sprintf(str,text[UploadToUserDirQ],fname);
307: else
308: sprintf(str,text[UploadToCurDirQ],fname,cfg.lib[cfg.dir[dirnum]->lib]->sname
309: ,cfg.dir[dirnum]->sname);
1.1.1.2 ! root 310: if(!yesno(str)) return(false);
1.1 root 311: action=NODE_ULNG;
312: sprintf(str,"%s%s",path,fname);
1.1.1.2 ! root 313: if(fexistcase(str)) { /* File is on disk */
! 314: #ifdef _WIN32
! 315: GetShortPathName(str, spath, sizeof(spath));
! 316: #else
! 317: SAFECOPY(spath,str);
! 318: #endif
! 319: SAFECOPY(fname,getfname(spath));
1.1 root 320: if(!dir_op(dirnum) && online!=ON_LOCAL) { /* local users or sysops */
321: bprintf(text[FileAlreadyThere],fname);
1.1.1.2 ! root 322: return(false);
! 323: }
1.1 root 324: if(!yesno(text[FileOnDiskAddQ]))
1.1.1.2 ! root 325: return(false);
! 326: }
! 327: padfname(fname,f.name);
1.1 root 328: strcpy(str,cfg.dir[dirnum]->exts);
329: strcpy(tmp,f.name);
330: truncsp(tmp);
331: j=strlen(str);
332: for(i=0;i<j;i+=ch+1) { /* Check extension of upload with allowable exts */
333: p=strchr(str+i,',');
334: if(p!=NULL)
335: *p=0;
336: ch=strlen(str+i);
1.1.1.2 ! root 337: if(!stricmp(tmp+9,str+i))
! 338: break;
! 339: }
1.1 root 340: if(j && i>=j) {
341: bputs(text[TheseFileExtsOnly]);
342: bputs(cfg.dir[dirnum]->exts);
343: CRLF;
1.1.1.2 ! root 344: if(!dir_op(dirnum)) return(false);
! 345: }
1.1 root 346: bputs(text[SearchingForDupes]);
1.1.1.2 ! root 347: if(findfile(&cfg,dirnum,f.name)) {
! 348: bputs(text[SearchedForDupes]);
! 349: bprintf(text[FileAlreadyOnline],fname);
! 350: return(false); /* File is already in database */
! 351: }
! 352: for(i=k=0;i<usrlibs;i++) {
1.1 root 353: for(j=0;j<usrdirs[i];j++,k++) {
354: outchar('.');
355: if(k && !(k%5))
356: bputs("\b\b\b\b\b \b\b\b\b\b");
1.1.1.2 ! root 357: if(usrdir[i][j]==dirnum)
! 358: continue; /* we already checked this dir */
! 359: if(cfg.dir[usrdir[i][j]]->misc&DIR_DUPES
1.1 root 360: && findfile(&cfg,usrdir[i][j],f.name)) {
361: bputs(text[SearchedForDupes]);
1.1.1.2 ! root 362: bprintf(text[FileAlreadyOnline],fname);
1.1 root 363: if(!dir_op(dirnum))
1.1.1.2 ! root 364: return(false); /* File is in database for another dir */
! 365: }
! 366: }
! 367: }
1.1 root 368: bputs(text[SearchedForDupes]);
369: if(dirnum==cfg.user_dir) { /* User to User transfer */
370: bputs(text[EnterAfterLastDestUser]);
371: while((!dir_op(dirnum) && destusers<cfg.max_userxfer) || destusers<MAX_USERXFER) {
372: bputs(text[SendFileToUser]);
1.1.1.2 ! root 373: if(!getstr(str,LEN_ALIAS,cfg.uq&UQ_NOUPRLWR ? K_NONE:K_UPRLWR))
1.1 root 374: break;
375: if((user.number=finduser(str))!=0) {
376: if(!dir_op(dirnum) && user.number==useron.number) {
377: bputs(text[CantSendYourselfFiles]);
1.1.1.2 ! root 378: continue;
! 379: }
1.1 root 380: for(i=0;i<destusers;i++)
381: if(user.number==destuser[i])
382: break;
383: if(i<destusers) {
384: bputs(text[DuplicateUser]);
1.1.1.2 ! root 385: continue;
! 386: }
1.1 root 387: getuserdat(&cfg,&user);
388: if((user.rest&(FLAG('T')|FLAG('D')))
389: || !chk_ar(cfg.lib[cfg.dir[cfg.user_dir]->lib]->ar,&user)
390: || !chk_ar(cfg.dir[cfg.user_dir]->dl_ar,&user)) {
1.1.1.2 ! root 391: bprintf(text[UserWontBeAbleToDl],user.alias);
! 392: } else {
1.1 root 393: bprintf(text[UserAddedToDestList],user.alias);
1.1.1.2 ! root 394: destuser[destusers++]=user.number;
! 395: }
! 396: }
1.1 root 397: else {
1.1.1.2 ! root 398: CRLF;
! 399: }
! 400: }
1.1 root 401: if(!destusers)
1.1.1.2 ! root 402: return(false);
! 403: }
1.1 root 404: if(cfg.dir[dirnum]->misc&DIR_RATE) {
405: SYNC;
406: bputs(text[RateThisFile]);
407: ch=getkey(K_ALPHA);
408: if(!isalpha(ch) || sys_status&SS_ABORT)
1.1.1.2 ! root 409: return(false);
1.1 root 410: CRLF;
1.1.1.2 ! root 411: sprintf(descbeg,text[Rated],toupper(ch));
! 412: }
1.1 root 413: if(cfg.dir[dirnum]->misc&DIR_ULDATE) {
414: now=time(NULL);
415: if(descbeg[0])
416: strcat(descbeg," ");
417: sprintf(str,"%s ",unixtodstr(&cfg,now,tmp));
1.1.1.2 ! root 418: strcat(descbeg,str);
! 419: }
1.1 root 420: if(cfg.dir[dirnum]->misc&DIR_MULT) {
421: SYNC;
422: if(!noyes(text[MultipleDiskQ])) {
423: bputs(text[HowManyDisksTotal]);
424: if((int)(i=getnum(99))<2)
1.1.1.2 ! root 425: return(false);
1.1 root 426: bputs(text[NumberOfFile]);
427: if((int)(j=getnum(i))<1)
1.1.1.2 ! root 428: return(false);
1.1 root 429: if(j==1)
430: upload_lastdesc[0]=0;
431: if(i>9)
432: sprintf(descend,text[FileOneOfTen],j,i);
433: else
1.1.1.2 ! root 434: sprintf(descend,text[FileOneOfTwo],j,i);
! 435: } else
! 436: upload_lastdesc[0]=0;
! 437: }
1.1 root 438: else
439: upload_lastdesc[0]=0;
440: bputs(text[EnterDescNow]);
441: i=LEN_FDESC-(strlen(descbeg)+strlen(descend));
442: getstr(upload_lastdesc,i,K_LINE|K_EDIT|K_AUTODEL);
443: if(sys_status&SS_ABORT)
1.1.1.2 ! root 444: return(false);
1.1 root 445: if(descend[0]) /* end of desc specified, so pad desc with spaces */
446: sprintf(f.desc,"%s%-*s%s",descbeg,i,upload_lastdesc,descend);
447: else /* no end specified, so string ends at desc end */
448: sprintf(f.desc,"%s%s",descbeg,upload_lastdesc);
449:
450: if(cfg.dir[dirnum]->misc&DIR_ANON && !(cfg.dir[dirnum]->misc&DIR_AONLY)
451: && (dir_op(dirnum) || useron.exempt&FLAG('A'))) {
452: if(!noyes(text[AnonymousQ]))
1.1.1.2 ! root 453: f.misc|=FM_ANON;
! 454: }
1.1 root 455: sprintf(str,"%s%s",path,fname);
1.1.1.2 ! root 456: if(fexistcase(str)) { /* File is on disk */
1.1 root 457: if(!uploadfile(&f))
1.1.1.2 ! root 458: return(false);
! 459: } else {
! 460: xfer_prot_menu(XFER_UPLOAD);
1.1 root 461: SYNC;
462: strcpy(keys,"Q");
463: if(dirnum==cfg.user_dir || !cfg.max_batup) /* no batch user to user xfers */
464: mnemonics(text[ProtocolOrQuit]);
465: else {
466: mnemonics(text[ProtocolBatchOrQuit]);
1.1.1.2 ! root 467: strcat(keys,"B");
! 468: }
1.1 root 469: for(i=0;i<cfg.total_prots;i++)
470: if(cfg.prot[i]->ulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) {
471: sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
1.1.1.2 ! root 472: strcat(keys,tmp);
! 473: }
1.1 root 474: ch=(char)getkeys(keys,0);
475: if(ch=='Q')
1.1.1.2 ! root 476: return(false);
1.1 root 477: if(ch=='B') {
478: if(batup_total>=cfg.max_batup)
479: bputs(text[BatchUlQueueIsFull]);
480: else {
481: for(i=0;i<batup_total;i++)
482: if(!strcmp(batup_name[i],f.name)) {
1.1.1.2 ! root 483: bprintf(text[FileAlreadyInQueue],fname);
! 484: return(false);
! 485: }
1.1 root 486: strcpy(batup_name[batup_total],f.name);
487: strcpy(batup_desc[batup_total],f.desc);
488: batup_dir[batup_total]=dirnum;
489: batup_misc[batup_total]=f.misc;
490: batup_alt[batup_total]=altul;
491: batup_total++;
492: bprintf(text[FileAddedToUlQueue]
1.1.1.2 ! root 493: ,fname,batup_total,cfg.max_batup);
! 494: }
! 495: } else {
1.1 root 496: for(i=0;i<cfg.total_prots;i++)
497: if(cfg.prot[i]->ulcmd[0] && cfg.prot[i]->mnemonic==ch
498: && chk_ar(cfg.prot[i]->ar,&useron))
499: break;
500: if(i<cfg.total_prots) {
501: start=time(NULL);
1.1.1.2 ! root 502: protocol(cfg.prot[i],XFER_UPLOAD,str,nulstr,true);
1.1 root 503: end=time(NULL);
504: if(!(cfg.dir[dirnum]->misc&DIR_ULTIME)) /* Don't deduct upload time */
505: starttime+=end-start;
506: ch=uploadfile(&f);
507: autohangup();
508: if(!ch) /* upload failed, don't process user to user xfer */
1.1.1.2 ! root 509: return(false);
! 510: }
! 511: }
! 512: }
1.1 root 513: if(dirnum==cfg.user_dir) { /* Add files to XFER.IXT in INDX dir */
514: sprintf(str,"%sxfer.ixt",cfg.data_dir);
515: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
516: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
1.1.1.2 ! root 517: return(false);
! 518: }
1.1 root 519: for(j=0;j<destusers;j++) {
520: for(i=1;i<=cfg.sys_nodes;i++) { /* Tell user, if online */
521: getnodedat(i,&node,0);
522: if(node.useron==destuser[j] && !(node.misc&NODE_POFF)
523: && (node.status==NODE_INUSE || node.status==NODE_QUIET)) {
524: sprintf(str,text[UserToUserXferNodeMsg],cfg.node_num,useron.alias);
1.1.1.2 ! root 525: putnmsg(&cfg,i,str);
! 526: break;
! 527: }
! 528: }
1.1 root 529: if(i>cfg.sys_nodes) { /* User not online */
530: sprintf(str,text[UserSentYouFile],useron.alias);
1.1.1.2 ! root 531: putsmsg(&cfg,destuser[j],str);
! 532: }
1.1 root 533: sprintf(str,"%4.4u %12.12s %4.4u\r\n"
534: ,destuser[j],f.name,useron.number);
1.1.1.2 ! root 535: write(file,str,strlen(str));
! 536: }
1.1 root 537: close(file);
538: }
1.1.1.2 ! root 539: return(true);
1.1 root 540: }
541:
542: /****************************************************************************/
543: /* Checks directory for 'dir' and prompts user to enter description for */
544: /* the files that aren't in the database. */
545: /* Returns 1 if the user aborted, 0 if not. */
546: /****************************************************************************/
547: bool sbbs_t::bulkupload(uint dirnum)
548: {
1.1.1.2 ! root 549: char str[MAX_PATH+1];
! 550: char path[MAX_PATH+1];
! 551: char spath[MAX_PATH+1];
1.1 root 552: file_t f;
553: DIR* dir;
554: DIRENT* dirent;
555:
556: memset(&f,0,sizeof(file_t));
557: f.dir=dirnum;
558: f.altpath=altul;
559: bprintf(text[BulkUpload],cfg.lib[cfg.dir[dirnum]->lib]->sname,cfg.dir[dirnum]->sname);
560: strcpy(path,altul>0 && altul<=cfg.altpaths ? cfg.altpath[altul-1]
561: : cfg.dir[dirnum]->path);
562: action=NODE_ULNG;
563: SYNC;
564: dir=opendir(path);
1.1.1.2 ! root 565: while(dir!=NULL && (dirent=readdir(dir))!=NULL && !msgabort()) {
! 566: if(getfiles(&cfg,dirnum)>=cfg.dir[dirnum]->maxfiles) {
1.1 root 567: bputs(text[DirFull]);
568: break;
569: }
570: sprintf(str,"%s%s",path,dirent->d_name);
571: if(isdir(str))
572: continue;
573: #ifdef _WIN32
574: GetShortPathName(str,spath,sizeof(spath));
575: #else
576: strcpy(spath,str);
577: #endif
578: padfname(getfname(spath),str);
579:
580: if(findfile(&cfg,f.dir,str)==0) {
581: strcpy(f.name,str);
582: f.cdt=flength(spath);
1.1.1.2 ! root 583: bprintf(text[BulkUploadDescPrompt],f.name,f.cdt/1024);
1.1 root 584: getstr(f.desc,LEN_FDESC,K_LINE);
585: if(sys_status&SS_ABORT)
586: break;
587: uploadfile(&f);
588: }
589: }
1.1.1.2 ! root 590: if(dir!=NULL)
! 591: closedir(dir);
1.1 root 592: if(sys_status&SS_ABORT)
593: return(true);
594: return(false);
595: }
596:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.