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