|
|
1.1 ! root 1: /* scfgxfr1.c */ ! 2: ! 3: /* $Id: scfgxfr1.c,v 1.18 2006/01/26 04:14:18 deuce Exp $ */ ! 4: ! 5: /**************************************************************************** ! 6: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 7: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 8: * * ! 9: * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html * ! 10: * * ! 11: * This program is free software; you can redistribute it and/or * ! 12: * modify it under the terms of the GNU General Public License * ! 13: * as published by the Free Software Foundation; either version 2 * ! 14: * of the License, or (at your option) any later version. * ! 15: * See the GNU General Public License for more details: gpl.txt or * ! 16: * http://www.fsf.org/copyleft/gpl.html * ! 17: * * ! 18: * Anonymous FTP access to the most recent released source is available at * ! 19: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 20: * * ! 21: * Anonymous CVS access to the development source and modification history * ! 22: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 24: * (just hit return, no password is necessary) * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 26: * * ! 27: * For Synchronet coding style and modification guidelines, see * ! 28: * http://www.synchro.net/source.html * ! 29: * * ! 30: * You are encouraged to submit any modifications (preferably in Unix diff * ! 31: * format) via e-mail to [email protected] * ! 32: * * ! 33: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 34: ****************************************************************************/ ! 35: ! 36: #include "scfg.h" ! 37: ! 38: void xfer_opts() ! 39: { ! 40: char str[128],done; ! 41: int i,j,l; ! 42: static int xfr_dflt; ! 43: static int fextr_dflt; ! 44: static int fextr_opt; ! 45: static int fview_dflt; ! 46: static int fview_opt; ! 47: static int ftest_dflt; ! 48: static int ftest_opt; ! 49: static int fcomp_dflt; ! 50: static int fcomp_opt; ! 51: static int prot_dflt; ! 52: static int prot_opt; ! 53: static int dlevent_dflt; ! 54: static int dlevent_opt; ! 55: static int altpath_dflt; ! 56: static fextr_t savfextr; ! 57: static fview_t savfview; ! 58: static ftest_t savftest; ! 59: static fcomp_t savfcomp; ! 60: static prot_t savprot; ! 61: static dlevent_t savdlevent; ! 62: static char savaltpath[LEN_DIR+1]; ! 63: ! 64: while(1) { ! 65: i=0; ! 66: sprintf(opt[i++],"%-33.33s%uk","Min Bytes Free Disk Space" ! 67: ,cfg.min_dspace); ! 68: sprintf(opt[i++],"%-33.33s%u","Max Files in Batch UL Queue" ! 69: ,cfg.max_batup); ! 70: sprintf(opt[i++],"%-33.33s%u","Max Files in Batch DL Queue" ! 71: ,cfg.max_batdn); ! 72: sprintf(opt[i++],"%-33.33s%u","Max Users in User Transfers" ! 73: ,cfg.max_userxfer); ! 74: sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Upload" ! 75: ,cfg.cdt_up_pct); ! 76: sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Download" ! 77: ,cfg.cdt_dn_pct); ! 78: if(cfg.leech_pct) ! 79: sprintf(str,"%u%% after %u seconds" ! 80: ,cfg.leech_pct,cfg.leech_sec); ! 81: else ! 82: strcpy(str,"Disabled"); ! 83: sprintf(opt[i++],"%-33.33s%s","Long Filenames in Listings" ! 84: ,cfg.file_misc&FM_NO_LFN ? "No":"Yes"); ! 85: sprintf(opt[i++],"%-33.33s%s","Leech Protocol Detection",str); ! 86: strcpy(opt[i++],"Viewable Files..."); ! 87: strcpy(opt[i++],"Testable Files..."); ! 88: strcpy(opt[i++],"Download Events..."); ! 89: strcpy(opt[i++],"Extractable Files..."); ! 90: strcpy(opt[i++],"Compressable Files..."); ! 91: strcpy(opt[i++],"Transfer Protocols..."); ! 92: strcpy(opt[i++],"Alternate File Paths..."); ! 93: opt[i][0]=0; ! 94: SETHELP(WHERE); ! 95: /* ! 96: &File Transfer Configuration:& ! 97: ! 98: This menu has options and sub-menus that pertain specifically to the ! 99: file transfer section of the BBS. ! 100: */ ! 101: switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&xfr_dflt,0 ! 102: ,"File Transfer Configuration",opt)) { ! 103: case -1: ! 104: i=save_changes(WIN_MID); ! 105: if(i==-1) ! 106: break; ! 107: if(!i) { ! 108: write_file_cfg(&cfg,backup_level); ! 109: refresh_cfg(&cfg); ! 110: } ! 111: return; ! 112: case 0: ! 113: SETHELP(WHERE); ! 114: /* ! 115: &Minimum Kilobytes Free Disk Space to Allow Uploads:& ! 116: ! 117: This is the minimum free space in a file directory to allow user ! 118: uploads. ! 119: */ ! 120: uifc.input(WIN_MID,0,0 ! 121: ,"Minimum Kilobytes Free Disk Space to Allow Uploads" ! 122: ,ultoa(cfg.min_dspace,tmp,10),5,K_EDIT|K_NUMBER); ! 123: cfg.min_dspace=atoi(tmp); ! 124: break; ! 125: case 1: ! 126: SETHELP(WHERE); ! 127: /* ! 128: &Maximum Files in Batch Upload Queue:& ! 129: ! 130: This is the maximum number of files that can be placed in the batch ! 131: upload queue. ! 132: */ ! 133: uifc.input(WIN_MID,0,0,"Maximum Files in Batch Upload Queue" ! 134: ,ultoa(cfg.max_batup,tmp,10),5,K_EDIT|K_NUMBER); ! 135: cfg.max_batup=atoi(tmp); ! 136: break; ! 137: case 2: ! 138: SETHELP(WHERE); ! 139: /* ! 140: &Maximum Files in Batch Download Queue:& ! 141: ! 142: This is the maximum number of files that can be placed in the batch ! 143: download queue. ! 144: */ ! 145: uifc.input(WIN_MID,0,0,"Maximum Files in Batch Download Queue" ! 146: ,ultoa(cfg.max_batdn,tmp,10),5,K_EDIT|K_NUMBER); ! 147: cfg.max_batdn=atoi(tmp); ! 148: break; ! 149: case 3: ! 150: SETHELP(WHERE); ! 151: /* ! 152: &Maximum Destination Users in User to User Transfer:& ! 153: ! 154: This is the maximum number of users allowed in the destination user list ! 155: of a user to user upload. ! 156: */ ! 157: uifc.input(WIN_MID,0,0 ! 158: ,"Maximum Destination Users in User to User Transfers" ! 159: ,ultoa(cfg.max_userxfer,tmp,10),5,K_EDIT|K_NUMBER); ! 160: cfg.max_userxfer=atoi(tmp); ! 161: break; ! 162: case 4: ! 163: SETHELP(WHERE); ! 164: /* ! 165: &Default Percentage of Credits to Credit Uploader on Upload:& ! 166: ! 167: This is the default setting that will be used when new file ! 168: directories are created. ! 169: */ ! 170: uifc.input(WIN_MID,0,0 ! 171: ,"Default Percentage of Credits to Credit Uploader on Upload" ! 172: ,ultoa(cfg.cdt_up_pct,tmp,10),4,K_EDIT|K_NUMBER); ! 173: cfg.cdt_up_pct=atoi(tmp); ! 174: break; ! 175: case 5: ! 176: SETHELP(WHERE); ! 177: /* ! 178: &Default Percentage of Credits to Credit Uploader on Download:& ! 179: ! 180: This is the default setting that will be used when new file ! 181: directories are created. ! 182: */ ! 183: uifc.input(WIN_MID,0,0 ! 184: ,"Default Percentage of Credits to Credit Uploader on Download" ! 185: ,ultoa(cfg.cdt_dn_pct,tmp,10),4,K_EDIT|K_NUMBER); ! 186: cfg.cdt_dn_pct=atoi(tmp); ! 187: break; ! 188: case 6: ! 189: strcpy(opt[0],"Yes"); ! 190: strcpy(opt[1],"No"); ! 191: opt[2][0]=0; ! 192: i=0; ! 193: SETHELP(WHERE); ! 194: /* ! 195: &Long Filenames in File Listings:& ! 196: ! 197: If you want long filenames to be displayed in the BBS file listings, set ! 198: this option to &Yes&. Note: This feature requires Windows 98, Windows 2000 ! 199: or later. ! 200: */ ! 201: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 202: ,"Long Filenames in Listings (Win98/Win2K)",opt); ! 203: if(!i && cfg.file_misc&FM_NO_LFN) { ! 204: cfg.file_misc&=~FM_NO_LFN; ! 205: uifc.changes=1; ! 206: } else if(i==1 && !(cfg.file_misc&FM_NO_LFN)) { ! 207: cfg.file_misc|=FM_NO_LFN; ! 208: uifc.changes=1; ! 209: } ! 210: break; ! 211: ! 212: case 7: ! 213: SETHELP(WHERE); ! 214: /* ! 215: &Leech Protocol Detection Percentage:& ! 216: ! 217: This value is the sensitivity of the leech protocol detection feature of ! 218: Synchronet. If the transfer is apparently unsuccessful, but the transfer ! 219: time was at least this percentage of the estimated transfer time (based ! 220: on the estimated CPS of the connection result code), then a leech ! 221: protocol error is issued and the user's leech download counter is ! 222: incremented. Setting this value to &0& disables leech protocol detection. ! 223: */ ! 224: uifc.input(WIN_MID|WIN_SAV,0,0 ! 225: ,"Leech Protocol Detection Percentage (0=Disabled)" ! 226: ,ultoa(cfg.leech_pct,tmp,10),3,K_EDIT|K_NUMBER); ! 227: cfg.leech_pct=atoi(tmp); ! 228: if(!cfg.leech_pct) ! 229: break; ! 230: SETHELP(WHERE); ! 231: /* ! 232: &Leech Protocol Minimum Time (in Seconds):& ! 233: ! 234: This option allows you to adjust the sensitivity of the leech protocol ! 235: detection feature. This value is the minimum length of transfer time ! 236: (in seconds) that must elapse before an aborted tranfser will be ! 237: considered a possible leech attempt. ! 238: */ ! 239: uifc.input(WIN_MID,0,0 ! 240: ,"Leech Protocol Minimum Time (in Seconds)" ! 241: ,ultoa(cfg.leech_sec,tmp,10),3,K_EDIT|K_NUMBER); ! 242: cfg.leech_sec=atoi(tmp); ! 243: break; ! 244: case 8: /* Viewable file types */ ! 245: while(1) { ! 246: for(i=0;i<cfg.total_fviews && i<MAX_OPTS;i++) ! 247: sprintf(opt[i],"%-3.3s %-40s",cfg.fview[i]->ext,cfg.fview[i]->cmd); ! 248: opt[i][0]=0; ! 249: i=WIN_ACT|WIN_SAV; /* save cause size can change */ ! 250: if(cfg.total_fviews<MAX_OPTS) ! 251: i|=WIN_INS|WIN_XTR; ! 252: if(cfg.total_fviews) ! 253: i|=WIN_DEL|WIN_GET; ! 254: if(savfview.cmd[0]) ! 255: i|=WIN_PUT; ! 256: SETHELP(WHERE); ! 257: /* ! 258: &Viewable File Types:& ! 259: ! 260: This is a list of file types that have content information that can be ! 261: viewed through the execution of an external program. Here are a couple of ! 262: command line examples for a few file types. ! 263: */ ! 264: i=uifc.list(i,0,0,50,&fview_dflt,NULL,"Viewable File Types",opt); ! 265: if(i==-1) ! 266: break; ! 267: if((i&MSK_ON)==MSK_DEL) { ! 268: i&=MSK_OFF; ! 269: free(cfg.fview[i]); ! 270: cfg.total_fviews--; ! 271: while(i<cfg.total_fviews) { ! 272: cfg.fview[i]=cfg.fview[i+1]; ! 273: i++; } ! 274: uifc.changes=1; ! 275: continue; } ! 276: if((i&MSK_ON)==MSK_INS) { ! 277: i&=MSK_OFF; ! 278: if((cfg.fview=(fview_t **)realloc(cfg.fview ! 279: ,sizeof(fview_t *)*(cfg.total_fviews+1)))==NULL) { ! 280: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fviews+1); ! 281: cfg.total_fviews=0; ! 282: bail(1); ! 283: continue; } ! 284: if(!cfg.total_fviews) { ! 285: if((cfg.fview[0]=(fview_t *)malloc( ! 286: sizeof(fview_t)))==NULL) { ! 287: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t)); ! 288: continue; } ! 289: memset(cfg.fview[0],0,sizeof(fview_t)); ! 290: strcpy(cfg.fview[0]->ext,"ZIP"); ! 291: strcpy(cfg.fview[0]->cmd,"%@unzip -vq %s"); } ! 292: else { ! 293: for(j=cfg.total_fviews;j>i;j--) ! 294: cfg.fview[j]=cfg.fview[j-1]; ! 295: if((cfg.fview[i]=(fview_t *)malloc( ! 296: sizeof(fview_t)))==NULL) { ! 297: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t)); ! 298: continue; } ! 299: if(i>=cfg.total_fviews) ! 300: j=i-1; ! 301: else ! 302: j=i+1; ! 303: *cfg.fview[i]=*cfg.fview[j]; } ! 304: cfg.total_fviews++; ! 305: uifc.changes=1; ! 306: continue; } ! 307: if((i&MSK_ON)==MSK_GET) { ! 308: i&=MSK_OFF; ! 309: savfview=*cfg.fview[i]; ! 310: continue; } ! 311: if((i&MSK_ON)==MSK_PUT) { ! 312: i&=MSK_OFF; ! 313: *cfg.fview[i]=savfview; ! 314: uifc.changes=1; ! 315: continue; } ! 316: done=0; ! 317: while(!done) { ! 318: j=0; ! 319: sprintf(opt[j++],"%-22.22s%s","File Extension" ! 320: ,cfg.fview[i]->ext); ! 321: sprintf(opt[j++],"%-22.22s%-40s","Command Line" ! 322: ,cfg.fview[i]->cmd); ! 323: sprintf(opt[j++],"%-22.22s%s","Access Requirements" ! 324: ,cfg.fview[i]->arstr); ! 325: opt[j][0]=0; ! 326: switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fview_opt,0 ! 327: ,"Viewable File Type",opt)) { ! 328: case -1: ! 329: done=1; ! 330: break; ! 331: case 0: ! 332: uifc.input(WIN_MID|WIN_SAV,0,0 ! 333: ,"Viewable File Type Extension" ! 334: ,cfg.fview[i]->ext,sizeof(cfg.fview[i]->ext)-1,K_EDIT); ! 335: break; ! 336: case 1: ! 337: uifc.input(WIN_MID|WIN_SAV,0,0 ! 338: ,"Command" ! 339: ,cfg.fview[i]->cmd,sizeof(cfg.fview[i]->cmd)-1,K_EDIT); ! 340: break; ! 341: case 2: ! 342: sprintf(str,"Viewable File Type %s" ! 343: ,cfg.fview[i]->ext); ! 344: getar(str,cfg.fview[i]->arstr); ! 345: break; } } } ! 346: break; ! 347: case 9: /* Testable file types */ ! 348: while(1) { ! 349: for(i=0;i<cfg.total_ftests && i<MAX_OPTS;i++) ! 350: sprintf(opt[i],"%-3.3s %-40s",cfg.ftest[i]->ext,cfg.ftest[i]->cmd); ! 351: opt[i][0]=0; ! 352: i=WIN_ACT|WIN_SAV; /* save cause size can change */ ! 353: if(cfg.total_ftests<MAX_OPTS) ! 354: i|=WIN_INS|WIN_XTR; ! 355: if(cfg.total_ftests) ! 356: i|=WIN_DEL|WIN_GET; ! 357: if(savftest.cmd[0]) ! 358: i|=WIN_PUT; ! 359: SETHELP(WHERE); ! 360: /* ! 361: &Testable File Types:& ! 362: ! 363: This is a list of file types that will have a command line executed to ! 364: test the file integrity upon their upload. The file types are specified ! 365: by &extension& and if one file extension is listed more than once, each ! 366: command line will be executed. The command lines must return a DOS error ! 367: code of 0 (no error) in order for the file to pass the test. This method ! 368: of file testing upon upload is also known as an upload event. This test ! 369: or event, can do more than just test the file, it can perform any ! 370: function that the sysop wishes. Such as adding comments to an archived ! 371: file, or extracting an archive and performing a virus scan. While the ! 372: external program is executing, a text string is displayed to the user. ! 373: This &working string& can be set for each file type and command line ! 374: listed. ! 375: */ ! 376: i=uifc.list(i,0,0,50,&ftest_dflt,NULL,"Testable File Types",opt); ! 377: if(i==-1) ! 378: break; ! 379: if((i&MSK_ON)==MSK_DEL) { ! 380: i&=MSK_OFF; ! 381: free(cfg.ftest[i]); ! 382: cfg.total_ftests--; ! 383: while(i<cfg.total_ftests) { ! 384: cfg.ftest[i]=cfg.ftest[i+1]; ! 385: i++; } ! 386: uifc.changes=1; ! 387: continue; } ! 388: if((i&MSK_ON)==MSK_INS) { ! 389: i&=MSK_OFF; ! 390: if((cfg.ftest=(ftest_t **)realloc(cfg.ftest ! 391: ,sizeof(ftest_t *)*(cfg.total_ftests+1)))==NULL) { ! 392: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_ftests+1); ! 393: cfg.total_ftests=0; ! 394: bail(1); ! 395: continue; } ! 396: if(!cfg.total_ftests) { ! 397: if((cfg.ftest[0]=(ftest_t *)malloc( ! 398: sizeof(ftest_t)))==NULL) { ! 399: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t)); ! 400: continue; } ! 401: memset(cfg.ftest[0],0,sizeof(ftest_t)); ! 402: strcpy(cfg.ftest[0]->ext,"ZIP"); ! 403: strcpy(cfg.ftest[0]->cmd,"%@unzip -tqq %f"); ! 404: strcpy(cfg.ftest[0]->workstr,"Testing ZIP Integrity..."); } ! 405: else { ! 406: ! 407: for(j=cfg.total_ftests;j>i;j--) ! 408: cfg.ftest[j]=cfg.ftest[j-1]; ! 409: if((cfg.ftest[i]=(ftest_t *)malloc( ! 410: sizeof(ftest_t)))==NULL) { ! 411: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t)); ! 412: continue; } ! 413: if(i>=cfg.total_ftests) ! 414: j=i-1; ! 415: else ! 416: j=i+1; ! 417: *cfg.ftest[i]=*cfg.ftest[j]; } ! 418: cfg.total_ftests++; ! 419: uifc.changes=1; ! 420: continue; } ! 421: if((i&MSK_ON)==MSK_GET) { ! 422: i&=MSK_OFF; ! 423: savftest=*cfg.ftest[i]; ! 424: continue; } ! 425: if((i&MSK_ON)==MSK_PUT) { ! 426: i&=MSK_OFF; ! 427: *cfg.ftest[i]=savftest; ! 428: uifc.changes=1; ! 429: continue; } ! 430: done=0; ! 431: while(!done) { ! 432: j=0; ! 433: sprintf(opt[j++],"%-22.22s%s","File Extension" ! 434: ,cfg.ftest[i]->ext); ! 435: sprintf(opt[j++],"%-22.22s%-40s","Command Line" ! 436: ,cfg.ftest[i]->cmd); ! 437: sprintf(opt[j++],"%-22.22s%s","Working String" ! 438: ,cfg.ftest[i]->workstr); ! 439: sprintf(opt[j++],"%-22.22s%s","Access Requirements" ! 440: ,cfg.ftest[i]->arstr); ! 441: opt[j][0]=0; ! 442: switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&ftest_opt,0 ! 443: ,"Testable File Type",opt)) { ! 444: case -1: ! 445: done=1; ! 446: break; ! 447: case 0: ! 448: uifc.input(WIN_MID|WIN_SAV,0,0 ! 449: ,"Testable File Type Extension" ! 450: ,cfg.ftest[i]->ext,sizeof(cfg.ftest[i]->ext)-1,K_EDIT); ! 451: break; ! 452: case 1: ! 453: uifc.input(WIN_MID|WIN_SAV,0,0 ! 454: ,"Command" ! 455: ,cfg.ftest[i]->cmd,sizeof(cfg.ftest[i]->cmd)-1,K_EDIT); ! 456: break; ! 457: case 2: ! 458: uifc.input(WIN_MID|WIN_SAV,0,0 ! 459: ,"Working String" ! 460: ,cfg.ftest[i]->workstr,sizeof(cfg.ftest[i]->workstr)-1,K_EDIT|K_MSG); ! 461: break; ! 462: case 3: ! 463: sprintf(str,"Testable File Type %s",cfg.ftest[i]->ext); ! 464: getar(str,cfg.ftest[i]->arstr); ! 465: break; } } } ! 466: break; ! 467: case 10: /* Download Events */ ! 468: while(1) { ! 469: for(i=0;i<cfg.total_dlevents && i<MAX_OPTS;i++) ! 470: sprintf(opt[i],"%-3.3s %-40s",cfg.dlevent[i]->ext,cfg.dlevent[i]->cmd); ! 471: opt[i][0]=0; ! 472: i=WIN_ACT|WIN_SAV; /* save cause size can change */ ! 473: if(cfg.total_dlevents<MAX_OPTS) ! 474: i|=WIN_INS|WIN_XTR; ! 475: if(cfg.total_dlevents) ! 476: i|=WIN_DEL|WIN_GET; ! 477: if(savdlevent.cmd[0]) ! 478: i|=WIN_PUT; ! 479: SETHELP(WHERE); ! 480: /* ! 481: &Download Events:& ! 482: ! 483: This is a list of file types that will have a command line executed to ! 484: perform an event upon their download (e.g. trigger a download event). ! 485: The file types are specified by &extension& and if one file extension ! 486: is listed more than once, each command line will be executed. The ! 487: command lines must return a DOS error code of 0 (no error) in order ! 488: for the file to pass the test. This test or event, can do more than ! 489: just test the file, it can perform any function that the sysop wishes. ! 490: Such as adding comments to an archived file, or extracting an archive ! 491: and performing a virus scan. While the external program is executing, ! 492: a text string is displayed to the user. This &working string& can be set ! 493: for each file type and command line listed. ! 494: */ ! 495: i=uifc.list(i,0,0,50,&dlevent_dflt,NULL,"Download Events",opt); ! 496: if(i==-1) ! 497: break; ! 498: if((i&MSK_ON)==MSK_DEL) { ! 499: i&=MSK_OFF; ! 500: free(cfg.dlevent[i]); ! 501: cfg.total_dlevents--; ! 502: while(i<cfg.total_dlevents) { ! 503: cfg.dlevent[i]=cfg.dlevent[i+1]; ! 504: i++; } ! 505: uifc.changes=1; ! 506: continue; } ! 507: if((i&MSK_ON)==MSK_INS) { ! 508: i&=MSK_OFF; ! 509: if((cfg.dlevent=(dlevent_t **)realloc(cfg.dlevent ! 510: ,sizeof(dlevent_t *)*(cfg.total_dlevents+1)))==NULL) { ! 511: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_dlevents+1); ! 512: cfg.total_dlevents=0; ! 513: bail(1); ! 514: continue; } ! 515: if(!cfg.total_dlevents) { ! 516: if((cfg.dlevent[0]=(dlevent_t *)malloc( ! 517: sizeof(dlevent_t)))==NULL) { ! 518: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t)); ! 519: continue; } ! 520: memset(cfg.dlevent[0],0,sizeof(dlevent_t)); ! 521: strcpy(cfg.dlevent[0]->ext,"ZIP"); ! 522: strcpy(cfg.dlevent[0]->cmd,"%@zip -z %f < %zzipmsg.txt"); ! 523: strcpy(cfg.dlevent[0]->workstr,"Adding ZIP Comment..."); } ! 524: else { ! 525: ! 526: for(j=cfg.total_dlevents;j>i;j--) ! 527: cfg.dlevent[j]=cfg.dlevent[j-1]; ! 528: if((cfg.dlevent[i]=(dlevent_t *)malloc( ! 529: sizeof(dlevent_t)))==NULL) { ! 530: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t)); ! 531: continue; } ! 532: if(i>=cfg.total_dlevents) ! 533: j=i-1; ! 534: else ! 535: j=i+1; ! 536: *cfg.dlevent[i]=*cfg.dlevent[j]; } ! 537: cfg.total_dlevents++; ! 538: uifc.changes=1; ! 539: continue; } ! 540: if((i&MSK_ON)==MSK_GET) { ! 541: i&=MSK_OFF; ! 542: savdlevent=*cfg.dlevent[i]; ! 543: continue; } ! 544: if((i&MSK_ON)==MSK_PUT) { ! 545: i&=MSK_OFF; ! 546: *cfg.dlevent[i]=savdlevent; ! 547: uifc.changes=1; ! 548: continue; } ! 549: done=0; ! 550: while(!done) { ! 551: j=0; ! 552: sprintf(opt[j++],"%-22.22s%s","File Extension" ! 553: ,cfg.dlevent[i]->ext); ! 554: sprintf(opt[j++],"%-22.22s%-40s","Command Line" ! 555: ,cfg.dlevent[i]->cmd); ! 556: sprintf(opt[j++],"%-22.22s%s","Working String" ! 557: ,cfg.dlevent[i]->workstr); ! 558: sprintf(opt[j++],"%-22.22s%s","Access Requirements" ! 559: ,cfg.dlevent[i]->arstr); ! 560: opt[j][0]=0; ! 561: switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&dlevent_opt,0 ! 562: ,"Download Event",opt)) { ! 563: case -1: ! 564: done=1; ! 565: break; ! 566: case 0: ! 567: uifc.input(WIN_MID|WIN_SAV,0,0 ! 568: ,"Download Event Extension" ! 569: ,cfg.dlevent[i]->ext,sizeof(cfg.dlevent[i]->ext)-1,K_EDIT); ! 570: break; ! 571: case 1: ! 572: uifc.input(WIN_MID|WIN_SAV,0,0 ! 573: ,"Command" ! 574: ,cfg.dlevent[i]->cmd,sizeof(cfg.dlevent[i]->cmd)-1,K_EDIT); ! 575: break; ! 576: case 2: ! 577: uifc.input(WIN_MID|WIN_SAV,0,0 ! 578: ,"Working String" ! 579: ,cfg.dlevent[i]->workstr,sizeof(cfg.dlevent[i]->workstr)-1,K_EDIT|K_MSG); ! 580: break; ! 581: case 3: ! 582: sprintf(str,"Download Event %s",cfg.dlevent[i]->ext); ! 583: getar(str,cfg.dlevent[i]->arstr); ! 584: break; } } } ! 585: break; ! 586: case 11: /* Extractable file types */ ! 587: while(1) { ! 588: for(i=0;i<cfg.total_fextrs && i<MAX_OPTS;i++) ! 589: sprintf(opt[i],"%-3.3s %-40s" ! 590: ,cfg.fextr[i]->ext,cfg.fextr[i]->cmd); ! 591: opt[i][0]=0; ! 592: i=WIN_ACT|WIN_SAV; /* save cause size can change */ ! 593: if(cfg.total_fextrs<MAX_OPTS) ! 594: i|=WIN_INS|WIN_XTR; ! 595: if(cfg.total_fextrs) ! 596: i|=WIN_DEL|WIN_GET; ! 597: if(savfextr.cmd[0]) ! 598: i|=WIN_PUT; ! 599: SETHELP(WHERE); ! 600: /* ! 601: &Extractable File Types:& ! 602: ! 603: This is a list of archive file types that can be extracted to the temp ! 604: directory by an external program. The file types are specified by their ! 605: extension. For each file type you must specify the command line used to ! 606: extract the file(s). ! 607: */ ! 608: i=uifc.list(i,0,0,50,&fextr_dflt,NULL,"Extractable File Types",opt); ! 609: if(i==-1) ! 610: break; ! 611: if((i&MSK_ON)==MSK_DEL) { ! 612: i&=MSK_OFF; ! 613: free(cfg.fextr[i]); ! 614: cfg.total_fextrs--; ! 615: while(i<cfg.total_fextrs) { ! 616: cfg.fextr[i]=cfg.fextr[i+1]; ! 617: i++; } ! 618: uifc.changes=1; ! 619: continue; } ! 620: if((i&MSK_ON)==MSK_INS) { ! 621: i&=MSK_OFF; ! 622: if((cfg.fextr=(fextr_t **)realloc(cfg.fextr ! 623: ,sizeof(fextr_t *)*(cfg.total_fextrs+1)))==NULL) { ! 624: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fextrs+1); ! 625: cfg.total_fextrs=0; ! 626: bail(1); ! 627: continue; } ! 628: if(!cfg.total_fextrs) { ! 629: if((cfg.fextr[0]=(fextr_t *)malloc( ! 630: sizeof(fextr_t)))==NULL) { ! 631: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t)); ! 632: continue; } ! 633: memset(cfg.fextr[0],0,sizeof(fextr_t)); ! 634: strcpy(cfg.fextr[0]->ext,"ZIP"); ! 635: strcpy(cfg.fextr[0]->cmd,"%@unzip -Cojqq %f %s -d %g"); } ! 636: else { ! 637: ! 638: for(j=cfg.total_fextrs;j>i;j--) ! 639: cfg.fextr[j]=cfg.fextr[j-1]; ! 640: if((cfg.fextr[i]=(fextr_t *)malloc( ! 641: sizeof(fextr_t)))==NULL) { ! 642: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t)); ! 643: continue; } ! 644: if(i>=cfg.total_fextrs) ! 645: j=i-1; ! 646: else ! 647: j=i+1; ! 648: *cfg.fextr[i]=*cfg.fextr[j]; } ! 649: cfg.total_fextrs++; ! 650: uifc.changes=1; ! 651: continue; } ! 652: if((i&MSK_ON)==MSK_GET) { ! 653: i&=MSK_OFF; ! 654: savfextr=*cfg.fextr[i]; ! 655: continue; } ! 656: if((i&MSK_ON)==MSK_PUT) { ! 657: i&=MSK_OFF; ! 658: *cfg.fextr[i]=savfextr; ! 659: uifc.changes=1; ! 660: continue; } ! 661: done=0; ! 662: while(!done) { ! 663: j=0; ! 664: sprintf(opt[j++],"%-22.22s%s","File Extension" ! 665: ,cfg.fextr[i]->ext); ! 666: sprintf(opt[j++],"%-22.22s%-40s","Command Line" ! 667: ,cfg.fextr[i]->cmd); ! 668: sprintf(opt[j++],"%-22.22s%s","Access Requirements" ! 669: ,cfg.fextr[i]->arstr); ! 670: opt[j][0]=0; ! 671: switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fextr_opt,0 ! 672: ,"Extractable File Type",opt)) { ! 673: case -1: ! 674: done=1; ! 675: break; ! 676: case 0: ! 677: uifc.input(WIN_MID|WIN_SAV,0,0 ! 678: ,"Extractable File Type Extension" ! 679: ,cfg.fextr[i]->ext,sizeof(cfg.fextr[i]->ext)-1,K_EDIT); ! 680: break; ! 681: case 1: ! 682: uifc.input(WIN_MID|WIN_SAV,0,0 ! 683: ,"Command" ! 684: ,cfg.fextr[i]->cmd,sizeof(cfg.fextr[i]->cmd)-1,K_EDIT); ! 685: break; ! 686: case 2: ! 687: sprintf(str,"Extractable File Type %s" ! 688: ,cfg.fextr[i]->ext); ! 689: getar(str,cfg.fextr[i]->arstr); ! 690: break; } } } ! 691: break; ! 692: case 12: /* Compressable file types */ ! 693: while(1) { ! 694: for(i=0;i<cfg.total_fcomps && i<MAX_OPTS;i++) ! 695: sprintf(opt[i],"%-3.3s %-40s",cfg.fcomp[i]->ext,cfg.fcomp[i]->cmd); ! 696: opt[i][0]=0; ! 697: i=WIN_ACT|WIN_SAV; /* save cause size can change */ ! 698: if(cfg.total_fcomps<MAX_OPTS) ! 699: i|=WIN_INS|WIN_XTR; ! 700: if(cfg.total_fcomps) ! 701: i|=WIN_DEL|WIN_GET; ! 702: if(savfcomp.cmd[0]) ! 703: i|=WIN_PUT; ! 704: SETHELP(WHERE); ! 705: /* ! 706: &Compressable File Types:& ! 707: ! 708: This is a list of compression methods available for different file types. ! 709: These will be used for items such as creating QWK packets, temporary ! 710: files from the transfer section, and more. ! 711: */ ! 712: i=uifc.list(i,0,0,50,&fcomp_dflt,NULL,"Compressable File Types",opt); ! 713: if(i==-1) ! 714: break; ! 715: if((i&MSK_ON)==MSK_DEL) { ! 716: i&=MSK_OFF; ! 717: free(cfg.fcomp[i]); ! 718: cfg.total_fcomps--; ! 719: while(i<cfg.total_fcomps) { ! 720: cfg.fcomp[i]=cfg.fcomp[i+1]; ! 721: i++; } ! 722: uifc.changes=1; ! 723: continue; } ! 724: if((i&MSK_ON)==MSK_INS) { ! 725: i&=MSK_OFF; ! 726: if((cfg.fcomp=(fcomp_t **)realloc(cfg.fcomp ! 727: ,sizeof(fcomp_t *)*(cfg.total_fcomps+1)))==NULL) { ! 728: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fcomps+1); ! 729: cfg.total_fcomps=0; ! 730: bail(1); ! 731: continue; } ! 732: if(!cfg.total_fcomps) { ! 733: if((cfg.fcomp[0]=(fcomp_t *)malloc( ! 734: sizeof(fcomp_t)))==NULL) { ! 735: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t)); ! 736: continue; } ! 737: memset(cfg.fcomp[0],0,sizeof(fcomp_t)); ! 738: strcpy(cfg.fcomp[0]->ext,"ZIP"); ! 739: strcpy(cfg.fcomp[0]->cmd,"%@zip -jD %f %s"); } ! 740: else { ! 741: for(j=cfg.total_fcomps;j>i;j--) ! 742: cfg.fcomp[j]=cfg.fcomp[j-1]; ! 743: if((cfg.fcomp[i]=(fcomp_t *)malloc( ! 744: sizeof(fcomp_t)))==NULL) { ! 745: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t)); ! 746: continue; } ! 747: if(i>=cfg.total_fcomps) ! 748: j=i-1; ! 749: else ! 750: j=i+1; ! 751: *cfg.fcomp[i]=*cfg.fcomp[j]; } ! 752: cfg.total_fcomps++; ! 753: uifc.changes=1; ! 754: continue; } ! 755: if((i&MSK_ON)==MSK_GET) { ! 756: i&=MSK_OFF; ! 757: savfcomp=*cfg.fcomp[i]; ! 758: continue; } ! 759: if((i&MSK_ON)==MSK_PUT) { ! 760: i&=MSK_OFF; ! 761: *cfg.fcomp[i]=savfcomp; ! 762: uifc.changes=1; ! 763: continue; } ! 764: done=0; ! 765: while(!done) { ! 766: j=0; ! 767: sprintf(opt[j++],"%-22.22s%s","File Extension" ! 768: ,cfg.fcomp[i]->ext); ! 769: sprintf(opt[j++],"%-22.22s%-40s","Command Line" ! 770: ,cfg.fcomp[i]->cmd); ! 771: sprintf(opt[j++],"%-22.22s%s","Access Requirements" ! 772: ,cfg.fcomp[i]->arstr); ! 773: opt[j][0]=0; ! 774: switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fcomp_opt,0 ! 775: ,"Compressable File Type",opt)) { ! 776: case -1: ! 777: done=1; ! 778: break; ! 779: case 0: ! 780: uifc.input(WIN_MID|WIN_SAV,0,0 ! 781: ,"Compressable File Type Extension" ! 782: ,cfg.fcomp[i]->ext,sizeof(cfg.fcomp[i]->ext)-1,K_EDIT); ! 783: break; ! 784: case 1: ! 785: uifc.input(WIN_MID|WIN_SAV,0,0 ! 786: ,"Command" ! 787: ,cfg.fcomp[i]->cmd,sizeof(cfg.fcomp[i]->cmd)-1,K_EDIT); ! 788: break; ! 789: case 2: ! 790: sprintf(str,"Compressable File Type %s" ! 791: ,cfg.fcomp[i]->ext); ! 792: getar(str,cfg.fcomp[i]->arstr); ! 793: break; } } } ! 794: break; ! 795: case 13: /* Transfer protocols */ ! 796: while(1) { ! 797: for(i=0;i<cfg.total_prots && i<MAX_OPTS;i++) ! 798: sprintf(opt[i],"%c %s" ! 799: ,cfg.prot[i]->mnemonic,cfg.prot[i]->name); ! 800: opt[i][0]=0; ! 801: i=WIN_ACT|WIN_SAV; /* save cause size can change */ ! 802: if(cfg.total_prots<MAX_OPTS) ! 803: i|=WIN_INS|WIN_XTR; ! 804: if(cfg.total_prots) ! 805: i|=WIN_DEL|WIN_GET; ! 806: if(savprot.mnemonic) ! 807: i|=WIN_PUT; ! 808: SETHELP(WHERE); ! 809: /* ! 810: &File Transfer Protocols:& ! 811: ! 812: This is a list of file transfer protocols that can be used to transfer ! 813: files either to or from a remote user. For each protocol, you can ! 814: specify the mnemonic (hot-key) to use to specify that protocol, the ! 815: command line to use for uploads, downloads, batch uploads, batch ! 816: downloads, bi-directional file transfers, support of DSZLOG, and (for ! 817: *nix only) if it uses socket I/O or the more common stdio. ! 818: ! 819: If the protocol doesn't support a certain method of transfer, or you ! 820: don't wish it to be available for a certain method of transfer, leave ! 821: the command line for that method blank. ! 822: */ ! 823: i=uifc.list(i,0,0,50,&prot_dflt,NULL,"File Transfer Protocols",opt); ! 824: if(i==-1) ! 825: break; ! 826: if((i&MSK_ON)==MSK_DEL) { ! 827: i&=MSK_OFF; ! 828: free(cfg.prot[i]); ! 829: cfg.total_prots--; ! 830: while(i<cfg.total_prots) { ! 831: cfg.prot[i]=cfg.prot[i+1]; ! 832: i++; } ! 833: uifc.changes=1; ! 834: continue; } ! 835: if((i&MSK_ON)==MSK_INS) { ! 836: i&=MSK_OFF; ! 837: if((cfg.prot=(prot_t **)realloc(cfg.prot ! 838: ,sizeof(prot_t *)*(cfg.total_prots+1)))==NULL) { ! 839: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_prots+1); ! 840: cfg.total_prots=0; ! 841: bail(1); ! 842: continue; } ! 843: if(!cfg.total_prots) { ! 844: if((cfg.prot[0]=(prot_t *)malloc( ! 845: sizeof(prot_t)))==NULL) { ! 846: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t)); ! 847: continue; } ! 848: memset(cfg.prot[0],0,sizeof(prot_t)); ! 849: cfg.prot[0]->mnemonic='?'; ! 850: } else { ! 851: for(j=cfg.total_prots;j>i;j--) ! 852: cfg.prot[j]=cfg.prot[j-1]; ! 853: if((cfg.prot[i]=(prot_t *)malloc( ! 854: sizeof(prot_t)))==NULL) { ! 855: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t)); ! 856: continue; } ! 857: if(i>=cfg.total_prots) ! 858: j=i-1; ! 859: else ! 860: j=i+1; ! 861: *cfg.prot[i]=*cfg.prot[j]; } ! 862: cfg.total_prots++; ! 863: uifc.changes=1; ! 864: continue; } ! 865: if((i&MSK_ON)==MSK_GET) { ! 866: i&=MSK_OFF; ! 867: savprot=*cfg.prot[i]; ! 868: continue; } ! 869: if((i&MSK_ON)==MSK_PUT) { ! 870: i&=MSK_OFF; ! 871: *cfg.prot[i]=savprot; ! 872: uifc.changes=1; ! 873: continue; } ! 874: done=0; ! 875: while(!done) { ! 876: j=0; ! 877: sprintf(opt[j++],"%-30.30s%c","Mnemonic (Command Key)" ! 878: ,cfg.prot[i]->mnemonic); ! 879: sprintf(opt[j++],"%-30.30s%-40s","Protocol Name" ! 880: ,cfg.prot[i]->name); ! 881: sprintf(opt[j++],"%-30.30s%-40s","Access Requirements" ! 882: ,cfg.prot[i]->arstr); ! 883: sprintf(opt[j++],"%-30.30s%-40s","Upload Command Line" ! 884: ,cfg.prot[i]->ulcmd); ! 885: sprintf(opt[j++],"%-30.30s%-40s","Download Command Line" ! 886: ,cfg.prot[i]->dlcmd); ! 887: sprintf(opt[j++],"%-30.30s%-40s","Batch Upload Command Line" ! 888: ,cfg.prot[i]->batulcmd); ! 889: sprintf(opt[j++],"%-30.30s%-40s","Batch Download Command Line" ! 890: ,cfg.prot[i]->batdlcmd); ! 891: sprintf(opt[j++],"%-30.30s%-40s","Bi-dir Command Line" ! 892: ,cfg.prot[i]->bicmd); ! 893: sprintf(opt[j++],"%-30.30s%s", "Native (32-bit) Executable" ! 894: ,cfg.prot[i]->misc&PROT_NATIVE ? "Yes" : "No"); ! 895: sprintf(opt[j++],"%-30.30s%s", "Supports DSZLOG" ! 896: ,cfg.prot[i]->misc&PROT_DSZLOG ? "Yes":"No"); ! 897: sprintf(opt[j++],"%-30.30s%s", "Socket I/O" ! 898: ,cfg.prot[i]->misc&PROT_SOCKET ? "Yes":"No"); ! 899: opt[j][0]=0; ! 900: switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,70,&prot_opt,0 ! 901: ,"File Transfer Protocol",opt)) { ! 902: case -1: ! 903: done=1; ! 904: break; ! 905: case 0: ! 906: str[0]=cfg.prot[i]->mnemonic; ! 907: str[1]=0; ! 908: uifc.input(WIN_MID|WIN_SAV,0,0 ! 909: ,"Mnemonic (Command Key)" ! 910: ,str,1,K_UPPER|K_EDIT); ! 911: if(str[0]) ! 912: cfg.prot[i]->mnemonic=str[0]; ! 913: break; ! 914: case 1: ! 915: uifc.input(WIN_MID|WIN_SAV,0,0 ! 916: ,"Protocol Name" ! 917: ,cfg.prot[i]->name,sizeof(cfg.prot[i]->name)-1,K_EDIT); ! 918: break; ! 919: case 2: ! 920: sprintf(str,"Protocol %s",cfg.prot[i]->name); ! 921: getar(str,cfg.prot[i]->arstr); ! 922: break; ! 923: case 3: ! 924: uifc.input(WIN_MID|WIN_SAV,0,0 ! 925: ,"Command" ! 926: ,cfg.prot[i]->ulcmd,sizeof(cfg.prot[i]->ulcmd)-1,K_EDIT); ! 927: break; ! 928: case 4: ! 929: uifc.input(WIN_MID|WIN_SAV,0,0 ! 930: ,"Command" ! 931: ,cfg.prot[i]->dlcmd,sizeof(cfg.prot[i]->dlcmd)-1,K_EDIT); ! 932: break; ! 933: case 5: ! 934: uifc.input(WIN_MID|WIN_SAV,0,0 ! 935: ,"Command" ! 936: ,cfg.prot[i]->batulcmd,sizeof(cfg.prot[i]->batulcmd)-1,K_EDIT); ! 937: break; ! 938: case 6: ! 939: uifc.input(WIN_MID|WIN_SAV,0,0 ! 940: ,"Command" ! 941: ,cfg.prot[i]->batdlcmd,sizeof(cfg.prot[i]->batdlcmd)-1,K_EDIT); ! 942: break; ! 943: case 7: ! 944: uifc.input(WIN_MID|WIN_SAV,0,0 ! 945: ,"Command" ! 946: ,cfg.prot[i]->bicmd,sizeof(cfg.prot[i]->bicmd)-1,K_EDIT); ! 947: break; ! 948: case 8: ! 949: l=cfg.prot[i]->misc&PROT_NATIVE ? 0:1; ! 950: strcpy(opt[0],"Yes"); ! 951: strcpy(opt[1],"No"); ! 952: opt[2][0]=0; ! 953: l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0 ! 954: ,"Native (32-bit) Executable",opt); ! 955: if((l==0 && !(cfg.prot[i]->misc&PROT_NATIVE)) ! 956: || (l==1 && cfg.prot[i]->misc&PROT_NATIVE)) { ! 957: cfg.prot[i]->misc^=PROT_NATIVE; ! 958: uifc.changes=1; ! 959: } ! 960: break; ! 961: case 9: ! 962: l=cfg.prot[i]->misc&PROT_DSZLOG ? 0:1; ! 963: strcpy(opt[0],"Yes"); ! 964: strcpy(opt[1],"No"); ! 965: opt[2][0]=0; ! 966: l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0 ! 967: ,"Uses DSZLOG",opt); ! 968: if((l==0 && !(cfg.prot[i]->misc&PROT_DSZLOG)) ! 969: || (l==1 && cfg.prot[i]->misc&PROT_DSZLOG)) { ! 970: cfg.prot[i]->misc^=PROT_DSZLOG; ! 971: uifc.changes=1; ! 972: } ! 973: break; ! 974: case 10: ! 975: l=cfg.prot[i]->misc&PROT_SOCKET ? 0:1l; ! 976: strcpy(opt[0],"Yes"); ! 977: strcpy(opt[1],"No"); ! 978: opt[2][0]=0; ! 979: l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0 ! 980: ,"Uses Socket I/O",opt); ! 981: if((l==0 && !(cfg.prot[i]->misc&PROT_SOCKET)) ! 982: || (l==1 && cfg.prot[i]->misc&PROT_SOCKET)) { ! 983: cfg.prot[i]->misc^=PROT_SOCKET; ! 984: uifc.changes=1; ! 985: } ! 986: break; ! 987: } ! 988: } ! 989: } ! 990: break; ! 991: case 14: /* Alternate file paths */ ! 992: while(1) { ! 993: for(i=0;i<cfg.altpaths;i++) ! 994: sprintf(opt[i],"%3d: %-40s",i+1,cfg.altpath[i]); ! 995: opt[i][0]=0; ! 996: i=WIN_ACT|WIN_SAV; /* save cause size can change */ ! 997: if((int)cfg.altpaths<MAX_OPTS) ! 998: i|=WIN_INS|WIN_XTR; ! 999: if(cfg.altpaths) ! 1000: i|=WIN_DEL|WIN_GET; ! 1001: if(savaltpath[0]) ! 1002: i|=WIN_PUT; ! 1003: SETHELP(WHERE); ! 1004: /* ! 1005: &Alternate File Paths:& ! 1006: ! 1007: This option allows the sysop to add and configure alternate file paths ! 1008: for files stored on drives and directories other than the configured ! 1009: storage path for a file directory. This command is useful for those who ! 1010: have file directories where they wish to have files listed from ! 1011: multiple CD-ROMs or hard disks. ! 1012: */ ! 1013: i=uifc.list(i,0,0,50,&altpath_dflt,NULL,"Alternate File Paths",opt); ! 1014: if(i==-1) ! 1015: break; ! 1016: if((i&MSK_ON)==MSK_DEL) { ! 1017: i&=MSK_OFF; ! 1018: free(cfg.altpath[i]); ! 1019: cfg.altpaths--; ! 1020: while(i<cfg.altpaths) { ! 1021: cfg.altpath[i]=cfg.altpath[i+1]; ! 1022: i++; } ! 1023: uifc.changes=1; ! 1024: continue; } ! 1025: if((i&MSK_ON)==MSK_INS) { ! 1026: i&=MSK_OFF; ! 1027: if((cfg.altpath=(char **)realloc(cfg.altpath ! 1028: ,sizeof(char *)*(cfg.altpaths+1)))==NULL) { ! 1029: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.altpaths+1); ! 1030: cfg.altpaths=0; ! 1031: bail(1); ! 1032: continue; } ! 1033: if(!cfg.altpaths) { ! 1034: if((cfg.altpath[0]=(char *)malloc(LEN_DIR+1))==NULL) { ! 1035: errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1); ! 1036: continue; } ! 1037: memset(cfg.altpath[0],0,LEN_DIR+1); } ! 1038: else { ! 1039: for(j=cfg.altpaths;j>i;j--) ! 1040: cfg.altpath[j]=cfg.altpath[j-1]; ! 1041: if((cfg.altpath[i]=(char *)malloc(LEN_DIR+1))==NULL) { ! 1042: errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1); ! 1043: continue; } ! 1044: if(i>=cfg.altpaths) ! 1045: j=i-1; ! 1046: else ! 1047: j=i+1; ! 1048: memcpy(cfg.altpath[i],cfg.altpath[j],LEN_DIR+1); } ! 1049: cfg.altpaths++; ! 1050: uifc.changes=1; ! 1051: continue; } ! 1052: if((i&MSK_ON)==MSK_GET) { ! 1053: i&=MSK_OFF; ! 1054: memcpy(savaltpath,cfg.altpath[i],LEN_DIR+1); ! 1055: continue; } ! 1056: if((i&MSK_ON)==MSK_PUT) { ! 1057: i&=MSK_OFF; ! 1058: memcpy(cfg.altpath[i],savaltpath,LEN_DIR+1); ! 1059: uifc.changes=1; ! 1060: continue; } ! 1061: sprintf(str,"Path %d",i+1); ! 1062: uifc.input(WIN_MID|WIN_SAV,0,0,str,cfg.altpath[i],LEN_DIR,K_EDIT); ! 1063: } ! 1064: break; ! 1065: } ! 1066: } ! 1067: } ! 1068:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.