Annotation of sbbs/sbbs2/scfg/scfgxfr2.c, revision 1.1.1.1

1.1       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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.