|
|
1.1 ! root 1: /* execfile.cpp */ ! 2: ! 3: /* Synchronet file transfer-related command shell/module routines */ ! 4: ! 5: /* $Id: execfile.cpp,v 1.2 2000/11/04 12:03:50 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 2000 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: #include "cmdshell.h" ! 40: ! 41: int sbbs_t::execfile(csi_t *csi) ! 42: { ! 43: char str[256],ch; ! 44: int s; ! 45: uint i,j,x,y; ! 46: file_t f; ! 47: ! 48: switch(*(csi->ip++)) { ! 49: ! 50: case CS_FILE_SELECT_AREA: ! 51: csi->logic=LOGIC_FALSE; ! 52: if(!usrlibs) return(0); ! 53: while(online) { ! 54: j=0; ! 55: if(usrlibs>1) { ! 56: sprintf(str,"%smenu/libs.*", cfg.text_dir); ! 57: if(fexist(str)) ! 58: menu("libs"); ! 59: else { ! 60: bputs(text[CfgLibLstHdr]); ! 61: for(i=0;i<usrlibs && !msgabort();i++) { ! 62: if(i==curlib) ! 63: outchar('*'); ! 64: else outchar(SP); ! 65: if(i<9) outchar(SP); ! 66: if(i<99) outchar(SP); ! 67: bprintf(text[CfgLibLstFmt] ! 68: ,i+1,cfg.lib[usrlib[i]]->lname); } } ! 69: sprintf(str,text[JoinWhichLib],curlib+1); ! 70: mnemonics(str); ! 71: j=getnum(usrlibs); ! 72: if((int)j==-1) ! 73: return(0); ! 74: if(!j) ! 75: j=curlib; ! 76: else ! 77: j--; } ! 78: sprintf(str,"%smenu/dirs%u.*", cfg.text_dir, usrlib[j]+1); ! 79: if(fexist(str)) { ! 80: sprintf(str,"dirs%u",usrlib[j]+1); ! 81: menu(str); } ! 82: else { ! 83: CLS; ! 84: bprintf(text[DirLstHdr], cfg.lib[usrlib[j]]->lname); ! 85: for(i=0;i<usrdirs[j] && !msgabort();i++) { ! 86: if(i==curdir[j]) outchar('*'); ! 87: else outchar(SP); ! 88: sprintf(str,text[DirLstFmt],i+1 ! 89: ,cfg.dir[usrdir[j][i]]->lname,nulstr ! 90: ,getfiles(usrdir[j][i])); ! 91: if(i<9) outchar(SP); ! 92: if(i<99) outchar(SP); ! 93: bputs(str); } } ! 94: sprintf(str,text[JoinWhichDir],curdir[j]+1); ! 95: mnemonics(str); ! 96: i=getnum(usrdirs[j]); ! 97: if((int)i==-1) { ! 98: if(usrlibs==1) ! 99: return(0); ! 100: continue; } ! 101: if(!i) ! 102: i=curdir[j]; ! 103: else ! 104: i--; ! 105: curlib=j; ! 106: curdir[curlib]=i; ! 107: csi->logic=LOGIC_TRUE; ! 108: return(0); } ! 109: return(0); ! 110: ! 111: case CS_FILE_GET_DIR_NUM: ! 112: ! 113: if(useron.misc&COLDKEYS) { ! 114: i=atoi(csi->str); ! 115: if(i && i<=usrdirs[curlib] && usrlibs) ! 116: curdir[curlib]=i-1; ! 117: return(0); } ! 118: ! 119: ch=getkey(K_UPPER); ! 120: outchar(ch); ! 121: if((ch&0xf)*10U<=usrdirs[curlib] && (ch&0xf) && usrlibs) { ! 122: i=(ch&0xf)*10; ! 123: ch=getkey(K_UPPER); ! 124: if(!isdigit(ch) && ch!=CR) { ! 125: ungetkey(ch); ! 126: curdir[curlib]=(i/10)-1; ! 127: return(0); } ! 128: outchar(ch); ! 129: if(ch==CR) { ! 130: curdir[curlib]=(i/10)-1; ! 131: return(0); } ! 132: logch(ch,0); ! 133: i+=ch&0xf; ! 134: if(i*10<=usrdirs[curlib]) { /* 100+ dirs */ ! 135: i*=10; ! 136: ch=getkey(K_UPPER); ! 137: if(!isdigit(ch) && ch!=CR) { ! 138: ungetkey(ch); ! 139: curdir[curlib]=(i/10)-1; ! 140: return(0); } ! 141: outchar(ch); ! 142: if(ch==CR) { ! 143: curdir[curlib]=(i/10)-1; ! 144: return(0); } ! 145: logch(ch,0); ! 146: i+=ch&0xf; } ! 147: if(i<=usrdirs[curlib]) ! 148: curdir[curlib]=i-1; ! 149: return(0); } ! 150: if((ch&0xf)<=(int)usrdirs[curlib] && (ch&0xf) && usrlibs) ! 151: curdir[curlib]=(ch&0xf)-1; ! 152: return(0); ! 153: ! 154: case CS_FILE_GET_LIB_NUM: ! 155: ! 156: if(useron.misc&COLDKEYS) { ! 157: i=atoi(csi->str); ! 158: if(i && i<=usrlibs) ! 159: curlib=i-1; ! 160: return(0); } ! 161: ! 162: ch=getkey(K_UPPER); ! 163: outchar(ch); ! 164: if((ch&0xf)*10U<=usrlibs && (ch&0xf)) { ! 165: i=(ch&0xf)*10; ! 166: ch=getkey(K_UPPER); ! 167: if(!isdigit(ch) && ch!=CR) { ! 168: ungetkey(ch); ! 169: curlib=(i/10)-1; ! 170: return(0); } ! 171: outchar(ch); ! 172: if(ch==CR) { ! 173: curlib=(i/10)-1; ! 174: return(0); } ! 175: logch(ch,0); ! 176: i+=ch&0xf; ! 177: if(i<=usrlibs) ! 178: curlib=i-1; ! 179: return(0); } ! 180: if((ch&0xf)<=(int)usrlibs && (ch&0xf)) ! 181: curlib=(ch&0xf)-1; ! 182: return(0); ! 183: ! 184: case CS_FILE_SHOW_LIBRARIES: ! 185: if(!usrlibs) return(0); ! 186: sprintf(str,"%smenu/libs.*", cfg.text_dir); ! 187: if(fexist(str)) { ! 188: menu("libs"); ! 189: return(0); } ! 190: bputs(text[LibLstHdr]); ! 191: for(i=0;i<usrlibs && !msgabort();i++) { ! 192: if(i==curlib) ! 193: outchar('*'); ! 194: else outchar(SP); ! 195: if(i<9) outchar(SP); ! 196: bprintf(text[LibLstFmt],i+1 ! 197: ,cfg.lib[usrlib[i]]->lname,nulstr,usrdirs[i]); } ! 198: return(0); ! 199: ! 200: case CS_FILE_SHOW_DIRECTORIES: ! 201: if(!usrlibs) return(0); ! 202: sprintf(str,"%smenu/dirs%u.*", cfg.text_dir, usrlib[curlib]+1); ! 203: if(fexist(str)) { ! 204: sprintf(str,"dirs%u",usrlib[curlib]+1); ! 205: menu(str); ! 206: return(0); } ! 207: CRLF; ! 208: bprintf(text[DirLstHdr],cfg.lib[usrlib[curlib]]->lname); ! 209: for(i=0;i<usrdirs[curlib] && !msgabort();i++) { ! 210: if(i==curdir[curlib]) outchar('*'); ! 211: else outchar(SP); ! 212: sprintf(str,text[DirLstFmt],i+1 ! 213: ,cfg.dir[usrdir[curlib][i]]->lname,nulstr ! 214: ,getfiles(usrdir[curlib][i])); ! 215: if(i<9) outchar(SP); ! 216: if(i<99) outchar(SP); ! 217: bputs(str); } ! 218: return(0); ! 219: ! 220: case CS_FILE_LIBRARY_UP: ! 221: curlib++; ! 222: if(curlib>=usrlibs) ! 223: curlib=0; ! 224: return(0); ! 225: case CS_FILE_LIBRARY_DOWN: ! 226: if(!curlib) ! 227: curlib=usrlibs-1; ! 228: else curlib--; ! 229: return(0); ! 230: case CS_FILE_DIRECTORY_UP: ! 231: if(!usrlibs) return(0); ! 232: curdir[curlib]++; ! 233: if(curdir[curlib]>=usrdirs[curlib]) ! 234: curdir[curlib]=0; ! 235: return(0); ! 236: case CS_FILE_DIRECTORY_DOWN: ! 237: if(!usrlibs) return(0); ! 238: if(!curdir[curlib]) ! 239: curdir[curlib]=usrdirs[curlib]-1; ! 240: else curdir[curlib]--; ! 241: return(0); ! 242: case CS_FILE_SET_AREA: ! 243: csi->logic=LOGIC_TRUE; ! 244: for(i=0;i<usrlibs;i++) ! 245: for(j=0;j<usrdirs[i];j++) ! 246: if(!stricmp(csi->str,cfg.dir[usrdir[i][j]]->code)) { ! 247: curlib=i; ! 248: curdir[i]=j; ! 249: return(0); } ! 250: csi->logic=LOGIC_FALSE; ! 251: return(0); ! 252: case CS_FILE_SET_LIBRARY: ! 253: csi->logic=LOGIC_TRUE; ! 254: for(i=0;i<usrlibs;i++) ! 255: if(!stricmp(cfg.lib[usrlib[i]]->sname,csi->str)) ! 256: break; ! 257: if(i<usrlibs) ! 258: curlib=i; ! 259: else ! 260: csi->logic=LOGIC_FALSE; ! 261: return(0); ! 262: ! 263: case CS_FILE_UPLOAD: ! 264: csi->logic=LOGIC_FALSE; ! 265: if(useron.rest&FLAG('U')) { ! 266: bputs(text[R_Upload]); ! 267: return(0); } ! 268: if(usrlibs) { ! 269: i=usrdir[curlib][curdir[curlib]]; ! 270: if(cfg.upload_dir!=INVALID_DIR ! 271: && !chk_ar(cfg.dir[i]->ul_ar,&useron)) ! 272: i=cfg.upload_dir; } ! 273: else ! 274: i=cfg.upload_dir; ! 275: ! 276: if((uint)i==INVALID_DIR || !chk_ar(cfg.dir[i]->ul_ar,&useron)) { ! 277: bputs(text[CantUploadHere]); ! 278: return(0); } ! 279: ! 280: if(gettotalfiles(i)>=cfg.dir[i]->maxfiles) ! 281: bputs(text[DirFull]); ! 282: else { ! 283: upload(i); ! 284: csi->logic=LOGIC_TRUE; } ! 285: return(0); ! 286: case CS_FILE_UPLOAD_USER: ! 287: csi->logic=LOGIC_FALSE; ! 288: if(cfg.user_dir==INVALID_DIR) { ! 289: bputs(text[NoUserDir]); ! 290: return(0); } ! 291: if(gettotalfiles(cfg.user_dir)>=cfg.dir[cfg.user_dir]->maxfiles) ! 292: bputs(text[UserDirFull]); ! 293: else if(useron.rest&FLAG('U')) ! 294: bputs(text[R_Upload]); ! 295: else if(!chk_ar(cfg.dir[cfg.user_dir]->ul_ar,&useron)) ! 296: bputs(text[CantUploadToUser]); ! 297: else { ! 298: upload(cfg.user_dir); ! 299: csi->logic=LOGIC_TRUE; } ! 300: return(0); ! 301: case CS_FILE_UPLOAD_SYSOP: ! 302: csi->logic=LOGIC_FALSE; ! 303: if(cfg.sysop_dir==INVALID_DIR) { ! 304: bputs(text[NoSysopDir]); ! 305: return(0); } ! 306: if(gettotalfiles(cfg.sysop_dir)>=cfg.dir[cfg.sysop_dir]->maxfiles) ! 307: bputs(text[DirFull]); ! 308: else if(useron.rest&FLAG('U')) ! 309: bputs(text[R_Upload]); ! 310: else if(!chk_ar(cfg.dir[cfg.sysop_dir]->ul_ar,&useron)) ! 311: bputs(text[CantUploadToSysop]); ! 312: else { ! 313: upload(cfg.sysop_dir); ! 314: csi->logic=LOGIC_TRUE; } ! 315: return(0); ! 316: case CS_FILE_DOWNLOAD: ! 317: if(!usrlibs) return(0); ! 318: if(useron.rest&FLAG('D')) { ! 319: bputs(text[R_Download]); ! 320: return(0); } ! 321: padfname(csi->str,str); ! 322: strupr(str); ! 323: if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_DOWNLOAD)) { ! 324: bputs(text[SearchingAllDirs]); ! 325: for(i=0;i<usrdirs[curlib];i++) ! 326: if(i!=curdir[curlib] && ! 327: (s=listfileinfo(usrdir[curlib][i],str,FI_DOWNLOAD))!=0) ! 328: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 329: return(0); ! 330: bputs(text[SearchingAllLibs]); ! 331: for(i=0;i<usrlibs;i++) { ! 332: if(i==curlib) continue; ! 333: for(j=0;j<usrdirs[i];j++) ! 334: if((s=listfileinfo(usrdir[i][j],str,FI_DOWNLOAD))!=0) ! 335: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 336: return(0); } } ! 337: return(0); ! 338: case CS_FILE_DOWNLOAD_USER: /* Download from user dir */ ! 339: csi->logic=LOGIC_FALSE; ! 340: if(cfg.user_dir==INVALID_DIR) { ! 341: bputs(text[NoUserDir]); ! 342: return(0); } ! 343: if(useron.rest&FLAG('D')) { ! 344: bputs(text[R_Download]); ! 345: return(0); } ! 346: CRLF; ! 347: if(!listfileinfo(cfg.user_dir,nulstr,FI_USERXFER)) ! 348: bputs(text[NoFilesForYou]); ! 349: else ! 350: csi->logic=LOGIC_TRUE; ! 351: return(0); ! 352: case CS_FILE_DOWNLOAD_BATCH: ! 353: if(batdn_total && yesno(text[DownloadBatchQ])) { ! 354: start_batch_download(); ! 355: csi->logic=LOGIC_TRUE; } ! 356: else ! 357: csi->logic=LOGIC_FALSE; ! 358: return(0); ! 359: case CS_FILE_BATCH_ADD_LIST: ! 360: batch_add_list(csi->str); ! 361: return(0); ! 362: case CS_FILE_BATCH_ADD: ! 363: csi->logic=LOGIC_FALSE; ! 364: if(!csi->str[0]) ! 365: return(0); ! 366: padfname(csi->str,f.name); ! 367: strupr(f.name); ! 368: for(x=0;x<usrlibs;x++) { ! 369: for(y=0;y<usrdirs[x];y++) ! 370: if(findfile(&cfg,usrdir[x][y],f.name)) ! 371: break; ! 372: if(y<usrdirs[x]) ! 373: break; } ! 374: if(x>=usrlibs) ! 375: return(0); ! 376: f.dir=usrdir[x][y]; ! 377: getfileixb(&cfg,&f); ! 378: f.size=0; ! 379: getfiledat(&cfg,&f); ! 380: addtobatdl(&f); ! 381: csi->logic=LOGIC_TRUE; ! 382: return(0); ! 383: case CS_FILE_BATCH_CLEAR: ! 384: if(!batdn_total) { ! 385: csi->logic=LOGIC_FALSE; ! 386: return(0); } ! 387: csi->logic=LOGIC_TRUE; ! 388: for(i=0;i<batdn_total;i++) { ! 389: f.dir=batdn_dir[i]; ! 390: f.datoffset=batdn_offset[i]; ! 391: f.size=batdn_size[i]; ! 392: strcpy(f.name,batdn_name[i]); ! 393: closefile(&f); } ! 394: batdn_total=0; ! 395: return(0); ! 396: ! 397: case CS_FILE_VIEW: ! 398: if(!usrlibs) return(0); ! 399: padfname(csi->str,str); ! 400: strupr(str); ! 401: csi->logic=LOGIC_TRUE; ! 402: if(listfiles(usrdir[curlib][curdir[curlib]],str,0,FL_VIEW)) ! 403: return(0); ! 404: bputs(text[SearchingAllDirs]); ! 405: for(i=0;i<usrdirs[curlib];i++) { ! 406: if(i==curdir[curlib]) continue; ! 407: if(listfiles(usrdir[curlib][i],str,0,FL_VIEW)) ! 408: break; } ! 409: if(i<usrdirs[curlib]) ! 410: return(0); ! 411: bputs(text[SearchingAllLibs]); ! 412: for(i=0;i<usrlibs;i++) { ! 413: if(i==curlib) continue; ! 414: for(j=0;j<usrdirs[i];j++) ! 415: if(listfiles(usrdir[i][j],str,0,FL_VIEW)) ! 416: return(0); } ! 417: csi->logic=LOGIC_FALSE; ! 418: bputs(text[FileNotFound]); ! 419: return(0); ! 420: case CS_FILE_LIST: /* List files in current dir */ ! 421: if(!usrlibs) return(0); ! 422: csi->logic=LOGIC_FALSE; ! 423: if(!getfiles(usrdir[curlib][curdir[curlib]])) { ! 424: bputs(text[EmptyDir]); ! 425: return(0); } ! 426: padfname(csi->str,str); ! 427: strupr(str); ! 428: s=listfiles(usrdir[curlib][curdir[curlib]],str,0,0); ! 429: if(s>1) { ! 430: bprintf(text[NFilesListed],s); } ! 431: csi->logic=!s; ! 432: return(0); ! 433: case CS_FILE_LIST_EXTENDED: /* Extended Information on files */ ! 434: if(!usrlibs) return(0); ! 435: padfname(csi->str,str); ! 436: strupr(str); ! 437: if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_INFO)) { ! 438: bputs(text[SearchingAllDirs]); ! 439: for(i=0;i<usrdirs[curlib];i++) ! 440: if(i!=curdir[curlib] && (s=listfileinfo(usrdir[curlib][i] ! 441: ,str,FI_INFO))!=0) ! 442: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 443: return(0); ! 444: bputs(text[SearchingAllLibs]); ! 445: for(i=0;i<usrlibs;i++) { ! 446: if(i==curlib) continue; ! 447: for(j=0;j<usrdirs[i];j++) ! 448: if((s=listfileinfo(usrdir[i][j],str,FI_INFO))!=0) ! 449: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 450: return(0); } } ! 451: return(0); ! 452: case CS_FILE_FIND_TEXT: /* Find text in descriptions */ ! 453: scandirs(FL_FINDDESC); ! 454: return(0); ! 455: case CS_FILE_FIND_TEXT_ALL: /* Find text in descriptions */ ! 456: scanalldirs(FL_FINDDESC); ! 457: return(0); ! 458: case CS_FILE_FIND_NAME: /* Find text in descriptions */ ! 459: scandirs(FL_NO_HDR); ! 460: return(0); ! 461: case CS_FILE_FIND_NAME_ALL: /* Find text in descriptions */ ! 462: scanalldirs(FL_NO_HDR); ! 463: return(0); ! 464: case CS_FILE_BATCH_SECTION: ! 465: batchmenu(); ! 466: return(0); ! 467: case CS_FILE_TEMP_SECTION: ! 468: temp_xfer(); ! 469: return(0); ! 470: case CS_FILE_PTRS_CFG: ! 471: csi->logic=!inputnstime(&ns_time); ! 472: return(0); ! 473: case CS_FILE_NEW_SCAN: ! 474: scandirs(FL_ULTIME); ! 475: return(0); ! 476: case CS_FILE_NEW_SCAN_ALL: ! 477: scanalldirs(FL_ULTIME); ! 478: return(0); ! 479: case CS_FILE_REMOVE: ! 480: if(!usrlibs) return(0); ! 481: if(useron.rest&FLAG('R')) { ! 482: bputs(text[R_RemoveFiles]); ! 483: return(0); } ! 484: padfname(csi->str,str); ! 485: strupr(str); ! 486: if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_REMOVE)) { ! 487: if(cfg.user_dir!=INVALID_DIR ! 488: && cfg.user_dir!=usrdir[curlib][curdir[curlib]]) ! 489: if((s=listfileinfo(cfg.user_dir,str,FI_REMOVE))!=0) ! 490: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 491: return(0); ! 492: bputs(text[SearchingAllDirs]); ! 493: for(i=0;i<usrdirs[curlib];i++) ! 494: if(i!=curdir[curlib] && i!=cfg.user_dir ! 495: && (s=listfileinfo(usrdir[curlib][i],str,FI_REMOVE))!=0) ! 496: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 497: return(0); ! 498: bputs(text[SearchingAllLibs]); ! 499: for(i=0;i<usrlibs;i++) { ! 500: if(i==curlib || i==cfg.user_dir) continue; ! 501: for(j=0;j<usrdirs[i]; j++) ! 502: if((s=listfileinfo(usrdir[i][j],str,FI_REMOVE))!=0) ! 503: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 504: return(0); } } ! 505: return(0); ! 506: } ! 507: ! 508: errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1)); ! 509: return(0); ! 510: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.