|
|
1.1 ! root 1: /* execfile.cpp */ ! 2: ! 3: /* Synchronet file transfer-related command shell/module routines */ ! 4: ! 5: /* $Id: execfile.cpp,v 1.9 2004/05/30 06:47:52 deuce 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::exec_file(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(' '); ! 65: if(i<9) outchar(' '); ! 66: if(i<99) outchar(' '); ! 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(' '); ! 88: sprintf(str,text[DirLstFmt],i+1 ! 89: ,cfg.dir[usrdir[j][i]]->lname,nulstr ! 90: ,getfiles(&cfg,usrdir[j][i])); ! 91: if(i<9) outchar(' '); ! 92: if(i<99) outchar(' '); ! 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(' '); ! 195: if(i<9) outchar(' '); ! 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(' '); ! 212: sprintf(str,text[DirLstFmt],i+1 ! 213: ,cfg.dir[usrdir[curlib][i]]->lname,nulstr ! 214: ,getfiles(&cfg,usrdir[curlib][i])); ! 215: if(i<9) outchar(' '); ! 216: if(i<99) outchar(' '); ! 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(usrlibs) { ! 266: i=usrdir[curlib][curdir[curlib]]; ! 267: if(cfg.upload_dir!=INVALID_DIR ! 268: && !chk_ar(cfg.dir[i]->ul_ar,&useron)) ! 269: i=cfg.upload_dir; ! 270: } else ! 271: i=cfg.upload_dir; ! 272: csi->logic=upload(i) ? LOGIC_TRUE:LOGIC_FALSE; ! 273: return(0); ! 274: case CS_FILE_UPLOAD_USER: ! 275: csi->logic=LOGIC_FALSE; ! 276: if(cfg.user_dir==INVALID_DIR) { ! 277: bputs(text[NoUserDir]); ! 278: return(0); ! 279: } ! 280: csi->logic=upload(cfg.user_dir) ? LOGIC_TRUE:LOGIC_FALSE; ! 281: return(0); ! 282: case CS_FILE_UPLOAD_SYSOP: ! 283: csi->logic=LOGIC_FALSE; ! 284: if(cfg.sysop_dir==INVALID_DIR) { ! 285: bputs(text[NoSysopDir]); ! 286: return(0); ! 287: } ! 288: csi->logic=upload(cfg.sysop_dir) ? LOGIC_TRUE:LOGIC_FALSE; ! 289: return(0); ! 290: case CS_FILE_DOWNLOAD: ! 291: if(!usrlibs) return(0); ! 292: if(useron.rest&FLAG('D')) { ! 293: bputs(text[R_Download]); ! 294: return(0); } ! 295: padfname(csi->str,str); ! 296: strupr(str); ! 297: if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_DOWNLOAD)) { ! 298: bputs(text[SearchingAllDirs]); ! 299: for(i=0;i<usrdirs[curlib];i++) ! 300: if(i!=curdir[curlib] && ! 301: (s=listfileinfo(usrdir[curlib][i],str,FI_DOWNLOAD))!=0) ! 302: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 303: return(0); ! 304: bputs(text[SearchingAllLibs]); ! 305: for(i=0;i<usrlibs;i++) { ! 306: if(i==curlib) continue; ! 307: for(j=0;j<usrdirs[i];j++) ! 308: if((s=listfileinfo(usrdir[i][j],str,FI_DOWNLOAD))!=0) ! 309: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 310: return(0); } } ! 311: return(0); ! 312: case CS_FILE_DOWNLOAD_USER: /* Download from user dir */ ! 313: csi->logic=LOGIC_FALSE; ! 314: if(cfg.user_dir==INVALID_DIR) { ! 315: bputs(text[NoUserDir]); ! 316: return(0); } ! 317: if(useron.rest&FLAG('D')) { ! 318: bputs(text[R_Download]); ! 319: return(0); } ! 320: CRLF; ! 321: if(!listfileinfo(cfg.user_dir,nulstr,FI_USERXFER)) ! 322: bputs(text[NoFilesForYou]); ! 323: else ! 324: csi->logic=LOGIC_TRUE; ! 325: return(0); ! 326: case CS_FILE_DOWNLOAD_BATCH: ! 327: if(batdn_total && yesno(text[DownloadBatchQ])) { ! 328: start_batch_download(); ! 329: csi->logic=LOGIC_TRUE; } ! 330: else ! 331: csi->logic=LOGIC_FALSE; ! 332: return(0); ! 333: case CS_FILE_BATCH_ADD_LIST: ! 334: batch_add_list(csi->str); ! 335: return(0); ! 336: case CS_FILE_BATCH_ADD: ! 337: csi->logic=LOGIC_FALSE; ! 338: if(!csi->str[0]) ! 339: return(0); ! 340: padfname(csi->str,f.name); ! 341: for(x=y=0;x<usrlibs;x++) { ! 342: for(y=0;y<usrdirs[x];y++) ! 343: if(findfile(&cfg,usrdir[x][y],f.name)) ! 344: break; ! 345: if(y<usrdirs[x]) ! 346: break; } ! 347: if(x>=usrlibs) ! 348: return(0); ! 349: f.dir=usrdir[x][y]; ! 350: getfileixb(&cfg,&f); ! 351: f.size=0; ! 352: getfiledat(&cfg,&f); ! 353: addtobatdl(&f); ! 354: csi->logic=LOGIC_TRUE; ! 355: return(0); ! 356: case CS_FILE_BATCH_CLEAR: ! 357: if(!batdn_total) { ! 358: csi->logic=LOGIC_FALSE; ! 359: return(0); } ! 360: csi->logic=LOGIC_TRUE; ! 361: for(i=0;i<batdn_total;i++) { ! 362: f.dir=batdn_dir[i]; ! 363: f.datoffset=batdn_offset[i]; ! 364: f.size=batdn_size[i]; ! 365: strcpy(f.name,batdn_name[i]); ! 366: closefile(&f); } ! 367: batdn_total=0; ! 368: return(0); ! 369: ! 370: case CS_FILE_VIEW: ! 371: if(!usrlibs) return(0); ! 372: padfname(csi->str,str); ! 373: strupr(str); ! 374: csi->logic=LOGIC_TRUE; ! 375: if(listfiles(usrdir[curlib][curdir[curlib]],str,0,FL_VIEW)) ! 376: return(0); ! 377: bputs(text[SearchingAllDirs]); ! 378: for(i=0;i<usrdirs[curlib];i++) { ! 379: if(i==curdir[curlib]) continue; ! 380: if(listfiles(usrdir[curlib][i],str,0,FL_VIEW)) ! 381: break; } ! 382: if(i<usrdirs[curlib]) ! 383: return(0); ! 384: bputs(text[SearchingAllLibs]); ! 385: for(i=0;i<usrlibs;i++) { ! 386: if(i==curlib) continue; ! 387: for(j=0;j<usrdirs[i];j++) ! 388: if(listfiles(usrdir[i][j],str,0,FL_VIEW)) ! 389: return(0); } ! 390: csi->logic=LOGIC_FALSE; ! 391: bputs(text[FileNotFound]); ! 392: return(0); ! 393: case CS_FILE_LIST: /* List files in current dir */ ! 394: if(!usrlibs) return(0); ! 395: csi->logic=LOGIC_FALSE; ! 396: if(!getfiles(&cfg,usrdir[curlib][curdir[curlib]])) { ! 397: bputs(text[EmptyDir]); ! 398: return(0); } ! 399: padfname(csi->str,str); ! 400: strupr(str); ! 401: s=listfiles(usrdir[curlib][curdir[curlib]],str,0,0); ! 402: if(s>1) { ! 403: bprintf(text[NFilesListed],s); } ! 404: csi->logic=!s; ! 405: return(0); ! 406: case CS_FILE_LIST_EXTENDED: /* Extended Information on files */ ! 407: if(!usrlibs) return(0); ! 408: padfname(csi->str,str); ! 409: strupr(str); ! 410: if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_INFO)) { ! 411: bputs(text[SearchingAllDirs]); ! 412: for(i=0;i<usrdirs[curlib];i++) ! 413: if(i!=curdir[curlib] && (s=listfileinfo(usrdir[curlib][i] ! 414: ,str,FI_INFO))!=0) ! 415: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 416: return(0); ! 417: bputs(text[SearchingAllLibs]); ! 418: for(i=0;i<usrlibs;i++) { ! 419: if(i==curlib) continue; ! 420: for(j=0;j<usrdirs[i];j++) ! 421: if((s=listfileinfo(usrdir[i][j],str,FI_INFO))!=0) ! 422: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 423: return(0); } } ! 424: return(0); ! 425: case CS_FILE_FIND_TEXT: /* Find text in descriptions */ ! 426: scandirs(FL_FINDDESC); ! 427: return(0); ! 428: case CS_FILE_FIND_TEXT_ALL: /* Find text in descriptions */ ! 429: scanalldirs(FL_FINDDESC); ! 430: return(0); ! 431: case CS_FILE_FIND_NAME: /* Find text in descriptions */ ! 432: scandirs(FL_NO_HDR); ! 433: return(0); ! 434: case CS_FILE_FIND_NAME_ALL: /* Find text in descriptions */ ! 435: scanalldirs(FL_NO_HDR); ! 436: return(0); ! 437: case CS_FILE_BATCH_SECTION: ! 438: batchmenu(); ! 439: return(0); ! 440: case CS_FILE_TEMP_SECTION: ! 441: temp_xfer(); ! 442: return(0); ! 443: case CS_FILE_PTRS_CFG: ! 444: csi->logic=!inputnstime(&ns_time); ! 445: return(0); ! 446: case CS_FILE_NEW_SCAN: ! 447: scandirs(FL_ULTIME); ! 448: return(0); ! 449: case CS_FILE_NEW_SCAN_ALL: ! 450: scanalldirs(FL_ULTIME); ! 451: return(0); ! 452: case CS_FILE_REMOVE: ! 453: if(!usrlibs) return(0); ! 454: if(useron.rest&FLAG('R')) { ! 455: bputs(text[R_RemoveFiles]); ! 456: return(0); } ! 457: padfname(csi->str,str); ! 458: strupr(str); ! 459: if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_REMOVE)) { ! 460: if(cfg.user_dir!=INVALID_DIR ! 461: && cfg.user_dir!=usrdir[curlib][curdir[curlib]]) ! 462: if((s=listfileinfo(cfg.user_dir,str,FI_REMOVE))!=0) ! 463: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 464: return(0); ! 465: bputs(text[SearchingAllDirs]); ! 466: for(i=0;i<usrdirs[curlib];i++) ! 467: if(i!=curdir[curlib] && i!=cfg.user_dir ! 468: && (s=listfileinfo(usrdir[curlib][i],str,FI_REMOVE))!=0) ! 469: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 470: return(0); ! 471: bputs(text[SearchingAllLibs]); ! 472: for(i=0;i<usrlibs;i++) { ! 473: if(i==curlib || i==cfg.user_dir) continue; ! 474: for(j=0;j<usrdirs[i]; j++) ! 475: if((s=listfileinfo(usrdir[i][j],str,FI_REMOVE))!=0) ! 476: if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) ! 477: return(0); } } ! 478: return(0); ! 479: } ! 480: ! 481: errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1)); ! 482: return(0); ! 483: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.