|
|
1.1.1.2 ! root 1: #line 2 "SCFGXFR2.C" ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: #include "scfg.h" ! 6: ! 7: void xfer_cfg() ! 8: { ! 9: static int libs_dflt,libs_bar,dflt; ! 10: char str[256],str2[81],done=0,*p; ! 11: int file,j,k,q; ! 12: uint i; ! 13: long ported; ! 14: static lib_t savlib; ! 15: dir_t tmpdir; ! 16: FILE *stream; ! 17: ! 18: while(1) { ! 19: for(i=0;i<total_libs && i<MAX_OPTS;i++) ! 20: sprintf(opt[i],"%-25s",lib[i]->lname); ! 21: opt[i][0]=0; ! 22: j=WIN_ACT|WIN_CHE|WIN_ORG; ! 23: if(total_libs) ! 24: j|=WIN_DEL|WIN_GET|WIN_DELACT; ! 25: if(total_libs<MAX_OPTS) ! 26: j|=WIN_INS|WIN_INSACT|WIN_XTR; ! 27: if(savlib.sname[0]) ! 28: j|=WIN_PUT; ! 29: SETHELP(WHERE); ! 30: /* ! 31: &File Libraries:& ! 32: ! 33: This is a listing of file libraries for your BBS. File Libraries are ! 34: used to logically separate your file &directories& into groups. Every ! 35: directory belongs to a file library. ! 36: ! 37: One popular use for file libraries is to separate CD-ROM and hard disk ! 38: directories. One might have an &Uploads& file library that contains ! 39: uploads to the hard disk directories and also have a &PC-SIG& file ! 40: library that contains directories from a PC-SIG CD-ROM. Some sysops ! 41: separate directories into more specific areas such as &Main&, &Graphics&, ! 42: or &Adult&. If you have many directories that have a common subject ! 43: denominator, you may want to have a separate file library for those ! 44: directories for a more organized file structure. ! 45: */ ! 46: i=ulist(j,0,0,45,&libs_dflt,&libs_bar,"File Libraries",opt); ! 47: if((signed)i==-1) { ! 48: j=save_changes(WIN_MID); ! 49: if(j==-1) ! 50: continue; ! 51: if(!j) ! 52: write_file_cfg(); ! 53: return; } ! 54: if((i&MSK_ON)==MSK_INS) { ! 55: i&=MSK_OFF; ! 56: strcpy(str,"Main"); ! 57: SETHELP(WHERE); ! 58: /* ! 59: &Library Long Name:& ! 60: ! 61: This is a description of the file library which is displayed when a ! 62: user of the system uses the &/*& command from the file transfer menu. ! 63: */*/ ! 64: if(uinput(WIN_MID|WIN_SAV,0,0,"Library Long Name",str,LEN_GLNAME ! 65: ,K_EDIT)<1) ! 66: continue; ! 67: sprintf(str2,"%.*s",LEN_GSNAME,str); ! 68: SETHELP(WHERE); ! 69: /* ! 70: &Library Short Name:& ! 71: ! 72: This is a short description of the file library which is used for the ! 73: file transfer menu prompt. ! 74: */ ! 75: if(uinput(WIN_MID|WIN_SAV,0,0,"Library Short Name",str2,LEN_GSNAME ! 76: ,K_EDIT)<1) ! 77: continue; ! 78: if((lib=(lib_t **)REALLOC(lib,sizeof(lib_t *)*(total_libs+1)))==NULL) { ! 79: errormsg(WHERE,ERR_ALLOC,nulstr,total_libs+1); ! 80: total_libs=0; ! 81: bail(1); ! 82: continue; } ! 83: ! 84: if(total_libs) { ! 85: for(j=total_libs;j>i;j--) ! 86: lib[j]=lib[j-1]; ! 87: for(j=0;j<total_dirs;j++) ! 88: if(dir[j]->lib>=i) ! 89: dir[j]->lib++; } ! 90: if((lib[i]=(lib_t *)MALLOC(sizeof(lib_t)))==NULL) { ! 91: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(lib_t)); ! 92: continue; } ! 93: memset((lib_t *)lib[i],0,sizeof(lib_t)); ! 94: strcpy(lib[i]->lname,str); ! 95: strcpy(lib[i]->sname,str2); ! 96: total_libs++; ! 97: changes=1; ! 98: continue; } ! 99: if((i&MSK_ON)==MSK_DEL) { ! 100: i&=MSK_OFF; ! 101: SETHELP(WHERE); ! 102: /* ! 103: &Delete All Data in Library:& ! 104: ! 105: If you wish to delete the database files for all directories in this ! 106: library, select &Yes&. ! 107: */ ! 108: j=1; ! 109: strcpy(opt[0],"Yes"); ! 110: strcpy(opt[1],"No"); ! 111: opt[2][0]=0; ! 112: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 ! 113: ,"Delete All Library Data Files",opt); ! 114: if(j==-1) ! 115: continue; ! 116: if(j==0) ! 117: for(j=0;j<total_dirs;j++) ! 118: if(dir[j]->lib==i) { ! 119: sprintf(str,"%s.*",dir[j]->code); ! 120: if(!dir[j]->data_dir[0]) ! 121: sprintf(tmp,"%sDIRS\\",data_dir); ! 122: else ! 123: strcpy(tmp,dir[j]->data_dir); ! 124: delfiles(tmp,str); } ! 125: FREE(lib[i]); ! 126: for(j=0;j<total_dirs;) { ! 127: if(dir[j]->lib==i) { ! 128: FREE(dir[j]); ! 129: total_dirs--; ! 130: k=j; ! 131: while(k<total_dirs) { ! 132: dir[k]=dir[k+1]; ! 133: k++; } } ! 134: else j++; } ! 135: for(j=0;j<total_dirs;j++) ! 136: if(dir[j]->lib>i) ! 137: dir[j]->lib--; ! 138: total_libs--; ! 139: while(i<total_libs) { ! 140: lib[i]=lib[i+1]; ! 141: i++; } ! 142: changes=1; ! 143: continue; } ! 144: if((i&MSK_ON)==MSK_GET) { ! 145: i&=MSK_OFF; ! 146: savlib=*lib[i]; ! 147: continue; } ! 148: if((i&MSK_ON)==MSK_PUT) { ! 149: i&=MSK_OFF; ! 150: *lib[i]=savlib; ! 151: changes=1; ! 152: continue; } ! 153: done=0; ! 154: while(!done) { ! 155: j=0; ! 156: sprintf(opt[j++],"%-27.27s%s","Long Name",lib[i]->lname); ! 157: sprintf(opt[j++],"%-27.27s%s","Short Name",lib[i]->sname); ! 158: sprintf(opt[j++],"%-27.27s%.40s","Access Requirements" ! 159: ,lib[i]->ar); ! 160: strcpy(opt[j++],"Clone Options"); ! 161: strcpy(opt[j++],"Export Areas..."); ! 162: strcpy(opt[j++],"Import Areas..."); ! 163: strcpy(opt[j++],"File Directories..."); ! 164: opt[j][0]=0; ! 165: savnum=0; ! 166: sprintf(str,"%s Library",lib[i]->sname); ! 167: SETHELP(WHERE); ! 168: /* ! 169: &File Library Configuration:& ! 170: ! 171: This menu allows you to configure the security requirments for access ! 172: to this file library. You can also add, delete, and configure the ! 173: directories of this library by selecting the &File Directories...& option. ! 174: */ ! 175: switch(ulist(WIN_ACT,6,4,60,&dflt,0,str,opt)) { ! 176: case -1: ! 177: done=1; ! 178: break; ! 179: case 0: ! 180: SETHELP(WHERE); ! 181: /* ! 182: &Library Long Name:& ! 183: ! 184: This is a description of the file library which is displayed when a ! 185: user of the system uses the &/*& command from the file transfer menu. ! 186: */*/ ! 187: strcpy(str,lib[i]->lname); /* save */ ! 188: if(!uinput(WIN_MID|WIN_SAV,0,0,"Name to use for Listings" ! 189: ,lib[i]->lname,LEN_GLNAME,K_EDIT)) ! 190: strcpy(lib[i]->lname,str); /* restore */ ! 191: break; ! 192: case 1: ! 193: SETHELP(WHERE); ! 194: /* ! 195: &Library Short Name:& ! 196: ! 197: This is a short description of the file librarly which is used for the ! 198: file transfer menu prompt. ! 199: */ ! 200: uinput(WIN_MID|WIN_SAV,0,0,"Name to use for Prompts" ! 201: ,lib[i]->sname,LEN_GSNAME,K_EDIT); ! 202: break; ! 203: case 2: ! 204: sprintf(str,"%s Library",lib[i]->sname); ! 205: getar(str,lib[i]->ar); ! 206: break; ! 207: case 3: /* clone options */ ! 208: j=0; ! 209: strcpy(opt[0],"Yes"); ! 210: strcpy(opt[1],"No"); ! 211: opt[2][0]=0; ! 212: SETHELP(WHERE); ! 213: /* ! 214: &Clone Directory Options:& ! 215: ! 216: If you want to clone the options of the first directory of this library ! 217: into all directories of this library, select &Yes&. ! 218: ! 219: The options cloned are upload requirments, download requirments, ! 220: operator requirements, exempted user requirements, toggle options, ! 221: maximum number of files, allowed file extensions, default file ! 222: extension, and sort type. ! 223: */ ! 224: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 ! 225: ,"Clone Options of First Directory into All of Library" ! 226: ,opt); ! 227: if(j==0) { ! 228: k=-1; ! 229: for(j=0;j<total_dirs;j++) ! 230: if(dir[j]->lib==i) { ! 231: if(k==-1) ! 232: k=j; ! 233: else { ! 234: changes=1; ! 235: dir[j]->misc=dir[k]->misc; ! 236: strcpy(dir[j]->ul_ar,dir[k]->ul_ar); ! 237: strcpy(dir[j]->dl_ar,dir[k]->dl_ar); ! 238: strcpy(dir[j]->op_ar,dir[k]->op_ar); ! 239: strcpy(dir[j]->ex_ar,dir[k]->ex_ar); ! 240: strcpy(dir[j]->exts,dir[k]->exts); ! 241: strcpy(dir[j]->data_dir,dir[k]->data_dir); ! 242: strcpy(dir[j]->upload_sem,dir[k]->upload_sem); ! 243: dir[j]->maxfiles=dir[k]->maxfiles; ! 244: dir[j]->maxage=dir[k]->maxage; ! 245: dir[j]->up_pct=dir[k]->up_pct; ! 246: dir[j]->dn_pct=dir[k]->dn_pct; ! 247: dir[j]->seqdev=dir[k]->seqdev; ! 248: dir[j]->sort=dir[k]->sort; } } } ! 249: break; ! 250: case 4: ! 251: k=0; ! 252: ported=0; ! 253: q=changes; ! 254: strcpy(opt[k++],"DIRS.TXT (Synchronet)"); ! 255: strcpy(opt[k++],"FILEBONE.NA (Fido)"); ! 256: opt[k][0]=0; ! 257: SETHELP(WHERE); ! 258: /* ! 259: &Export Area File Format:& ! 260: ! 261: This menu allows you to choose the format of the area file you wish to ! 262: export to. ! 263: */ ! 264: k=0; ! 265: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 ! 266: ,"Export Area File Format",opt); ! 267: if(k==-1) ! 268: break; ! 269: if(k==0) ! 270: sprintf(str,"%sDIRS.TXT",ctrl_dir); ! 271: else if(k==1) ! 272: sprintf(str,"FILEBONE.NA"); ! 273: strupr(str); ! 274: if(uinput(WIN_MID|WIN_SAV,0,0,"Filename" ! 275: ,str,40,K_UPPER|K_EDIT)<=0) { ! 276: changes=q; ! 277: break; } ! 278: if(fexist(str)) { ! 279: strcpy(opt[0],"Overwrite"); ! 280: strcpy(opt[1],"Append"); ! 281: opt[2][0]=0; ! 282: j=0; ! 283: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 ! 284: ,"File Exists",opt); ! 285: if(j==-1) ! 286: break; ! 287: if(j==0) j=O_WRONLY|O_TRUNC; ! 288: else j=O_WRONLY|O_APPEND; } ! 289: else ! 290: j=O_WRONLY|O_CREAT; ! 291: if((stream=fnopen(&file,str,j))==NULL) { ! 292: umsg("Open Failure"); ! 293: break; } ! 294: upop("Exporting Areas..."); ! 295: for(j=0;j<total_dirs;j++) { ! 296: if(dir[j]->lib!=i) ! 297: continue; ! 298: ported++; ! 299: if(k==1) { ! 300: fprintf(stream,"Area %-8s 0 ! %s\r\n" ! 301: ,dir[j]->code,dir[j]->lname); ! 302: continue; } ! 303: fprintf(stream,"%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n" ! 304: "%s\r\n%s\r\n" ! 305: ,dir[j]->lname ! 306: ,dir[j]->sname ! 307: ,dir[j]->code ! 308: ,dir[j]->data_dir ! 309: ,dir[j]->ar ! 310: ,dir[j]->ul_ar ! 311: ,dir[j]->dl_ar ! 312: ,dir[j]->op_ar ! 313: ); ! 314: fprintf(stream,"%s\r\n%s\r\n%u\r\n%s\r\n%lX\r\n%u\r\n" ! 315: "%u\r\n" ! 316: ,dir[j]->path ! 317: ,dir[j]->upload_sem ! 318: ,dir[j]->maxfiles ! 319: ,dir[j]->exts ! 320: ,dir[j]->misc ! 321: ,dir[j]->seqdev ! 322: ,dir[j]->sort ! 323: ); ! 324: fprintf(stream,"%s\r\n%u\r\n%u\r\n%u\r\n" ! 325: ,dir[j]->ex_ar ! 326: ,dir[j]->maxage ! 327: ,dir[j]->up_pct ! 328: ,dir[j]->dn_pct ! 329: ); ! 330: fprintf(stream,"***END-OF-DIR***\r\n\r\n"); } ! 331: fclose(stream); ! 332: upop(0); ! 333: sprintf(str,"%lu File Areas Exported Successfully",ported); ! 334: umsg(str); ! 335: changes=q; ! 336: break; ! 337: ! 338: case 5: ! 339: ported=0; ! 340: k=0; ! 341: SETHELP(WHERE); ! 342: /* ! 343: &Import Area File Format:& ! 344: ! 345: This menu allows you to choose the format of the area file you wish to ! 346: import into the current file library. ! 347: */ ! 348: strcpy(opt[k++],"DIRS.TXT (Synchronet)"); ! 349: strcpy(opt[k++],"FILEBONE.NA (Fido)"); ! 350: opt[k][0]=0; ! 351: k=0; ! 352: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 ! 353: ,"Import Area File Format",opt); ! 354: if(k==-1) ! 355: break; ! 356: if(k==0) ! 357: sprintf(str,"%sDIRS.TXT",ctrl_dir); ! 358: else if(k==1) ! 359: sprintf(str,"FILEBONE.NA"); ! 360: strupr(str); ! 361: if(uinput(WIN_MID|WIN_SAV,0,0,"Filename" ! 362: ,str,40,K_UPPER|K_EDIT)<=0) ! 363: break; ! 364: if((stream=fnopen(&file,str,O_RDONLY))==NULL) { ! 365: umsg("Open Failure"); ! 366: break; } ! 367: upop("Importing Areas..."); ! 368: while(!feof(stream)) { ! 369: if(!fgets(str,128,stream)) break; ! 370: truncsp(str); ! 371: if(!str[0]) ! 372: continue; ! 373: if(k) { ! 374: p=str; ! 375: while(*p && *p<=SP) p++; ! 376: if(strnicmp(p,"AREA ",5)) ! 377: continue; ! 378: memset(&tmpdir,0,sizeof(dir_t)); ! 379: tmpdir.misc|= ! 380: (DIR_FCHK|DIR_DUPES|DIR_CDTUL|DIR_CDTDL|DIR_DIZ); ! 381: if(k==1) { ! 382: p+=5; ! 383: while(*p && *p<=SP) p++; ! 384: sprintf(tmpdir.code,"%.8s",p); ! 385: truncsp(tmpdir.code); ! 386: while(*p>SP) p++; /* Skip areaname */ ! 387: while(*p && *p<=SP) p++; /* Skip space */ ! 388: while(*p>SP) p++; /* Skip level */ ! 389: while(*p && *p<=SP) p++; /* Skip space */ ! 390: while(*p>SP) p++; /* Skip flags */ ! 391: while(*p && *p<=SP) p++; /* Skip space */ ! 392: sprintf(tmpdir.lname,"%.*s",LEN_SLNAME,p); } ! 393: ported++; } ! 394: else { ! 395: memset(&tmpdir,0,sizeof(dir_t)); ! 396: sprintf(tmpdir.lname,"%.*s",LEN_SLNAME,str); ! 397: if(!fgets(str,128,stream)) break; ! 398: truncsp(str); ! 399: sprintf(tmpdir.sname,"%.*s",LEN_SSNAME,str); ! 400: if(!fgets(str,128,stream)) break; ! 401: truncsp(str); ! 402: sprintf(tmpdir.code,"%.*s",8,str); ! 403: if(!fgets(str,128,stream)) break; ! 404: truncsp(str); ! 405: sprintf(tmpdir.data_dir,"%.*s",LEN_DIR,str); ! 406: if(!fgets(str,128,stream)) break; ! 407: truncsp(str); ! 408: sprintf(tmpdir.ar,"%.*s",LEN_ARSTR,str); ! 409: if(!fgets(str,128,stream)) break; ! 410: truncsp(str); ! 411: sprintf(tmpdir.ul_ar,"%.*s",LEN_ARSTR,str); ! 412: if(!fgets(str,128,stream)) break; ! 413: truncsp(str); ! 414: sprintf(tmpdir.dl_ar,"%.*s",LEN_ARSTR,str); ! 415: if(!fgets(str,128,stream)) break; ! 416: truncsp(str); ! 417: sprintf(tmpdir.op_ar,"%.*s",LEN_ARSTR,str); ! 418: if(!fgets(str,128,stream)) break; ! 419: truncsp(str); ! 420: sprintf(tmpdir.path,"%.*s",LEN_DIR,str); ! 421: if(!fgets(str,128,stream)) break; ! 422: truncsp(str); ! 423: sprintf(tmpdir.upload_sem,"%.*s",LEN_DIR,str); ! 424: if(!fgets(str,128,stream)) break; ! 425: truncsp(str); ! 426: tmpdir.maxfiles=atoi(str); ! 427: if(!fgets(str,128,stream)) break; ! 428: truncsp(str); ! 429: sprintf(tmpdir.exts,"%.*s",40,str); ! 430: if(!fgets(str,128,stream)) break; ! 431: truncsp(str); ! 432: tmpdir.misc=ahtoul(str); ! 433: if(!fgets(str,128,stream)) break; ! 434: truncsp(str); ! 435: tmpdir.seqdev=atoi(str); ! 436: if(!fgets(str,128,stream)) break; ! 437: truncsp(str); ! 438: tmpdir.sort=atoi(str); ! 439: if(!fgets(str,128,stream)) break; ! 440: truncsp(str); ! 441: sprintf(tmpdir.ex_ar,"%.*s",LEN_ARSTR,str); ! 442: if(!fgets(str,128,stream)) break; ! 443: truncsp(str); ! 444: tmpdir.maxage=atoi(str); ! 445: if(!fgets(str,128,stream)) break; ! 446: truncsp(str); ! 447: tmpdir.up_pct=atoi(str); ! 448: if(!fgets(str,128,stream)) break; ! 449: truncsp(str); ! 450: tmpdir.dn_pct=atoi(str); ! 451: ! 452: ported++; ! 453: while(!feof(stream) ! 454: && strcmp(str,"***END-OF-DIR***")) { ! 455: if(!fgets(str,128,stream)) break; ! 456: truncsp(str); } } ! 457: ! 458: for(j=0;j<total_dirs;j++) { ! 459: if(dir[j]->lib!=i) ! 460: continue; ! 461: if(!stricmp(dir[j]->code,tmpdir.code)) ! 462: break; } ! 463: if(j==total_dirs) { ! 464: ! 465: if((dir=(dir_t **)REALLOC(dir ! 466: ,sizeof(dir_t *)*(total_dirs+1)))==NULL) { ! 467: errormsg(WHERE,ERR_ALLOC,"dir",total_dirs+1); ! 468: total_dirs=0; ! 469: bail(1); ! 470: break; } ! 471: ! 472: if((dir[j]=(dir_t *)MALLOC(sizeof(dir_t))) ! 473: ==NULL) { ! 474: errormsg(WHERE,ERR_ALLOC,"dir",sizeof(dir_t)); ! 475: break; } ! 476: memset(dir[j],0,sizeof(dir_t)); } ! 477: if(!k) ! 478: memcpy(dir[j],&tmpdir,sizeof(dir_t)); ! 479: else { ! 480: strcpy(dir[j]->code,tmpdir.code); ! 481: strcpy(dir[j]->sname,tmpdir.code); ! 482: strcpy(dir[j]->lname,tmpdir.lname); ! 483: if(j==total_dirs) { ! 484: dir[j]->maxfiles=1000; ! 485: dir[j]->up_pct=cdt_up_pct; ! 486: dir[j]->dn_pct=cdt_dn_pct; } ! 487: } ! 488: dir[j]->lib=i; ! 489: if(j==total_dirs) { ! 490: dir[j]->misc=tmpdir.misc; ! 491: total_dirs++; } ! 492: changes=1; } ! 493: fclose(stream); ! 494: upop(0); ! 495: sprintf(str,"%lu File Areas Imported Successfully",ported); ! 496: umsg(str); ! 497: break; ! 498: ! 499: case 6: ! 500: dir_cfg(i); ! 501: break; } } } ! 502: ! 503: } ! 504: ! 505: void dir_cfg(uint libnum) ! 506: { ! 507: static int dflt,bar,tog_dflt,tog_bar,adv_dflt,opt_dflt; ! 508: char str[81],str2[81],code[9],path[128],done=0,*p; ! 509: int j,n; ! 510: uint i,dirnum[MAX_OPTS+1]; ! 511: static dir_t savdir; ! 512: ! 513: while(1) { ! 514: for(i=0,j=0;i<total_dirs && j<MAX_OPTS;i++) ! 515: if(dir[i]->lib==libnum) { ! 516: sprintf(opt[j],"%-25s",dir[i]->lname); ! 517: dirnum[j++]=i; } ! 518: dirnum[j]=total_dirs; ! 519: opt[j][0]=0; ! 520: sprintf(str,"%s Directories",lib[libnum]->sname); ! 521: savnum=0; ! 522: i=WIN_SAV|WIN_ACT; ! 523: if(j) ! 524: i|=WIN_DEL|WIN_GET|WIN_DELACT; ! 525: if(j<MAX_OPTS) ! 526: i|=WIN_INS|WIN_INSACT|WIN_XTR; ! 527: if(savdir.sname[0]) ! 528: i|=WIN_PUT; ! 529: SETHELP(WHERE); ! 530: /* ! 531: &File Directories:& ! 532: ! 533: This is a list of file directories that have been configured for the ! 534: selected file library. ! 535: ! 536: To add a directory, select the desired position with the arrow keys and ! 537: hit INS . ! 538: ! 539: To delete a directory, select it with the arrow keys and hit DEL . ! 540: ! 541: To configure a directory, select it with the arrow keys and hit ENTER . ! 542: */ ! 543: i=ulist(i,24,1,45,&dflt,&bar,str,opt); ! 544: savnum=1; ! 545: if((signed)i==-1) ! 546: return; ! 547: if((i&MSK_ON)==MSK_INS) { ! 548: i&=MSK_OFF; ! 549: strcpy(str,"Games"); ! 550: SETHELP(WHERE); ! 551: /* ! 552: &Directory Long Name:& ! 553: ! 554: This is a description of the file directory which is displayed in all ! 555: directory listings. ! 556: */ ! 557: if(uinput(WIN_MID|WIN_SAV,0,0,"Directory Long Name",str,LEN_SLNAME ! 558: ,K_EDIT)<1) ! 559: continue; ! 560: sprintf(str2,"%.*s",LEN_SSNAME,str); ! 561: SETHELP(WHERE); ! 562: /* ! 563: &Directory Short Name:& ! 564: ! 565: This is a short description of the file directory which is displayed at ! 566: the file transfer prompt. ! 567: */ ! 568: if(uinput(WIN_MID|WIN_SAV,0,0,"Directory Short Name",str2,LEN_SSNAME ! 569: ,K_EDIT)<1) ! 570: continue; ! 571: sprintf(code,"%.8s",str2); ! 572: p=strchr(code,SP); ! 573: if(p) *p=0; ! 574: strupr(code); ! 575: SETHELP(WHERE); ! 576: /* ! 577: &Directory Internal Code:& ! 578: ! 579: Every directory must have its own unique code for Synchronet to refer to ! 580: it internally. This code should be descriptive of the directory's ! 581: contents, usually an abreviation of the directory's name. ! 582: */ ! 583: if(uinput(WIN_MID|WIN_SAV,0,0,"Directory Internal Code",code,8 ! 584: ,K_EDIT|K_UPPER)<1) ! 585: continue; ! 586: if(!code_ok(code)) { ! 587: helpbuf=invalid_code; ! 588: umsg("Invalid Code"); ! 589: helpbuf=0; ! 590: continue; } ! 591: sprintf(path,"%sDIRS\\%s",data_dir,code); ! 592: SETHELP(WHERE); ! 593: /* ! 594: &Directory File Path:& ! 595: ! 596: This is the drive and directory where your uploads to and downloads from ! 597: this directory will be stored. Example: &C:\XFER\GAMES& ! 598: */ ! 599: if(uinput(WIN_MID|WIN_SAV,0,0,"Directory File Path",path,50 ! 600: ,K_EDIT|K_UPPER)<1) ! 601: continue; ! 602: if((dir=(dir_t **)REALLOC(dir,sizeof(dir_t *)*(total_dirs+1)))==NULL) { ! 603: errormsg(WHERE,ERR_ALLOC,nulstr,total_dirs+1); ! 604: total_dirs=0; ! 605: bail(1); ! 606: continue; } ! 607: ! 608: if(j) ! 609: for(n=total_dirs;n>dirnum[i];n--) ! 610: dir[n]=dir[n-1]; ! 611: if((dir[dirnum[i]]=(dir_t *)MALLOC(sizeof(dir_t)))==NULL) { ! 612: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dir_t)); ! 613: continue; } ! 614: memset((dir_t *)dir[dirnum[i]],0,sizeof(dir_t)); ! 615: dir[dirnum[i]]->lib=libnum; ! 616: dir[dirnum[i]]->maxfiles=MAX_FILES<500 ? MAX_FILES:500; ! 617: if(strcmpi(str2,"OFFLINE")) ! 618: dir[dirnum[i]]->misc=(DIR_FCHK|DIR_MULT|DIR_DUPES ! 619: |DIR_CDTUL|DIR_CDTDL|DIR_DIZ); ! 620: strcpy(dir[dirnum[i]]->code,code); ! 621: strcpy(dir[dirnum[i]]->lname,str); ! 622: strcpy(dir[dirnum[i]]->sname,str2); ! 623: strcpy(dir[dirnum[i]]->path,path); ! 624: dir[dirnum[i]]->up_pct=cdt_up_pct; ! 625: dir[dirnum[i]]->dn_pct=cdt_dn_pct; ! 626: total_dirs++; ! 627: changes=1; ! 628: continue; } ! 629: if((i&MSK_ON)==MSK_DEL) { ! 630: i&=MSK_OFF; ! 631: SETHELP(WHERE); ! 632: /* ! 633: &Delete Directory Data Files:& ! 634: ! 635: If you want to delete all the database files for this directory, ! 636: select &Yes&. ! 637: */ ! 638: j=1; ! 639: strcpy(opt[0],"Yes"); ! 640: strcpy(opt[1],"No"); ! 641: opt[2][0]=0; ! 642: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 ! 643: ,"Delete Data in Sub-board",opt); ! 644: if(j==-1) ! 645: continue; ! 646: if(j==0) { ! 647: sprintf(str,"%s.*",dir[dirnum[i]]->code); ! 648: if(!dir[dirnum[i]]->data_dir[0]) ! 649: sprintf(tmp,"%sDIRS\\",data_dir); ! 650: else ! 651: strcpy(tmp,dir[dirnum[i]]->data_dir); ! 652: delfiles(tmp,str); } ! 653: FREE(dir[dirnum[i]]); ! 654: total_dirs--; ! 655: for(j=dirnum[i];j<total_dirs;j++) ! 656: dir[j]=dir[j+1]; ! 657: changes=1; ! 658: continue; } ! 659: if((i&MSK_ON)==MSK_GET) { ! 660: i&=MSK_OFF; ! 661: savdir=*dir[dirnum[i]]; ! 662: continue; } ! 663: if((i&MSK_ON)==MSK_PUT) { ! 664: i&=MSK_OFF; ! 665: *dir[dirnum[i]]=savdir; ! 666: dir[dirnum[i]]->lib=libnum; ! 667: changes=1; ! 668: continue; } ! 669: i=dirnum[dflt]; ! 670: j=0; ! 671: done=0; ! 672: while(!done) { ! 673: n=0; ! 674: sprintf(opt[n++],"%-27.27s%s","Long Name",dir[i]->lname); ! 675: sprintf(opt[n++],"%-27.27s%s","Short Name",dir[i]->sname); ! 676: sprintf(opt[n++],"%-27.27s%s","Internal Code",dir[i]->code); ! 677: sprintf(opt[n++],"%-27.27s%.40s","Access Requirements" ! 678: ,dir[i]->ar); ! 679: sprintf(opt[n++],"%-27.27s%.40s","Upload Requirements" ! 680: ,dir[i]->ul_ar); ! 681: sprintf(opt[n++],"%-27.27s%.40s","Download Requirements" ! 682: ,dir[i]->dl_ar); ! 683: sprintf(opt[n++],"%-27.27s%.40s","Operator Requirements" ! 684: ,dir[i]->op_ar); ! 685: sprintf(opt[n++],"%-27.27s%.40s","Exemption Requirements" ! 686: ,dir[i]->ex_ar); ! 687: sprintf(opt[n++],"%-27.27s%.40s","Transfer File Path" ! 688: ,dir[i]->path); ! 689: sprintf(opt[n++],"%-27.27s%u","Maximum Number of Files" ! 690: ,dir[i]->maxfiles); ! 691: if(dir[i]->maxage) ! 692: sprintf(str,"Enabled (%u days old)",dir[i]->maxage); ! 693: else ! 694: strcpy(str,"Disabled"); ! 695: sprintf(opt[n++],"%-27.27s%s","Purge by Age",str); ! 696: sprintf(opt[n++],"%-27.27s%u%%","Credit on Upload" ! 697: ,dir[i]->up_pct); ! 698: sprintf(opt[n++],"%-27.27s%u%%","Credit on Download" ! 699: ,dir[i]->dn_pct); ! 700: strcpy(opt[n++],"Toggle Options..."); ! 701: strcpy(opt[n++],"Advanced Options..."); ! 702: opt[n][0]=0; ! 703: sprintf(str,"%s Directory",dir[i]->sname); ! 704: SETHELP(WHERE); ! 705: /* ! 706: &Directory Configuration:& ! 707: ! 708: This menu allows you to configure the individual selected directory. ! 709: Options with a trailing &...& provide a sub-menu of more options. ! 710: */ ! 711: savnum=1; ! 712: switch(ulist(WIN_SAV|WIN_ACT|WIN_RHT|WIN_BOT ! 713: ,0,0,60,&opt_dflt,0,str,opt)) { ! 714: case -1: ! 715: done=1; ! 716: break; ! 717: case 0: ! 718: SETHELP(WHERE); ! 719: /* ! 720: &Directory Long Name:& ! 721: ! 722: This is a description of the file directory which is displayed in all ! 723: directory listings. ! 724: */ ! 725: strcpy(str,dir[i]->lname); /* save */ ! 726: if(!uinput(WIN_L2R|WIN_SAV,0,17,"Name to use for Listings" ! 727: ,dir[i]->lname,LEN_SLNAME,K_EDIT)) ! 728: strcpy(dir[i]->lname,str); ! 729: break; ! 730: case 1: ! 731: SETHELP(WHERE); ! 732: /* ! 733: &Directory Short Name:& ! 734: ! 735: This is a short description of the file directory which is displayed at ! 736: the file transfer prompt. ! 737: */ ! 738: uinput(WIN_L2R|WIN_SAV,0,17,"Name to use for Prompts" ! 739: ,dir[i]->sname,LEN_SSNAME,K_EDIT); ! 740: break; ! 741: case 2: ! 742: SETHELP(WHERE); ! 743: /* ! 744: &Directory Internal Code:& ! 745: ! 746: Every directory must have its own unique code for Synchronet to refer to ! 747: it internally. This code should be descriptive of the directory's ! 748: contents, usually an abreviation of the directory's name. ! 749: */ ! 750: strcpy(str,dir[i]->code); ! 751: uinput(WIN_L2R|WIN_SAV,0,17,"Internal Code (unique)" ! 752: ,str,8,K_EDIT|K_UPPER); ! 753: if(code_ok(str)) ! 754: strcpy(dir[i]->code,str); ! 755: else { ! 756: helpbuf=invalid_code; ! 757: umsg("Invalid Code"); ! 758: helpbuf=0; } ! 759: break; ! 760: case 3: ! 761: savnum=2; ! 762: sprintf(str,"%s Access",dir[i]->sname); ! 763: getar(str,dir[i]->ar); ! 764: break; ! 765: case 4: ! 766: savnum=2; ! 767: sprintf(str,"%s Upload",dir[i]->sname); ! 768: getar(str,dir[i]->ul_ar); ! 769: break; ! 770: case 5: ! 771: savnum=2; ! 772: sprintf(str,"%s Download",dir[i]->sname); ! 773: getar(str,dir[i]->dl_ar); ! 774: break; ! 775: case 6: ! 776: savnum=2; ! 777: sprintf(str,"%s Operator",dir[i]->sname); ! 778: getar(str,dir[i]->op_ar); ! 779: break; ! 780: case 7: ! 781: savnum=2; ! 782: sprintf(str,"%s Exemption",dir[i]->sname); ! 783: getar(str,dir[i]->ex_ar); ! 784: break; ! 785: case 8: ! 786: SETHELP(WHERE); ! 787: /* ! 788: &File Path:& ! 789: ! 790: This is the default storage path for files uploaded to this directory. ! 791: If this path is blank, files are stored in a directory off of the ! 792: DATA\DIRS directory using the internal code of this directory as the ! 793: name of the dirdirectory (i.e. DATA\DIRS\<CODE>). ! 794: ! 795: This path can be overridden on a per file basis using &Alternate File ! 796: Paths&. ! 797: */ ! 798: uinput(WIN_L2R|WIN_SAV,0,17,"File Path" ! 799: ,dir[i]->path,50,K_EDIT|K_UPPER); ! 800: break; ! 801: case 9: ! 802: SETHELP(WHERE); ! 803: /* ! 804: &Maximum Number of Files:& ! 805: ! 806: This value is the maximum number of files allowed in this directory. ! 807: */ ! 808: sprintf(str,"%u",dir[i]->maxfiles); ! 809: uinput(WIN_L2R|WIN_SAV,0,17,"Maximum Number of Files" ! 810: ,str,5,K_EDIT|K_NUMBER); ! 811: n=atoi(str); ! 812: if(n>MAX_FILES) { ! 813: sprintf(str,"Maximum Files is %u",MAX_FILES); ! 814: umsg(str); } ! 815: else ! 816: dir[i]->maxfiles=n; ! 817: break; ! 818: case 10: ! 819: sprintf(str,"%u",dir[i]->maxage); ! 820: SETHELP(WHERE); ! 821: /* ! 822: &Maximum Age of Files:& ! 823: ! 824: This value is the maximum number of days that files will be kept in ! 825: the directory based on the date the file was uploaded or last ! 826: downloaded (If the &Purge by Last Download& toggle option is used). ! 827: ! 828: The Synchronet file base maintenance program (&DELFILES&) must be used ! 829: to automatically remove files based on age. ! 830: */ ! 831: uinput(WIN_MID|WIN_SAV,0,17,"Maximum Age of Files (in days)" ! 832: ,str,5,K_EDIT|K_NUMBER); ! 833: dir[i]->maxage=atoi(str); ! 834: break; ! 835: case 11: ! 836: SETHELP(WHERE); ! 837: /* ! 838: &Percentage of Credits to Credit Uploader on Upload:& ! 839: ! 840: This is the percentage of a file's credit value that is given to users ! 841: when they upload files. Most often, this value will be set to &100& to ! 842: give full credit value (100%) for uploads. ! 843: ! 844: If you want uploaders to receive no credits upon upload, set this value ! 845: to &0&. ! 846: */ ! 847: uinput(WIN_MID|WIN_SAV,0,0 ! 848: ,"Percentage of Credits to Credit Uploader on Upload" ! 849: ,itoa(dir[i]->up_pct,tmp,10),4,K_EDIT|K_NUMBER); ! 850: dir[i]->up_pct=atoi(tmp); ! 851: break; ! 852: case 12: ! 853: SETHELP(WHERE); ! 854: /* ! 855: &Percentage of Credits to Credit Uploader on Download:& ! 856: ! 857: This is the percentage of a file's credit value that is given to users ! 858: who upload a file that is later downloaded by another user. This is an ! 859: award type system where more popular files will generate more credits ! 860: for the uploader. ! 861: ! 862: If you do not want uploaders to receive credit when files they upload ! 863: are later downloaded, set this value to &0&. ! 864: */ ! 865: uinput(WIN_MID|WIN_SAV,0,0 ! 866: ,"Percentage of Credits to Credit Uploader on Download" ! 867: ,itoa(dir[i]->dn_pct,tmp,10),4,K_EDIT|K_NUMBER); ! 868: dir[i]->dn_pct=atoi(tmp); ! 869: break; ! 870: case 13: ! 871: while(1) { ! 872: n=0; ! 873: sprintf(opt[n++],"%-27.27s%s","Check for File Existence" ! 874: ,dir[i]->misc&DIR_FCHK ? "Yes":"No"); ! 875: strcpy(str,"Slow Media Device"); ! 876: if(dir[i]->seqdev) { ! 877: sprintf(tmp," #%u",dir[i]->seqdev); ! 878: strcat(str,tmp); } ! 879: sprintf(opt[n++],"%-27.27s%s",str ! 880: ,dir[i]->seqdev ? "Yes":"No"); ! 881: sprintf(opt[n++],"%-27.27s%s","Force Content Ratings" ! 882: ,dir[i]->misc&DIR_RATE ? "Yes":"No"); ! 883: sprintf(opt[n++],"%-27.27s%s","Upload Date in Listings" ! 884: ,dir[i]->misc&DIR_ULDATE ? "Yes":"No"); ! 885: sprintf(opt[n++],"%-27.27s%s","Multiple File Numberings" ! 886: ,dir[i]->misc&DIR_MULT ? "Yes":"No"); ! 887: sprintf(opt[n++],"%-27.27s%s","Search for Duplicates" ! 888: ,dir[i]->misc&DIR_DUPES ? "Yes":"No"); ! 889: sprintf(opt[n++],"%-27.27s%s","Search for New Files" ! 890: ,dir[i]->misc&DIR_NOSCAN ? "No":"Yes"); ! 891: sprintf(opt[n++],"%-27.27s%s","Search for Auto-ADDFILES" ! 892: ,dir[i]->misc&DIR_NOAUTO ? "No":"Yes"); ! 893: sprintf(opt[n++],"%-27.27s%s","Import FILE_ID.DIZ" ! 894: ,dir[i]->misc&DIR_DIZ ? "Yes":"No"); ! 895: sprintf(opt[n++],"%-27.27s%s","Free Downloads" ! 896: ,dir[i]->misc&DIR_FREE ? "Yes":"No"); ! 897: sprintf(opt[n++],"%-27.27s%s","Free Download Time" ! 898: ,dir[i]->misc&DIR_TFREE ? "Yes":"No"); ! 899: sprintf(opt[n++],"%-27.27s%s","Deduct Upload Time" ! 900: ,dir[i]->misc&DIR_ULTIME ? "Yes":"No"); ! 901: sprintf(opt[n++],"%-27.27s%s","Credit Uploads" ! 902: ,dir[i]->misc&DIR_CDTUL ? "Yes":"No"); ! 903: sprintf(opt[n++],"%-27.27s%s","Credit Downloads" ! 904: ,dir[i]->misc&DIR_CDTDL ? "Yes":"No"); ! 905: sprintf(opt[n++],"%-27.27s%s","Credit with Minutes" ! 906: ,dir[i]->misc&DIR_CDTMIN ? "Yes":"No"); ! 907: sprintf(opt[n++],"%-27.27s%s","Anonymous Uploads" ! 908: ,dir[i]->misc&DIR_ANON ? dir[i]->misc&DIR_AONLY ! 909: ? "Only":"Yes":"No"); ! 910: sprintf(opt[n++],"%-27.27s%s","Purge by Last Download" ! 911: ,dir[i]->misc&DIR_SINCEDL ? "Yes":"No"); ! 912: sprintf(opt[n++],"%-27.27s%s","Mark Moved Files as New" ! 913: ,dir[i]->misc&DIR_MOVENEW ? "Yes":"No"); ! 914: opt[n][0]=0; ! 915: savnum=2; ! 916: SETHELP(WHERE); ! 917: /* ! 918: &Directory Toggle Options:& ! 919: ! 920: This is the toggle options menu for the selected file directory. ! 921: ! 922: The available options from this menu can all be toggled between two or ! 923: more states, such as &Yes& and &No&. ! 924: */ ! 925: n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,36,&tog_dflt ! 926: ,&tog_bar,"Toggle Options",opt); ! 927: if(n==-1) ! 928: break; ! 929: savnum=3; ! 930: switch(n) { ! 931: case 0: ! 932: n=0; ! 933: strcpy(opt[0],"Yes"); ! 934: strcpy(opt[1],"No"); ! 935: opt[2][0]=0; ! 936: SETHELP(WHERE); ! 937: /* ! 938: &Check for File Existence When Listing:& ! 939: ! 940: If you want the actual existence of files to be verified while listing ! 941: directories, set this value to &Yes&. ! 942: ! 943: Directories with files located on CD-ROM or other slow media should have ! 944: this option set to &No&. ! 945: */ ! 946: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 947: ,"Check for File Existence When Listing",opt); ! 948: if(n==0 && !(dir[i]->misc&DIR_FCHK)) { ! 949: dir[i]->misc|=DIR_FCHK; ! 950: changes=1; } ! 951: else if(n==1 && (dir[i]->misc&DIR_FCHK)) { ! 952: dir[i]->misc&=~DIR_FCHK; ! 953: changes=1; } ! 954: break; ! 955: case 1: ! 956: n=0; ! 957: strcpy(opt[0],"Yes"); ! 958: strcpy(opt[1],"No"); ! 959: opt[2][0]=0; ! 960: SETHELP(WHERE); ! 961: /* ! 962: &Slow Media Device:& ! 963: ! 964: If this directory contains files located on CD-ROM or other slow media ! 965: device, you should set this option to &Yes&. Each slow media device on ! 966: your system should have a unique &Device Number&. If you only have one ! 967: slow media device, then this number should be set to &1&. ! 968: ! 969: &CD-ROM multidisk changers& are considered &one& device and all the ! 970: directories on all the CD-ROMs in each changer should be set to the same ! 971: device number. ! 972: */ ! 973: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 974: ,"Slow Media Device" ! 975: ,opt); ! 976: if(n==0) { ! 977: if(!dir[i]->seqdev) { ! 978: changes=1; ! 979: strcpy(str,"1"); } ! 980: else ! 981: sprintf(str,"%u",dir[i]->seqdev); ! 982: uinput(WIN_MID|WIN_SAV,0,0 ! 983: ,"Device Number" ! 984: ,str,2,K_EDIT|K_UPPER); ! 985: dir[i]->seqdev=atoi(str); } ! 986: else if(n==1 && dir[i]->seqdev) { ! 987: dir[i]->seqdev=0; ! 988: changes=1; } ! 989: break; ! 990: case 2: ! 991: n=1; ! 992: strcpy(opt[0],"Yes"); ! 993: strcpy(opt[1],"No"); ! 994: opt[2][0]=0; ! 995: SETHELP(WHERE); ! 996: /* ! 997: &Force Content Ratings in Descriptions:& ! 998: ! 999: If you would like all uploads to this directory to be prompted for ! 1000: content rating (G, R, or X), set this value to &Yes&. ! 1001: */ ! 1002: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1003: ,"Force Content Ratings in Descriptions",opt); ! 1004: if(n==0 && !(dir[i]->misc&DIR_RATE)) { ! 1005: dir[i]->misc|=DIR_RATE; ! 1006: changes=1; } ! 1007: else if(n==1 && (dir[i]->misc&DIR_RATE)) { ! 1008: dir[i]->misc&=~DIR_RATE; ! 1009: changes=1; } ! 1010: break; ! 1011: case 3: ! 1012: n=1; ! 1013: strcpy(opt[0],"Yes"); ! 1014: strcpy(opt[1],"No"); ! 1015: opt[2][0]=0; ! 1016: SETHELP(WHERE); ! 1017: /* ! 1018: &Include Upload Date in File Descriptions:& ! 1019: ! 1020: If you wish the upload date of each file in this directory to be ! 1021: automatically included in the file description, set this option to ! 1022: &Yes&. ! 1023: */ ! 1024: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1025: ,"Include Upload Date in Descriptions",opt); ! 1026: if(n==0 && !(dir[i]->misc&DIR_ULDATE)) { ! 1027: dir[i]->misc|=DIR_ULDATE; ! 1028: changes=1; } ! 1029: else if(n==1 && (dir[i]->misc&DIR_ULDATE)) { ! 1030: dir[i]->misc&=~DIR_ULDATE; ! 1031: changes=1; } ! 1032: break; ! 1033: case 4: ! 1034: n=0; ! 1035: strcpy(opt[0],"Yes"); ! 1036: strcpy(opt[1],"No"); ! 1037: opt[2][0]=0; ! 1038: SETHELP(WHERE); ! 1039: /* ! 1040: &Ask for Multiple File Numberings:& ! 1041: ! 1042: If you would like uploads to this directory to be prompted for multiple ! 1043: file (disk) numbers, set this value to &Yes&. ! 1044: */ ! 1045: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1046: ,"Ask for Multiple File Numberings",opt); ! 1047: if(n==0 && !(dir[i]->misc&DIR_MULT)) { ! 1048: dir[i]->misc|=DIR_MULT; ! 1049: changes=1; } ! 1050: else if(n==1 && (dir[i]->misc&DIR_MULT)) { ! 1051: dir[i]->misc&=~DIR_MULT; ! 1052: changes=1; } ! 1053: break; ! 1054: case 5: ! 1055: n=0; ! 1056: strcpy(opt[0],"Yes"); ! 1057: strcpy(opt[1],"No"); ! 1058: opt[2][0]=0; ! 1059: SETHELP(WHERE); ! 1060: /* ! 1061: &Search Directory for Duplicate Filenames:& ! 1062: ! 1063: If you would like to have this directory searched for duplicate ! 1064: filenames when a user attempts to upload a file, set this option to &Yes&. ! 1065: */ ! 1066: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1067: ,"Search for Duplicate Filenames",opt); ! 1068: if(n==0 && !(dir[i]->misc&DIR_DUPES)) { ! 1069: dir[i]->misc|=DIR_DUPES; ! 1070: changes=1; } ! 1071: else if(n==1 && (dir[i]->misc&DIR_DUPES)) { ! 1072: dir[i]->misc&=~DIR_DUPES; ! 1073: changes=1; } ! 1074: break; ! 1075: case 6: ! 1076: n=0; ! 1077: strcpy(opt[0],"Yes"); ! 1078: strcpy(opt[1],"No"); ! 1079: opt[2][0]=0; ! 1080: SETHELP(WHERE); ! 1081: /* ! 1082: &Search Directory for New Files:& ! 1083: ! 1084: If you would like to have this directory searched for newly uploaded ! 1085: files when a user scans &All& libraries for new files, set this option to ! 1086: &Yes&. ! 1087: ! 1088: If this directory is located on &CD-ROM& or other read only media ! 1089: (where uploads are unlikely to occur), it will improve new file scans ! 1090: if this option is set to &No&. ! 1091: */ ! 1092: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1093: ,"Search for New files",opt); ! 1094: if(n==0 && dir[i]->misc&DIR_NOSCAN) { ! 1095: dir[i]->misc&=~DIR_NOSCAN; ! 1096: changes=1; } ! 1097: else if(n==1 && !(dir[i]->misc&DIR_NOSCAN)) { ! 1098: dir[i]->misc|=DIR_NOSCAN; ! 1099: changes=1; } ! 1100: break; ! 1101: case 7: ! 1102: n=0; ! 1103: strcpy(opt[0],"Yes"); ! 1104: strcpy(opt[1],"No"); ! 1105: opt[2][0]=0; ! 1106: SETHELP(WHERE); ! 1107: /* ! 1108: &Search Directory for Auto-ADDFILES:& ! 1109: ! 1110: If you would like to have this directory searched for a file list to ! 1111: import automatically when using the &ADDFILES *& (Auto-ADD) feature, ! 1112: set this option to &Yes&. ! 1113: */ ! 1114: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1115: ,"Search for Auto-ADDFILES",opt); ! 1116: if(n==0 && dir[i]->misc&DIR_NOAUTO) { ! 1117: dir[i]->misc&=~DIR_NOAUTO; ! 1118: changes=1; } ! 1119: else if(n==1 && !(dir[i]->misc&DIR_NOAUTO)) { ! 1120: dir[i]->misc|=DIR_NOAUTO; ! 1121: changes=1; } ! 1122: break; ! 1123: case 8: ! 1124: n=0; ! 1125: strcpy(opt[0],"Yes"); ! 1126: strcpy(opt[1],"No"); ! 1127: opt[2][0]=0; ! 1128: SETHELP(WHERE); ! 1129: /* ! 1130: &Import FILE_ID.DIZ and DESC.SDI Descriptions:& ! 1131: ! 1132: If you would like archived descriptions (&FILE_ID.DIZ& and &DESC.SDI&) ! 1133: of uploaded files to be automatically imported as the extended ! 1134: description, set this option to &Yes&. ! 1135: */ ! 1136: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1137: ,"Import FILE_ID.DIZ and DESC.SDI",opt); ! 1138: if(n==0 && !(dir[i]->misc&DIR_DIZ)) { ! 1139: dir[i]->misc|=DIR_DIZ; ! 1140: changes=1; } ! 1141: else if(n==1 && (dir[i]->misc&DIR_DIZ)) { ! 1142: dir[i]->misc&=~DIR_DIZ; ! 1143: changes=1; } ! 1144: break; ! 1145: case 9: ! 1146: n=1; ! 1147: strcpy(opt[0],"Yes"); ! 1148: strcpy(opt[1],"No"); ! 1149: opt[2][0]=0; ! 1150: SETHELP(WHERE); ! 1151: /* ! 1152: &Downloads are Free:& ! 1153: ! 1154: If you would like all downloads from this directory to be free (cost ! 1155: no credits), set this option to &Yes&. ! 1156: */ ! 1157: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1158: ,"Downloads are Free",opt); ! 1159: if(n==0 && !(dir[i]->misc&DIR_FREE)) { ! 1160: dir[i]->misc|=DIR_FREE; ! 1161: changes=1; } ! 1162: else if(n==1 && (dir[i]->misc&DIR_FREE)) { ! 1163: dir[i]->misc&=~DIR_FREE; ! 1164: changes=1; } ! 1165: break; ! 1166: case 10: ! 1167: n=1; ! 1168: strcpy(opt[0],"Yes"); ! 1169: strcpy(opt[1],"No"); ! 1170: opt[2][0]=0; ! 1171: SETHELP(WHERE); ! 1172: /* ! 1173: &Free Download Time:& ! 1174: ! 1175: If you would like all downloads from this directory to not subtract ! 1176: time from the user, set this option to &Yes&. ! 1177: */ ! 1178: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1179: ,"Free Download Time",opt); ! 1180: if(n==0 && !(dir[i]->misc&DIR_TFREE)) { ! 1181: dir[i]->misc|=DIR_TFREE; ! 1182: changes=1; } ! 1183: else if(n==1 && (dir[i]->misc&DIR_TFREE)) { ! 1184: dir[i]->misc&=~DIR_TFREE; ! 1185: changes=1; } ! 1186: break; ! 1187: case 11: ! 1188: n=1; ! 1189: strcpy(opt[0],"Yes"); ! 1190: strcpy(opt[1],"No"); ! 1191: opt[2][0]=0; ! 1192: SETHELP(WHERE); ! 1193: /* ! 1194: &Deduct Upload Time:& ! 1195: ! 1196: If you would like all uploads to this directory to have the time spent ! 1197: uploading subtracted from their time online, set this option to &Yes&. ! 1198: */ ! 1199: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1200: ,"Deduct Upload Time",opt); ! 1201: if(n==0 && !(dir[i]->misc&DIR_ULTIME)) { ! 1202: dir[i]->misc|=DIR_ULTIME; ! 1203: changes=1; } ! 1204: else if(n==1 && (dir[i]->misc&DIR_ULTIME)) { ! 1205: dir[i]->misc&=~DIR_ULTIME; ! 1206: changes=1; } ! 1207: break; ! 1208: case 12: ! 1209: n=0; ! 1210: strcpy(opt[0],"Yes"); ! 1211: strcpy(opt[1],"No"); ! 1212: opt[2][0]=0; ! 1213: SETHELP(WHERE); ! 1214: /* ! 1215: &Give Credit for Uploads:& ! 1216: ! 1217: If you want users who upload to this directory to get credit for their ! 1218: initial upload, set this option to &Yes&. ! 1219: */ ! 1220: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1221: ,"Give Credit for Uploads",opt); ! 1222: if(n==0 && !(dir[i]->misc&DIR_CDTUL)) { ! 1223: dir[i]->misc|=DIR_CDTUL; ! 1224: changes=1; } ! 1225: else if(n==1 && (dir[i]->misc&DIR_CDTUL)) { ! 1226: dir[i]->misc&=~DIR_CDTUL; ! 1227: changes=1; } ! 1228: break; ! 1229: case 13: ! 1230: n=0; ! 1231: strcpy(opt[0],"Yes"); ! 1232: strcpy(opt[1],"No"); ! 1233: opt[2][0]=0; ! 1234: SETHELP(WHERE); ! 1235: /* ! 1236: &Give Uploader Credit for Downloads:& ! 1237: ! 1238: If you want users who upload to this directory to get credit when their ! 1239: files are downloaded, set this optin to &Yes&. ! 1240: */ ! 1241: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1242: ,"Give Uploader Credit for Downloads",opt); ! 1243: if(n==0 && !(dir[i]->misc&DIR_CDTDL)) { ! 1244: dir[i]->misc|=DIR_CDTDL; ! 1245: changes=1; } ! 1246: else if(n==1 && (dir[i]->misc&DIR_CDTDL)) { ! 1247: dir[i]->misc&=~DIR_CDTDL; ! 1248: changes=1; } ! 1249: break; ! 1250: case 14: ! 1251: n=1; ! 1252: strcpy(opt[0],"Yes"); ! 1253: strcpy(opt[1],"No"); ! 1254: opt[2][0]=0; ! 1255: SETHELP(WHERE); ! 1256: /* ! 1257: &Credit Uploader with Minutes instead of Credits:& ! 1258: ! 1259: If you wish to give the uploader of files to this directory minutes, ! 1260: intead of credits, set this option to &Yes&. ! 1261: */ ! 1262: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1263: ,"Credit Uploader with Minutes",opt); ! 1264: if(n==0 && !(dir[i]->misc&DIR_CDTMIN)) { ! 1265: dir[i]->misc|=DIR_CDTMIN; ! 1266: changes=1; } ! 1267: else if(n==1 && dir[i]->misc&DIR_CDTMIN){ ! 1268: dir[i]->misc&=~DIR_CDTMIN; ! 1269: changes=1; } ! 1270: break; ! 1271: ! 1272: case 15: ! 1273: n=1; ! 1274: strcpy(opt[0],"Yes"); ! 1275: strcpy(opt[1],"No"); ! 1276: strcpy(opt[2],"Only"); ! 1277: opt[3][0]=0; ! 1278: SETHELP(WHERE); ! 1279: /* ! 1280: &Allow Anonymous Uploads:& ! 1281: ! 1282: If you want users with the &A& exemption to be able to upload anonymously ! 1283: to this directory, set this option to &Yes&. If you want all uploads to ! 1284: this directory to be forced anonymous, set this option to &Only&. ! 1285: */ ! 1286: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1287: ,"Allow Anonymous Uploads",opt); ! 1288: if(n==0 && (dir[i]->misc&(DIR_ANON|DIR_AONLY)) ! 1289: !=DIR_ANON) { ! 1290: dir[i]->misc|=DIR_ANON; ! 1291: dir[i]->misc&=~DIR_AONLY; ! 1292: changes=1; } ! 1293: else if(n==1 && dir[i]->misc&(DIR_ANON|DIR_AONLY)){ ! 1294: dir[i]->misc&=~(DIR_ANON|DIR_AONLY); ! 1295: changes=1; } ! 1296: else if(n==2 && (dir[i]->misc&(DIR_ANON|DIR_AONLY)) ! 1297: !=(DIR_ANON|DIR_AONLY)) { ! 1298: dir[i]->misc|=(DIR_ANON|DIR_AONLY); ! 1299: changes=1; } ! 1300: break; ! 1301: case 16: ! 1302: n=0; ! 1303: strcpy(opt[0],"Yes"); ! 1304: strcpy(opt[1],"No"); ! 1305: opt[2][0]=0; ! 1306: SETHELP(WHERE); ! 1307: /* ! 1308: &Purge Files Based on Date of Last Download:& ! 1309: ! 1310: Using the Synchronet file base maintenance utility (&DELFILES&), you can ! 1311: have files removed based on the number of days since last downloaded ! 1312: rather than the number of days since the file was uploaded (default), ! 1313: by setting this option to &Yes&. ! 1314: */ ! 1315: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1316: ,"Purge Files Based on Date of Last Download" ! 1317: ,opt); ! 1318: if(n==0 && !(dir[i]->misc&DIR_SINCEDL)) { ! 1319: dir[i]->misc|=DIR_SINCEDL; ! 1320: changes=1; } ! 1321: else if(n==1 && (dir[i]->misc&DIR_SINCEDL)) { ! 1322: dir[i]->misc&=~DIR_SINCEDL; ! 1323: changes=1; } ! 1324: break; ! 1325: case 17: ! 1326: n=0; ! 1327: strcpy(opt[0],"Yes"); ! 1328: strcpy(opt[1],"No"); ! 1329: opt[2][0]=0; ! 1330: SETHELP(WHERE); ! 1331: /* ! 1332: &Mark Moved Files as New:& ! 1333: ! 1334: If this option is set to &Yes&, then all files moved &from& this directory ! 1335: will have their upload date changed to the current date so the file will ! 1336: appear in users' new-file scans again. ! 1337: */ ! 1338: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1339: ,"Mark Moved Files as New" ! 1340: ,opt); ! 1341: if(n==0 && !(dir[i]->misc&DIR_MOVENEW)) { ! 1342: dir[i]->misc|=DIR_MOVENEW; ! 1343: changes=1; } ! 1344: else if(n==1 && (dir[i]->misc&DIR_MOVENEW)) { ! 1345: dir[i]->misc&=~DIR_MOVENEW; ! 1346: changes=1; } ! 1347: break; ! 1348: } } ! 1349: break; ! 1350: case 14: ! 1351: while(1) { ! 1352: n=0; ! 1353: sprintf(opt[n++],"%-27.27s%s","Extensions Allowed" ! 1354: ,dir[i]->exts); ! 1355: if(!dir[i]->data_dir[0]) ! 1356: sprintf(str,"%sDIRS\\",data_dir); ! 1357: else ! 1358: strcpy(str,dir[i]->data_dir); ! 1359: sprintf(opt[n++],"%-27.27s%.40s","Data Directory" ! 1360: ,str); ! 1361: sprintf(opt[n++],"%-27.27s%.40s","Upload Semaphore File" ! 1362: ,dir[i]->upload_sem); ! 1363: sprintf(opt[n++],"%-27.27s%s","Sort Value and Direction" ! 1364: , dir[i]->sort==SORT_NAME_A ? "Name Ascending" ! 1365: : dir[i]->sort==SORT_NAME_D ? "Name Descending" ! 1366: : dir[i]->sort==SORT_DATE_A ? "Date Ascending" ! 1367: : "Date Descending"); ! 1368: opt[n][0]=0; ! 1369: savnum=2; ! 1370: SETHELP(WHERE); ! 1371: /* ! 1372: &Directory Advanced Options:& ! 1373: ! 1374: This is the advanced options menu for the selected file directory. ! 1375: */ ! 1376: n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,4,60,&adv_dflt,0 ! 1377: ,"Advanced Options",opt); ! 1378: if(n==-1) ! 1379: break; ! 1380: savnum=3; ! 1381: switch(n) { ! 1382: case 0: ! 1383: SETHELP(WHERE); ! 1384: /* ! 1385: &File Extensions Allowed:& ! 1386: ! 1387: This option allows you to limit the types of files uploaded to this ! 1388: directory. This is a list of file extensions that are allowed, each ! 1389: separated by a comma (Example: &ZIP,EXE&). If this option is left ! 1390: blank, all file extensions will be allowed to be uploaded. ! 1391: */ ! 1392: uinput(WIN_L2R|WIN_SAV,0,17 ! 1393: ,"File Extensions Allowed" ! 1394: ,dir[i]->exts,40,K_EDIT|K_UPPER); ! 1395: break; ! 1396: case 1: ! 1397: SETHELP(WHERE); ! 1398: /* ! 1399: &Data Directory:& ! 1400: ! 1401: Use this if you wish to place the data directory for this directory ! 1402: on another drive or in another directory besides the default setting. ! 1403: */ ! 1404: uinput(WIN_MID|WIN_SAV,0,17,"Data" ! 1405: ,dir[i]->data_dir,50,K_EDIT|K_UPPER); ! 1406: break; ! 1407: case 2: ! 1408: SETHELP(WHERE); ! 1409: /* ! 1410: &Upload Semaphore File:& ! 1411: ! 1412: This is a filename that will be used as a semaphore (signal) to your ! 1413: FidoNet front-end that new files are ready to be hatched for export. ! 1414: */ ! 1415: uinput(WIN_MID|WIN_SAV,0,17,"Upload Semaphore" ! 1416: ,dir[i]->upload_sem,50,K_EDIT|K_UPPER); ! 1417: break; ! 1418: case 3: ! 1419: n=0; ! 1420: strcpy(opt[0],"Name Ascending"); ! 1421: strcpy(opt[1],"Name Descending"); ! 1422: strcpy(opt[2],"Date Ascending"); ! 1423: strcpy(opt[3],"Date Descending"); ! 1424: opt[4][0]=0; ! 1425: SETHELP(WHERE); ! 1426: /* ! 1427: &Sort Value and Direction:& ! 1428: ! 1429: This option allows you to determine the sort value and direction. Files ! 1430: that are uploaded are automatically sorted by filename or upload date, ! 1431: ascending or descending. If you change the sort value or direction after ! 1432: a directory already has files in it, use the sysop transfer menu &;RESORT& ! 1433: command to resort the directory with the new sort parameters. ! 1434: */ ! 1435: n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 ! 1436: ,"Sort Value and Direction",opt); ! 1437: if(n==0 && dir[i]->sort!=SORT_NAME_A) { ! 1438: dir[i]->sort=SORT_NAME_A; ! 1439: changes=1; } ! 1440: else if(n==1 && dir[i]->sort!=SORT_NAME_D) { ! 1441: dir[i]->sort=SORT_NAME_D; ! 1442: changes=1; } ! 1443: else if(n==2 && dir[i]->sort!=SORT_DATE_A) { ! 1444: dir[i]->sort=SORT_DATE_A; ! 1445: changes=1; } ! 1446: else if(n==3 && dir[i]->sort!=SORT_DATE_D) { ! 1447: dir[i]->sort=SORT_DATE_D; ! 1448: changes=1; } ! 1449: break; } } ! 1450: break; ! 1451: } } } ! 1452: ! 1453: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.