Annotation of sbbs/sbbs3/uedit/uedit.c, revision 1.1

1.1     ! root        1: /* uedit.c */
        !             2: 
        !             3: /* Synchronet for *nix user editor */
        !             4: 
        !             5: /* $Id: uedit.c,v 1.38 2004/10/27 04:28:29 deuce Exp $ */
        !             6: 
        !             7: /****************************************************************************
        !             8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
        !             9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
        !            10:  *                                                                                                                                                     *
        !            11:  * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html         *
        !            12:  *                                                                                                                                                     *
        !            13:  * This program is free software; you can redistribute it and/or                       *
        !            14:  * modify it under the terms of the GNU General Public License                         *
        !            15:  * as published by the Free Software Foundation; either version 2                      *
        !            16:  * of the License, or (at your option) any later version.                                      *
        !            17:  * See the GNU General Public License for more details: gpl.txt or                     *
        !            18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
        !            19:  *                                                                                                                                                     *
        !            20:  * Anonymous FTP access to the most recent released source is available at     *
        !            21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
        !            22:  *                                                                                                                                                     *
        !            23:  * Anonymous CVS access to the development source and modification history     *
        !            24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
        !            25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
        !            26:  *     (just hit return, no password is necessary)                                                     *
        !            27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
        !            28:  *                                                                                                                                                     *
        !            29:  * For Synchronet coding style and modification guidelines, see                                *
        !            30:  * http://www.synchro.net/source.html                                                                          *
        !            31:  *                                                                                                                                                     *
        !            32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
        !            33:  * format) via e-mail to [email protected]                                                                      *
        !            34:  *                                                                                                                                                     *
        !            35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
        !            36:  ****************************************************************************/
        !            37: 
        !            38: #include "ciolib.h"
        !            39: #define __COLORS       1
        !            40: #include "sbbs.h"
        !            41: #include <sys/types.h>
        !            42: #include <time.h>
        !            43: #ifdef __QNX__
        !            44: #include <string.h>
        !            45: #endif
        !            46: #include <stdio.h>
        !            47: #ifdef __unix__
        !            48: #include <unistd.h>
        !            49: #include <sys/time.h>
        !            50: #include <signal.h>
        !            51: #endif
        !            52: 
        !            53: #include "genwrap.h"
        !            54: #include "uifc.h"
        !            55: #include "sbbsdefs.h"
        !            56: #include "genwrap.h"   /* stricmp */
        !            57: #include "dirwrap.h"   /* lock/unlock/sopen */
        !            58: #include "filewrap.h"  /* lock/unlock/sopen */
        !            59: #include "sbbs_ini.h"  /* INI parsing */
        !            60: #include "scfglib.h"   /* SCFG files */
        !            61: #include "ars_defs.h"  /* needed for SCFG files */
        !            62: #include "userdat.h"   /* getnodedat() */
        !            63: 
        !            64: #define CTRL(x) (x&037)
        !            65: 
        !            66: struct user_list {
        !            67:        char    info[MAX_OPLN];
        !            68:        int             usernum;
        !            69: };
        !            70: 
        !            71: /********************/
        !            72: /* Global Variables */
        !            73: /********************/
        !            74: uifcapi_t uifc; /* User Interface (UIFC) Library API */
        !            75: char YesStr[]="Yes";
        !            76: char NoStr[]="No";
        !            77: 
        !            78: /*
        !            79:  * Find the first occurrence of find in s, ignore case.
        !            80:  * From FreeBSD src/lib/libc/string/strcasestr.c
        !            81:  */
        !            82: char *
        !            83: strcasestr(const char *s, const char *find)
        !            84: {
        !            85:        char c, sc;
        !            86:        size_t len;
        !            87: 
        !            88:        if ((c = *find++) != 0) {
        !            89:                c = tolower((unsigned char)c);
        !            90:                len = strlen(find);
        !            91:                do {
        !            92:                        do {
        !            93:                                if ((sc = *s++) == 0)
        !            94:                                        return (NULL);
        !            95:                        } while ((char)tolower((unsigned char)sc) != c);
        !            96:                } while (strnicmp(s, find, len) != 0);
        !            97:                s--;
        !            98:        }
        !            99:        return ((char *)s);
        !           100: }
        !           101: 
        !           102: int lprintf(char *fmt, ...)
        !           103: {
        !           104:        va_list argptr;
        !           105:        char sbuf[1024];
        !           106:        int     len;
        !           107: 
        !           108:        va_start(argptr,fmt);
        !           109:        len=vsnprintf(sbuf,sizeof(sbuf),fmt,argptr);
        !           110:        sbuf[sizeof(sbuf)-1]=0;
        !           111:        va_end(argptr);
        !           112:        uifc.msg(sbuf);
        !           113:        return(len);
        !           114: }
        !           115: 
        !           116: void bail(int code)
        !           117: {
        !           118:     if(code) {
        !           119:         puts("\nHit a key...");
        !           120:         getch();
        !           121:        }
        !           122:     uifc.bail();
        !           123: 
        !           124:     exit(code);
        !           125: }
        !           126: 
        !           127: void allocfail(uint size)
        !           128: {
        !           129:     printf("\7Error allocating %u bytes of memory.\n",size);
        !           130:     bail(1);
        !           131: }
        !           132: 
        !           133: void freeopt(char** opt)
        !           134: {
        !           135:        int i;
        !           136: 
        !           137:        for(i=0;i<(MAX_OPTS+1);i++)
        !           138:                free(opt[i]);
        !           139: 
        !           140:        free(opt);
        !           141: }
        !           142: 
        !           143: int confirm(char *prompt)
        !           144: {
        !           145:        int i=0;
        !           146:        char *opt[3]={
        !           147:                 YesStr
        !           148:                ,NoStr
        !           149:                ,""
        !           150:        };
        !           151: 
        !           152:        i=uifc.list(WIN_MID|WIN_ACT|WIN_SAV,0,0,0,&i,0,prompt,opt);
        !           153:        if(i==0)
        !           154:                return(1);
        !           155:        if(i==-1)
        !           156:                return(-1);
        !           157:        return(0);
        !           158: }
        !           159: 
        !           160: /****************************************************************************/
        !           161: /* Takes a string in the format HH:MM:SS and returns in seconds             */
        !           162: /****************************************************************************/
        !           163: time_t DLLCALL strtosec(char *str)
        !           164: {
        !           165:        char *p1;
        !           166:        char *p2;
        !           167:        long int hour=0;
        !           168:        long int min=0;
        !           169:        long int sec2=0;
        !           170:        time_t  sec=0;
        !           171: 
        !           172:        hour=strtol(str,&p1,10);
        !           173:        if(hour<0 || hour > 24)
        !           174:                return(-1);
        !           175:        if(*p1==':') {
        !           176:                p1++;
        !           177:                min=strtol(p1,&p2,10);
        !           178:                if(min<0 || min > 59)
        !           179:                        return(-1);
        !           180:                if(*p2==':') {
        !           181:                        p2++;
        !           182:                        sec2=strtol(p2,&p1,10);
        !           183:                        if(sec2 < 0 || sec2 > 59)
        !           184:                                return(-1);
        !           185:                }
        !           186:        }
        !           187: 
        !           188:        sec=hour*60*60;
        !           189:        sec+=min*60;
        !           190:        sec+=sec2;
        !           191:        return(sec);
        !           192: }
        !           193: 
        !           194: char *geteditor(char *edit)
        !           195: {
        !           196:        if(getenv("EDITOR")==NULL && (getenv("VISUAL")==NULL || getenv("DISPLAY")==NULL))
        !           197: #ifdef __unix__
        !           198:                strcpy(edit,"vi");
        !           199: #else
        !           200:                strcpy(edit,"notepad");
        !           201: #endif
        !           202:        else {
        !           203:                if(getenv("DISPLAY")!=NULL && getenv("VISUAL")!=NULL)
        !           204:                        strcpy(edit,getenv("VISUAL"));
        !           205:                else
        !           206:                        strcpy(edit,getenv("EDITOR"));
        !           207:        }
        !           208:        return(edit);
        !           209: }
        !           210: 
        !           211: int do_cmd(char *cmd)
        !           212: {
        !           213:        int i;
        !           214: 
        !           215: #ifdef __unix__
        !           216:        endwin();
        !           217: #endif
        !           218:        i=system(cmd);
        !           219: #ifdef __unix__
        !           220:        refresh();
        !           221: #endif
        !           222:        return(i);
        !           223: }
        !           224: 
        !           225: /* Edit terminal settings
        !           226:  *       Auto-Detect
        !           227:  *       Extended ASCII
        !           228:  *       ANSI
        !           229:  *       Color
        !           230:  *       RIP
        !           231:  *       WIP
        !           232:  *       Pause
        !           233:  *       Hot Keys
        !           234:  *       Spinning Cursor
        !           235:  *       Number of Rows
        !           236:  */
        !           237: int edit_terminal(scfg_t *cfg, user_t *user)
        !           238: {
        !           239:        int     i,j;
        !           240:        char    **opt;
        !           241:        char    str[256];
        !           242: 
        !           243:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           244:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           245:        for(i=0;i<(MAX_OPTS+1);i++)
        !           246:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !           247:                        allocfail(MAX_OPLN);
        !           248: 
        !           249:        j=0;
        !           250:        while(1) {
        !           251:                getuserdat(cfg,user);
        !           252:                i=0;
        !           253:                sprintf(opt[i++],"Auto-detect      %s",user->misc & AUTOTERM?"Yes":"No");
        !           254:                sprintf(opt[i++],"Extended ASCII   %s",user->misc & NO_EXASCII?"No":"Yes");
        !           255:                sprintf(opt[i++],"ANSI             %s",user->misc & ANSI?"Yes":"No");
        !           256:                sprintf(opt[i++],"Color            %s",user->misc & COLOR?"Yes":"No");
        !           257:                sprintf(opt[i++],"RIP              %s",user->misc & RIP?"Yes":"No");
        !           258:                sprintf(opt[i++],"WIP              %s",user->misc & WIP?"Yes":"No");
        !           259:                sprintf(opt[i++],"Pause            %s",user->misc & UPAUSE?"Yes":"No");
        !           260:                sprintf(opt[i++],"Hot Keys         %s",user->misc & COLDKEYS?"No":"Yes");
        !           261:                sprintf(opt[i++],"Spinning Cursor  %s",user->misc & SPIN?"Yes":"No");
        !           262:                sprintf(str,"%u",user->rows);
        !           263:                sprintf(opt[i++],"Number of Rows   %s",user->rows?str:"Auto");
        !           264:                opt[i][0]=0;
        !           265:                switch(uifc.list(WIN_MID|WIN_ACT|WIN_SAV,0,0,0,&j,0,"Terminal Settings",opt)) {
        !           266:                        case -1:
        !           267:                                freeopt(opt);
        !           268:                                return(0);
        !           269:                                break;
        !           270:                        case 0:
        !           271:                                /* Auto-detect */
        !           272:                                user->misc ^= AUTOTERM;
        !           273:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           274:                                break;
        !           275:                        case 1:
        !           276:                                /* EX-ASCII */
        !           277:                                user->misc ^= NO_EXASCII;
        !           278:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           279:                                break;
        !           280:                        case 2:
        !           281:                                /* ANSI */
        !           282:                                user->misc ^= ANSI;
        !           283:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           284:                                break;
        !           285:                        case 3:
        !           286:                                /* Colour */
        !           287:                                user->misc ^= COLOR;
        !           288:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           289:                                break;
        !           290:                        case 4:
        !           291:                                /* RIP */
        !           292:                                user->misc ^= RIP;
        !           293:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           294:                                break;
        !           295:                        case 5:
        !           296:                                /* WIP */
        !           297:                                user->misc ^= WIP;
        !           298:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           299:                                break;
        !           300:                        case 6:
        !           301:                                /* Pause */
        !           302:                                user->misc ^= UPAUSE;
        !           303:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           304:                                break;
        !           305:                        case 7:
        !           306:                                /* Hot Keys */
        !           307:                                user->misc ^= COLDKEYS;
        !           308:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           309:                                break;
        !           310:                        case 8:
        !           311:                                /* Spinning Cursor */
        !           312:                                user->misc ^= SPIN;
        !           313:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           314:                                break;
        !           315:                        case 9:
        !           316:                                /* Rows */
        !           317:                                sprintf(str,"%u",user->rows);
        !           318:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Rows",str,2,K_EDIT|K_NUMBER);
        !           319:                                if(uifc.changes) {
        !           320:                                        user->rows=strtoul(str,NULL,10);
        !           321:                                        putuserrec(cfg,user->number,U_ROWS,2,ultoa(user->rows,str,10));
        !           322:                                }
        !           323:                                break;
        !           324:                }
        !           325:        }
        !           326:        return(0);
        !           327: }
        !           328: 
        !           329: /* Edit Logon settings
        !           330:  *       Ask for New Message Scan
        !           331:  *       Ask for Your Message Scan
        !           332:  *       Remember Current Sub-board
        !           333:  *       Quiet Mode (Q exempt)
        !           334:  *       Auto-Login via IP (V exempt)
        !           335:  */
        !           336: int edit_logon(scfg_t *cfg, user_t *user)
        !           337: {
        !           338:        int     i,j;
        !           339:        char    **opt;
        !           340:        char    str[256];
        !           341: 
        !           342:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           343:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           344:        for(i=0;i<(MAX_OPTS+1);i++)
        !           345:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !           346:                        allocfail(MAX_OPLN);
        !           347: 
        !           348:        j=0;
        !           349:        while(1) {
        !           350:                i=0;
        !           351:                getuserdat(cfg,user);
        !           352:                sprintf(opt[i++],"Ask for New Message Scan     %s",user->misc & ASK_NSCAN?"Yes":"No");
        !           353:                sprintf(opt[i++],"Ask for Your Message Scan    %s",user->misc & ASK_SSCAN?"Yes":"No");
        !           354:                sprintf(opt[i++],"Remember Current Sub         %s",user->misc & CURSUB?"Yes":"No");
        !           355:                sprintf(opt[i++],"Quiet Mode  (Q exempt)       %s",user->misc & QUIET?"Yes":"No");
        !           356:                sprintf(opt[i++],"Auto-Login via IP (V exempt) %s",user->misc & AUTOLOGON?"Yes":"No");
        !           357:                opt[i][0]=0;
        !           358:                switch(uifc.list(WIN_MID|WIN_ACT|WIN_SAV,0,0,0,&j,0,"Logon Settings",opt)) {
        !           359:                        case -1:
        !           360:                                freeopt(opt);
        !           361:                                return(0);
        !           362:                                break;
        !           363:                        case 0:
        !           364:                                /* Ask New MSG Scan */
        !           365:                                user->misc ^= ASK_NSCAN;
        !           366:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           367:                                break;
        !           368:                        case 1:
        !           369:                                /* Ask YOUR MSG scan */
        !           370:                                user->misc ^= ASK_SSCAN;
        !           371:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           372:                                break;
        !           373:                        case 2:
        !           374:                                /* Remember Curr Sub */
        !           375:                                user->misc ^= CURSUB;
        !           376:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           377:                                break;
        !           378:                        case 3:
        !           379:                                /* Quiet Mode */
        !           380:                                user->misc ^= QUIET;
        !           381:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           382:                                break;
        !           383:                        case 4:
        !           384:                                /* Auto-Login by IP */
        !           385:                                user->misc ^= AUTOLOGON;
        !           386:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           387:                                break;
        !           388:                }
        !           389:        }
        !           390:        return(0);
        !           391: }
        !           392: 
        !           393: /* Edit Chat Settings
        !           394:  *       Multinode Chat Echo
        !           395:  *       Multinode Chat Actions
        !           396:  *       Available for Internode chat
        !           397:  *       Multinode Activity Alerts
        !           398:  *       Split-screen Private Chat
        !           399:  */
        !           400: int edit_chat(scfg_t *cfg, user_t *user)
        !           401: {
        !           402:        int     i,j;
        !           403:        char    **opt;
        !           404:        char    str[256];
        !           405: 
        !           406:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           407:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           408:        for(i=0;i<(MAX_OPTS+1);i++)
        !           409:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !           410:                        allocfail(MAX_OPLN);
        !           411: 
        !           412:        j=0;
        !           413:        while(1) {
        !           414:                i=0;
        !           415:                getuserdat(cfg,user);
        !           416:                sprintf(opt[i++],"Chat Echo                  %s",user->chat & CHAT_ECHO?"Yes":"No");
        !           417:                sprintf(opt[i++],"Chat Actions               %s",user->chat & CHAT_ACTION?"Yes":"No");
        !           418:                sprintf(opt[i++],"Available for Chat         %s",user->chat & CHAT_NOPAGE?"No":"Yes");
        !           419:                sprintf(opt[i++],"Activity Alerts            %s",user->chat & CHAT_NOACT?"No":"Yes");
        !           420:                sprintf(opt[i++],"Split-Screen Private Chat  %s",user->chat & CHAT_SPLITP?"Yes":"No");
        !           421:                opt[i][0]=0;
        !           422:                switch(uifc.list(WIN_MID|WIN_ACT|WIN_SAV,0,0,0,&j,0,"Chat Settings",opt)) {
        !           423:                        case -1:
        !           424:                                freeopt(opt);
        !           425:                                return(0);
        !           426:                                break;
        !           427:                        case 0:
        !           428:                                /* Chat Echo */
        !           429:                                user->chat ^= CHAT_ECHO;
        !           430:                                putuserrec(cfg,user->number,U_CHAT,8,ultoa(user->chat,str,16));
        !           431:                                break;
        !           432:                        case 1:
        !           433:                                /* Chat Actions */
        !           434:                                user->chat ^= CHAT_ACTION;
        !           435:                                putuserrec(cfg,user->number,U_CHAT,8,ultoa(user->chat,str,16));
        !           436:                                break;
        !           437:                        case 2:
        !           438:                                /* Availabe for Chat */
        !           439:                                user->chat ^= CHAT_NOPAGE;
        !           440:                                putuserrec(cfg,user->number,U_CHAT,8,ultoa(user->chat,str,16));
        !           441:                                break;
        !           442:                        case 3:
        !           443:                                /* Activity Alerts */
        !           444:                                user->chat ^= CHAT_NOACT;
        !           445:                                putuserrec(cfg,user->number,U_CHAT,8,ultoa(user->chat,str,16));
        !           446:                                break;
        !           447:                        case 4:
        !           448:                                /* Split-Screen Priv Chat */
        !           449:                                user->chat ^= CHAT_SPLITP;
        !           450:                                putuserrec(cfg,user->number,U_CHAT,8,ultoa(user->chat,str,16));
        !           451:                                break;
        !           452:                }
        !           453:        }
        !           454:        return(0);
        !           455: }
        !           456: 
        !           457: /* Pick Command Shell */
        !           458: 
        !           459: int edit_shell(scfg_t *cfg, user_t *user)
        !           460: {
        !           461:        int     i,j;
        !           462:        char    **opt;
        !           463: 
        !           464:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           465:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           466: 
        !           467: 
        !           468:        for(i=0;i<cfg->total_shells;i++) {
        !           469:                opt[i]=cfg->shell[i]->name;
        !           470:        }
        !           471:        opt[i]="";
        !           472:        j=user->shell;
        !           473:        switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"Command Shell",opt)) {
        !           474:                case -1:
        !           475:                        break;
        !           476:                default:
        !           477:                        if(user->shell != j) {
        !           478:                                user->shell=j;
        !           479:                                putuserrec(cfg,user->number,U_SHELL,8,cfg->shell[j]->code);
        !           480:                        }
        !           481:                        break;
        !           482:        }
        !           483:        free(opt);
        !           484:        return(0);
        !           485: }
        !           486: 
        !           487: /* Edit Command Shell
        !           488:  *       Name
        !           489:  *       Expert Mode
        !           490:  */
        !           491: int edit_cmd(scfg_t *cfg, user_t *user)
        !           492: {
        !           493:        int     i,j;
        !           494:        char    **opt;
        !           495:        char    str[256];
        !           496: 
        !           497:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           498:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           499:        for(i=0;i<(MAX_OPTS+1);i++)
        !           500:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !           501:                        allocfail(MAX_OPLN);
        !           502: 
        !           503:        j=0;
        !           504:        while(1) {
        !           505:                i=0;
        !           506:                getuserdat(cfg,user);
        !           507:                sprintf(opt[i++],"Command Shell  %s",cfg->shell[user->shell]->name);
        !           508:                sprintf(opt[i++],"Expert Mode    %s",user->misc & EXPERT?"Yes":"No");
        !           509:                opt[i][0]=0;
        !           510:                switch(uifc.list(WIN_MID|WIN_ACT|WIN_SAV,0,0,0,&j,0,"Command Shell",opt)) {
        !           511:                        case -1:
        !           512:                                freeopt(opt);
        !           513:                                return(0);
        !           514:                                break;
        !           515:                        case 0:
        !           516:                                /* Command Shell */
        !           517:                                edit_shell(cfg,user);
        !           518:                                break;
        !           519:                        case 1:
        !           520:                                /* Expert Mode */
        !           521:                                user->misc ^= EXPERT;
        !           522:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           523:                                break;
        !           524:                }
        !           525:        }
        !           526: 
        !           527:        return(0);
        !           528: }
        !           529: 
        !           530: /* Pick External Editor */
        !           531: int edit_xedit(scfg_t *cfg, user_t *user)
        !           532: {
        !           533:        int     i,j;
        !           534:        char    **opt;
        !           535: 
        !           536:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           537:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           538: 
        !           539:        getuserdat(cfg,user);
        !           540:        opt[0]="None";
        !           541:        for(i=1;i<=cfg->total_xedits;i++) {
        !           542:                opt[i]=cfg->xedit[i-1]->name;
        !           543:        }
        !           544:        opt[i]="";
        !           545:        j=user->xedit;
        !           546:        switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"External Editor",opt)) {
        !           547:                case -1:
        !           548:                        break;
        !           549:                default:
        !           550:                        if(user->xedit != j) {
        !           551:                                user->xedit=j;
        !           552:                                if(j > 0)
        !           553:                                    putuserrec(cfg,user->number,U_XEDIT,8,cfg->xedit[j-1]->code);
        !           554:                                else
        !           555:                                    putuserrec(cfg,user->number,U_XEDIT,8,nulstr);
        !           556:                        }
        !           557:                        break;
        !           558:        }
        !           559:        free(opt);
        !           560:        return(0);
        !           561: }
        !           562: 
        !           563: /* Edit Message Options
        !           564:  *       Forward Email to NetMail
        !           565:  *       Clear Screen Between Messages
        !           566:  *       External Editor
        !           567:  */
        !           568: int edit_msgopts(scfg_t *cfg, user_t *user)
        !           569: {
        !           570:        int     i,j;
        !           571:        char    **opt;
        !           572:        char    str[256];
        !           573: 
        !           574:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           575:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           576:        for(i=0;i<(MAX_OPTS+1);i++)
        !           577:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !           578:                        allocfail(MAX_OPLN);
        !           579: 
        !           580:        j=0;
        !           581:        while(1) {
        !           582:                getuserdat(cfg,user);
        !           583:                i=0;
        !           584:                sprintf(opt[i++],"Forward Email to NetMail       %s",user->misc & NETMAIL?"Yes":"No");
        !           585:                sprintf(opt[i++],"Clear Screen Between Messages  %s",user->misc & CLRSCRN?"Yes":"No");
        !           586:                sprintf(opt[i++],"External Editor                %s",user->xedit?cfg->xedit[user->xedit-1]->name:"None");
        !           587:                opt[i][0]=0;
        !           588:                switch(uifc.list(WIN_MID|WIN_ACT|WIN_SAV,0,0,0,&j,0,"Message Options",opt)) {
        !           589:                        case -1:
        !           590:                                freeopt(opt);
        !           591:                                return(0);
        !           592:                                break;
        !           593:                        case 0:
        !           594:                                /* FWD Email */
        !           595:                                user->misc ^= NETMAIL;
        !           596:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           597:                                break;
        !           598:                        case 1:
        !           599:                                /* Clear Between MSGS */
        !           600:                                user->misc ^=CLRSCRN;
        !           601:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           602:                                break;
        !           603:                        case 2:
        !           604:                                /* External Editor */
        !           605:                                edit_xedit(cfg,user);
        !           606:                                break;
        !           607:                }
        !           608:        }
        !           609:        return(0);
        !           610: }
        !           611: 
        !           612: /* Pick Tmp/QWK File Type */
        !           613: int edit_tmpqwktype(scfg_t *cfg, user_t *user)
        !           614: {
        !           615:        int     i;
        !           616:        int             j=0;
        !           617:        char    **opt;
        !           618: 
        !           619:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           620:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           621: 
        !           622:        getuserdat(cfg,user);
        !           623:        for(i=0;i<cfg->total_fcomps;i++) {
        !           624:                opt[i]=cfg->fcomp[i]->ext;
        !           625:                if(!strcmp(cfg->fcomp[i]->ext,user->tmpext))
        !           626:                        j=i;
        !           627:        }
        !           628:        opt[i]="";
        !           629:        switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"Temp/QWK File Type",opt)) {
        !           630:                case -1:
        !           631:                        break;
        !           632:                default:
        !           633:                        if(strcmp(cfg->fcomp[j]->ext,user->tmpext)) {
        !           634:                                strcpy(user->tmpext,cfg->fcomp[j]->ext);
        !           635:                                putuserrec(cfg,user->number,U_TMPEXT,3,user->tmpext);
        !           636:                        }
        !           637:                        break;
        !           638:        }
        !           639:        free(opt);
        !           640:        return(0);
        !           641: }
        !           642: 
        !           643: /* Edit QWK Packet Options
        !           644:  *       Include New Files List
        !           645:  *       Include Unread Email
        !           646:  *       Delete Email After Download
        !           647:  *       Include Messages From Self
        !           648:  *       Expand CTRL-A Codes to ANSI
        !           649:  *       Strip CTRL-A Codes
        !           650:  *       Include File Attachments
        !           651:  *       Include Index Files
        !           652:  *       Include Time Zone (@TZ)
        !           653:  *       Include Seen-Bys (@VIA)
        !           654:  *       Extraneous Control Files
        !           655:  */
        !           656: int edit_qwk(scfg_t *cfg, user_t *user)
        !           657: {
        !           658:        int     i,j;
        !           659:        char    **opt;
        !           660:        char    str[256];
        !           661: 
        !           662:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           663:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           664:        for(i=0;i<(MAX_OPTS+1);i++)
        !           665:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !           666:                        allocfail(MAX_OPLN);
        !           667: 
        !           668:        j=0;
        !           669:        while(1) {
        !           670:                i=0;
        !           671:                getuserdat(cfg,user);
        !           672:                sprintf(opt[i++],"Include New Files List        %s",user->qwk & QWK_FILES?"Yes":"No");
        !           673:                sprintf(opt[i++],"Include Unread Email          %s",user->qwk & QWK_EMAIL?"Yes":"No");
        !           674:                sprintf(opt[i++],"Include ALL Email             %s",user->qwk & QWK_ALLMAIL?"Yes":"No");
        !           675:                sprintf(opt[i++],"Delete Email After Download   %s",user->qwk & QWK_DELMAIL?"Yes":"No");
        !           676:                sprintf(opt[i++],"Include Messages from Self    %s",user->qwk & QWK_BYSELF?"Yes":"No");
        !           677:                sprintf(opt[i++],"Expand CTRL-A to ANSI         %s",user->qwk & QWK_EXPCTLA?"Yes":"No");
        !           678:                sprintf(opt[i++],"Strip CTRL-A Codes            %s",user->qwk & QWK_RETCTLA?"No":"Yes");
        !           679:                sprintf(opt[i++],"Include File Attachments      %s",user->qwk & QWK_ATTACH?"Yes":"No");
        !           680:                sprintf(opt[i++],"Include Index Files           %s",user->qwk & QWK_NOINDEX?"No":"Yes");
        !           681:                sprintf(opt[i++],"Include Time Zone (@TZ)       %s",user->qwk & QWK_TZ?"Yes":"No");
        !           682:                sprintf(opt[i++],"Include Seen-Bys (@VIA)       %s",user->qwk & QWK_VIA?"Yes":"No");
        !           683:                sprintf(opt[i++],"Extraneous Control Files      %s",user->qwk & QWK_NOCTRL?"No":"Yes");
        !           684:                sprintf(opt[i++],"Extended (QWKE) Format        %s",user->qwk & QWK_EXT?"Yes":"No");
        !           685:                sprintf(opt[i++],"Include Message IDs (@MSGID)  %s",user->qwk & QWK_MSGID?"Yes":"No");
        !           686:                sprintf(opt[i++],"Temp/QWK File Type            %s",user->tmpext);
        !           687:                opt[i][0]=0;
        !           688:                switch(uifc.list(WIN_MID|WIN_ACT|WIN_SAV,0,0,0,&j,0,"Command Shell",opt)) {
        !           689:                        case -1:
        !           690:                                freeopt(opt);
        !           691:                                return(0);
        !           692:                                break;
        !           693:                        case 0:
        !           694:                                /* New Files List */
        !           695:                                user->qwk ^= QWK_FILES;
        !           696:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           697:                                break;
        !           698:                        case 1:
        !           699:                                /* Unread Email */
        !           700:                                user->qwk ^= QWK_EMAIL;
        !           701:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           702:                                break;
        !           703:                        case 2:
        !           704:                                /* ALL Email */
        !           705:                                user->qwk ^= QWK_ALLMAIL;
        !           706:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           707:                                break;
        !           708:                        case 3:
        !           709:                                /* Del Email after Download */
        !           710:                                user->qwk ^= QWK_DELMAIL;
        !           711:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           712:                                break;
        !           713:                        case 4:
        !           714:                                /* Include From Self */
        !           715:                                user->qwk ^= QWK_BYSELF;
        !           716:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           717:                                break;
        !           718:                        case 5:
        !           719:                                /* Expand CTRL-A */
        !           720:                                user->qwk ^= QWK_EXPCTLA;
        !           721:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           722:                                break;
        !           723:                        case 6:
        !           724:                                /* Strip CTRL-A */
        !           725:                                user->qwk ^= QWK_RETCTLA;
        !           726:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           727:                                break;
        !           728:                        case 7:
        !           729:                                /* Include Attach */
        !           730:                                user->qwk ^= QWK_ATTACH;
        !           731:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           732:                                break;
        !           733:                        case 8:
        !           734:                                /* Include Indexes */
        !           735:                                user->qwk ^= QWK_NOINDEX;
        !           736:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           737:                                break;
        !           738:                        case 9:
        !           739:                                /* Include TZ */
        !           740:                                user->qwk ^= QWK_TZ;
        !           741:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           742:                                break;
        !           743:                        case 10:
        !           744:                                /* Include VIA */
        !           745:                                user->qwk ^= QWK_VIA;
        !           746:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           747:                                break;
        !           748:                        case 11:
        !           749:                                /* Extra CTRL Files */
        !           750:                                user->qwk ^= QWK_NOCTRL;
        !           751:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           752:                                break;
        !           753:                        case 12:
        !           754:                                /* Extended QWKE */
        !           755:                                user->qwk ^= QWK_EXT;
        !           756:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           757:                                break;
        !           758:                        case 13:
        !           759:                                /* Include MSGID */
        !           760:                                user->qwk ^= QWK_MSGID;
        !           761:                                putuserrec(cfg,user->number,U_QWK,8,ultoa(user->qwk,str,16));
        !           762:                                break;
        !           763:                        case 14:
        !           764:                                /* Temp/QWK Type */
        !           765:                                edit_tmpqwktype(cfg,user);
        !           766:                                break;
        !           767:                }
        !           768:        }
        !           769:        return(0);
        !           770: }
        !           771: 
        !           772: /* Pick Protocol */
        !           773: 
        !           774: int edit_proto(scfg_t *cfg, user_t *user)
        !           775: {
        !           776:        int     i;
        !           777:        int             j=0;
        !           778:        char    **opt;
        !           779: 
        !           780:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           781:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           782: 
        !           783:        getuserdat(cfg,user);
        !           784:        opt[0]="None";
        !           785:        for(i=1;i<=cfg->total_prots;i++) {
        !           786:                opt[i]=cfg->prot[i-1]->name;
        !           787:                if(cfg->prot[i-1]->mnemonic == user->prot)
        !           788:                        j=i;
        !           789:        }
        !           790:        opt[i]="";
        !           791:        switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"Default Protcol",opt)) {
        !           792:                case -1:
        !           793:                        break;
        !           794:                case 0:
        !           795:                        if(user->prot != ' ')
        !           796:                                putuserrec(cfg,user->number,U_PROT,1," ");
        !           797:                        user->prot=' ';
        !           798:                        break;
        !           799:                default:
        !           800:                        if(user->prot != cfg->prot[j-1]->mnemonic) {
        !           801:                                user->prot=cfg->prot[j-1]->mnemonic;
        !           802:                                putuserrec(cfg,user->number,U_PROT,1,&user->prot);
        !           803:                        }
        !           804:                        break;
        !           805:        }
        !           806:        free(opt);
        !           807:        return(0);
        !           808: }
        !           809: 
        !           810: /* Edit File Options
        !           811:  *       Auto-New Scan
        !           812:  *       Extended Descriptions
        !           813:  *       Batch Flagging
        !           814:  *       Auto-Hangup After Transfer
        !           815:  *       Default download Protocol
        !           816:  *       Temp/QWK File Type
        !           817:  */
        !           818: int edit_fileopts(scfg_t *cfg, user_t *user)
        !           819: {
        !           820:        int     i,j;
        !           821:        int             k;
        !           822:        char    **opt;
        !           823:        char    str[256];
        !           824: 
        !           825:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !           826:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !           827:        for(i=0;i<(MAX_OPTS+1);i++)
        !           828:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !           829:                        allocfail(MAX_OPLN);
        !           830: 
        !           831:        j=0;
        !           832:        while(1) {
        !           833:                getuserdat(cfg,user);
        !           834:                i=0;
        !           835:                sprintf(opt[i++],"Auto-New Scan              %s",user->misc & ANFSCAN?"Yes":"No");
        !           836:                sprintf(opt[i++],"Extended Descriptions      %s",user->misc & EXTDESC?"Yes":"No");
        !           837:                sprintf(opt[i++],"Batch Flagging             %s",user->misc & BATCHFLAG?"Yes":"No");
        !           838:                sprintf(opt[i++],"Auto Transfer Hangup       %s",user->misc & AUTOHANG?"Yes":"No");
        !           839:                strcpy(str,"None");
        !           840:                for(k=0;k<cfg->total_prots;k++)
        !           841:                        if(cfg->prot[k]->mnemonic==user->prot)
        !           842:                                strcpy(str,cfg->prot[k]->name);
        !           843:                sprintf(opt[i++],"Default Download Protocol  %s",str);
        !           844:                sprintf(opt[i++],"Temp/QWK File Type         %s",user->tmpext);
        !           845:                opt[i][0]=0;
        !           846:                switch(uifc.list(WIN_MID|WIN_ACT|WIN_SAV,0,0,0,&j,0,"File Options",opt)) {
        !           847:                        case -1:
        !           848:                                freeopt(opt);
        !           849:                                return(0);
        !           850:                                break;
        !           851:                        case 0:
        !           852:                                /* Auto-New Scan */
        !           853:                                user->misc ^= ANFSCAN;
        !           854:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           855:                                break;
        !           856:                        case 1:
        !           857:                                /* Extended Descs */
        !           858:                                user->misc ^= EXTDESC;
        !           859:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           860:                                break;
        !           861:                        case 2:
        !           862:                                /* Batch Flagging */
        !           863:                                user->misc ^= BATCHFLAG;
        !           864:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           865:                                break;
        !           866:                        case 3:
        !           867:                                /* Auto-Hangup */
        !           868:                                user->misc ^= AUTOHANG;
        !           869:                                putuserrec(cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
        !           870:                                break;
        !           871:                        case 4:
        !           872:                                /* Default Download Protocol */
        !           873:                                edit_proto(cfg,user);
        !           874:                                break;
        !           875:                        case 5:
        !           876:                                /* Temp/QWK File Type */
        !           877:                                edit_tmpqwktype(cfg,user);
        !           878:                                break;
        !           879:                }
        !           880:        }
        !           881:        return(0);
        !           882: }
        !           883: 
        !           884: /* Edit "Extended Comment" */
        !           885: 
        !           886: int edit_comment(scfg_t *cfg, user_t *user)
        !           887: {
        !           888:        char str[1024];
        !           889:        char editor[1024];
        !           890: 
        !           891:        sprintf(str,"%s %suser/%04u.msg",geteditor(editor),cfg->data_dir,user->number);
        !           892:        do_cmd(str);
        !           893:        return(0);
        !           894: }
        !           895: 
        !           896: /* MSG and File settings
        !           897:  *      - Message Options
        !           898:  *      - QWK Message Packet
        !           899:  *      - File Options
        !           900:  */
        !           901: int edit_msgfile(scfg_t *cfg, user_t *user)
        !           902: {
        !           903:        char *opt[4]={
        !           904:                 "Message Options"
        !           905:                ,"QWK Message Packet"
        !           906:                ,"File Options"
        !           907:                ,""};
        !           908:        int i=0;
        !           909:        while(1) {
        !           910:                switch(uifc.list(WIN_BOT|WIN_RHT|WIN_ACT,0,0,0,&i,0,"Settings",opt)) {
        !           911:                        case -1:
        !           912:                                return(0);
        !           913:                                break;
        !           914:                        case 0:
        !           915:                                /* Message Options */
        !           916:                                edit_msgopts(cfg,user);
        !           917:                                break;
        !           918:                        case 1:
        !           919:                                /* QWK Message Packet */
        !           920:                                edit_qwk(cfg,user);
        !           921:                                break;
        !           922:                        case 2:
        !           923:                                /* File Options */
        !           924:                                edit_fileopts(cfg,user);
        !           925:                                break;
        !           926:                }
        !           927:        }
        !           928:        return(0);
        !           929: }
        !           930: 
        !           931: /* Settings
        !           932:  *     - Terminal Settings
        !           933:  *     - Logon Toggles
        !           934:  *     - Chat Toggles
        !           935:  *     - Command Shell
        !           936:  */
        !           937: int edit_settings(scfg_t *cfg, user_t *user)
        !           938: {
        !           939:        char *opt[5]={
        !           940:                 "Terminal Settings"
        !           941:                ,"Logon Toggles"
        !           942:                ,"Chat Toggles"
        !           943:                ,"Command Shell"
        !           944:                ,""};
        !           945:        int i=0;
        !           946: 
        !           947:        while(1) {
        !           948:                switch(uifc.list(WIN_BOT|WIN_RHT|WIN_ACT,0,0,0,&i,0,"Settings",opt)) {
        !           949:                        case -1:
        !           950:                                return(0);
        !           951:                                break;
        !           952:                        case 0:
        !           953:                                /* Terminal Settings */
        !           954:                                edit_terminal(cfg,user);
        !           955:                                break;
        !           956:                        case 1:
        !           957:                                /* Logon Toggles */
        !           958:                                edit_logon(cfg,user);
        !           959:                                break;
        !           960:                        case 2:
        !           961:                                /* Chat Toggles */
        !           962:                                edit_chat(cfg,user);
        !           963:                                break;
        !           964:                        case 3:
        !           965:                                /* Command Shell */
        !           966:                                edit_cmd(cfg,user);
        !           967:                                break;
        !           968:                }
        !           969:        }
        !           970:        return(0);
        !           971: }
        !           972: 
        !           973: /* Statistics
        !           974:  *     First On
        !           975:  *     Last On
        !           976:  *     Total Logons
        !           977:  *     Todays Logons
        !           978:  *     Total Posts
        !           979:  *     Todays Posts
        !           980:  *     Total Uploads
        !           981:  *     Todays Uploads
        !           982:  *     Total Time On
        !           983:  *     Todays Time On
        !           984:  *     Last Call Time On
        !           985:  *     Extra
        !           986:  *     Total Downloads
        !           987:  *     Bytes
        !           988:  *     Leech
        !           989:  *     Total Email
        !           990:  *     Todays Email
        !           991:  *     Email to Sysop
        !           992:  */
        !           993: int edit_stats(scfg_t *cfg, user_t *user)
        !           994: {
        !           995:        int     i,j;
        !           996:        char    **opt;
        !           997:        char    str[256];
        !           998:        time_t  temptime,temptime2;
        !           999: 
        !          1000:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !          1001:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !          1002:        for(i=0;i<(MAX_OPTS+1);i++)
        !          1003:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !          1004:                        allocfail(MAX_OPLN);
        !          1005: 
        !          1006:        j=0;
        !          1007:        while(1) {
        !          1008:                getuserdat(cfg,user);
        !          1009:                i=0;
        !          1010:                sprintf(opt[i++],"First On           %s",user->firston?timestr(cfg, &user->firston, str):"Never");
        !          1011:                sprintf(opt[i++],"Last On            %s",user->laston?timestr(cfg, &user->laston, str):"Never");
        !          1012:                sprintf(opt[i++],"Logon Time         %s",user->laston?timestr(cfg, &user->logontime, str):"Not On");
        !          1013:                sprintf(opt[i++],"Total Logons       %hu",user->logons);
        !          1014:                sprintf(opt[i++],"Todays Logons      %hu",user->ltoday);
        !          1015:                sprintf(opt[i++],"Total Posts        %hu",user->posts);
        !          1016:                sprintf(opt[i++],"Todays Posts       %hu",user->ptoday);
        !          1017:                sprintf(opt[i++],"Total Email        %hu",user->emails);
        !          1018:                sprintf(opt[i++],"Todays Email       %hu",user->etoday);
        !          1019:                sprintf(opt[i++],"Email To Sysop     %hu",user->fbacks);
        !          1020:                sprintf(opt[i++],"Total Time On      %hu",user->timeon);
        !          1021:                sprintf(opt[i++],"Time On Today      %hu",user->ttoday);
        !          1022:                sprintf(opt[i++],"Time On Last Call  %hu",user->tlast);
        !          1023:                sprintf(opt[i++],"Extra Time Today   %hu",user->textra);
        !          1024:                sprintf(opt[i++],"Total Downloads    %hu",user->dls);
        !          1025:                sprintf(opt[i++],"Downloaded Bytes   %lu",user->dlb);
        !          1026:                sprintf(opt[i++],"Total Uploads      %hu",user->uls);
        !          1027:                sprintf(opt[i++],"Uploaded Bytes     %lu",user->ulb);
        !          1028:                sprintf(opt[i++],"Leech Downloads    %u",user->leech);
        !          1029:                sprintf(opt[i++],"Password Modified  %s",user->pwmod?timestr(cfg, &user->pwmod, str):"Never");
        !          1030:                opt[i][0]=0;
        !          1031:                switch(uifc.list(WIN_MID|WIN_ACT,0,0,0,&j,0,"Statistics",opt)) {
        !          1032:                        case -1:
        !          1033:                                freeopt(opt);
        !          1034:                                return(0);
        !          1035:                                break;
        !          1036:                        case 0:
        !          1037:                                /* First On */
        !          1038:                                getuserdat(cfg,user);
        !          1039:                                temptime=user->firston;
        !          1040:                                unixtodstr(cfg,temptime,str);
        !          1041:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"First On Date",str,8,K_EDIT);
        !          1042:                                user->firston=dstrtounix(cfg, str);
        !          1043:                                temptime2=temptime-user->firston;
        !          1044:                                sectostr(temptime2,str);
        !          1045:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"First On Time",str,8,K_EDIT);
        !          1046:                                temptime2=strtosec(str);
        !          1047:                                if(temptime2!=-1)
        !          1048:                                        user->firston += temptime2;
        !          1049:                                if(temptime!=user->firston)
        !          1050:                                        putuserrec(cfg,user->number,U_FIRSTON,8,ultoa(user->firston,str,16));
        !          1051:                                break;
        !          1052:                        case 1:
        !          1053:                                /* Last On */
        !          1054:                                getuserdat(cfg,user);
        !          1055:                                temptime=user->laston;
        !          1056:                                unixtodstr(cfg,temptime,str);
        !          1057:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Last On Date",str,8,K_EDIT);
        !          1058:                                user->laston=dstrtounix(cfg, str);
        !          1059:                                temptime2=temptime-user->laston;
        !          1060:                                sectostr(temptime2,str);
        !          1061:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Last On Time",str,8,K_EDIT);
        !          1062:                                temptime2=strtosec(str);
        !          1063:                                if(temptime2!=-1)
        !          1064:                                        user->laston += temptime2;
        !          1065:                                if(temptime!=user->laston)
        !          1066:                                        putuserrec(cfg,user->number,U_LASTON,8,ultoa(user->laston,str,16));
        !          1067:                                break;
        !          1068:                        case 2:
        !          1069:                                /* Logon Time */
        !          1070:                                getuserdat(cfg,user);
        !          1071:                                temptime=user->logontime;
        !          1072:                                unixtodstr(cfg,temptime,str);
        !          1073:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Logon Date",str,8,K_EDIT);
        !          1074:                                user->logontime=dstrtounix(cfg, str);
        !          1075:                                temptime2=temptime-user->logontime;
        !          1076:                                sectostr(temptime2,str);
        !          1077:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Logon Time",str,8,K_EDIT);
        !          1078:                                temptime2=strtosec(str);
        !          1079:                                if(temptime2!=-1)
        !          1080:                                        user->logontime += temptime2;
        !          1081:                                if(temptime!=user->logontime)
        !          1082:                                        putuserrec(cfg,user->number,U_LOGONTIME,8,ultoa(user->logontime,str,16));
        !          1083:                                break;
        !          1084:                        case 3:
        !          1085:                                /* Total Logons */
        !          1086:                                getuserdat(cfg,user);
        !          1087:                                sprintf(str,"%hu",user->logons);
        !          1088:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Total Logons",str,5,K_EDIT|K_NUMBER);
        !          1089:                                if(uifc.changes) {
        !          1090:                                        user->logons=strtoul(str,NULL,10);
        !          1091:                                        putuserrec(cfg,user->number,U_LOGONS,5,ultoa(user->logons,str,10));
        !          1092:                                }
        !          1093:                                break;
        !          1094:                        case 4:
        !          1095:                                /* Todays Logons */
        !          1096:                                getuserdat(cfg,user);
        !          1097:                                sprintf(str,"%hu",user->ltoday);
        !          1098:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Todays Logons",str,5,K_EDIT|K_NUMBER);
        !          1099:                                if(uifc.changes) {
        !          1100:                                        user->ltoday=strtoul(str,NULL,10);
        !          1101:                                        putuserrec(cfg,user->number,U_LTODAY,5,ultoa(user->ltoday,str,10));
        !          1102:                                }
        !          1103:                                break;
        !          1104:                        case 5:
        !          1105:                                /* Total Posts */
        !          1106:                                getuserdat(cfg,user);
        !          1107:                                sprintf(str,"%hu",user->posts);
        !          1108:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Total Posts",str,5,K_EDIT|K_NUMBER);
        !          1109:                                if(uifc.changes) {
        !          1110:                                        user->posts=strtoul(str,NULL,10);
        !          1111:                                        putuserrec(cfg,user->number,U_POSTS,5,ultoa(user->posts,str,10));
        !          1112:                                }
        !          1113:                                break;
        !          1114:                        case 6:
        !          1115:                                /* Todays Posts */
        !          1116:                                getuserdat(cfg,user);
        !          1117:                                sprintf(str,"%hu",user->ptoday);
        !          1118:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Todays Posts",str,5,K_EDIT|K_NUMBER);
        !          1119:                                if(uifc.changes) {
        !          1120:                                        user->ptoday=strtoul(str,NULL,10);
        !          1121:                                        putuserrec(cfg,user->number,U_PTODAY,5,ultoa(user->ptoday,str,10));
        !          1122:                                }
        !          1123:                                break;
        !          1124:                        case 7:
        !          1125:                                /* Total Emails */
        !          1126:                                getuserdat(cfg,user);
        !          1127:                                sprintf(str,"%hu",user->emails);
        !          1128:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Total Emails",str,5,K_EDIT|K_NUMBER);
        !          1129:                                if(uifc.changes) {
        !          1130:                                        user->emails=strtoul(str,NULL,10);
        !          1131:                                        putuserrec(cfg,user->number,U_EMAILS,5,ultoa(user->emails,str,10));
        !          1132:                                }
        !          1133:                                break;
        !          1134:                        case 8:
        !          1135:                                /* Todays Emails */
        !          1136:                                getuserdat(cfg,user);
        !          1137:                                sprintf(str,"%hu",user->etoday);
        !          1138:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Todays Emails",str,5,K_EDIT|K_NUMBER);
        !          1139:                                if(uifc.changes) {
        !          1140:                                        user->etoday=strtoul(str,NULL,10);
        !          1141:                                        putuserrec(cfg,user->number,U_ETODAY,5,ultoa(user->etoday,str,10));
        !          1142:                                }
        !          1143:                                break;
        !          1144:                        case 9:
        !          1145:                                /* Emails to Sysop */
        !          1146:                                getuserdat(cfg,user);
        !          1147:                                sprintf(str,"%hu",user->fbacks);
        !          1148:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Emails to Sysop",str,5,K_EDIT|K_NUMBER);
        !          1149:                                if(uifc.changes) {
        !          1150:                                        user->fbacks=strtoul(str,NULL,10);
        !          1151:                                        putuserrec(cfg,user->number,U_FBACKS,5,ultoa(user->fbacks,str,10));
        !          1152:                                }
        !          1153:                                break;
        !          1154:                        case 10:
        !          1155:                                /* Total Time On */
        !          1156:                                getuserdat(cfg,user);
        !          1157:                                sprintf(str,"%hu",user->timeon);
        !          1158:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Total Time On",str,5,K_EDIT|K_NUMBER);
        !          1159:                                if(uifc.changes) {
        !          1160:                                        user->timeon=strtoul(str,NULL,10);
        !          1161:                                        putuserrec(cfg,user->number,U_TIMEON,5,ultoa(user->timeon,str,10));
        !          1162:                                }
        !          1163:                                break;
        !          1164:                        case 11:
        !          1165:                                /* Time On Today */
        !          1166:                                getuserdat(cfg,user);
        !          1167:                                sprintf(str,"%hu",user->ttoday);
        !          1168:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Time On Today",str,5,K_EDIT|K_NUMBER);
        !          1169:                                if(uifc.changes) {
        !          1170:                                        user->ttoday=strtoul(str,NULL,10);
        !          1171:                                        putuserrec(cfg,user->number,U_TTODAY,5,ultoa(user->ttoday,str,10));
        !          1172:                                }
        !          1173:                                break;
        !          1174:                        case 12:
        !          1175:                                /* Time On Last Call */
        !          1176:                                getuserdat(cfg,user);
        !          1177:                                sprintf(str,"%hu",user->tlast);
        !          1178:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Time On Last Call",str,5,K_EDIT|K_NUMBER);
        !          1179:                                if(uifc.changes) {
        !          1180:                                        user->tlast=strtoul(str,NULL,10);
        !          1181:                                        putuserrec(cfg,user->number,U_TLAST,5,ultoa(user->tlast,str,10));
        !          1182:                                }
        !          1183:                                break;
        !          1184:                        case 13:
        !          1185:                                /* Extra Time Today */
        !          1186:                                getuserdat(cfg,user);
        !          1187:                                sprintf(str,"%hu",user->textra);
        !          1188:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Extra Time Today",str,5,K_EDIT|K_NUMBER);
        !          1189:                                if(uifc.changes) {
        !          1190:                                        user->textra=strtoul(str,NULL,10);
        !          1191:                                        putuserrec(cfg,user->number,U_TEXTRA,5,ultoa(user->textra,str,10));
        !          1192:                                }
        !          1193:                                break;
        !          1194:                        case 14:
        !          1195:                                /* Total Downloads */
        !          1196:                                getuserdat(cfg,user);
        !          1197:                                sprintf(str,"%hu",user->dls);
        !          1198:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Total Downloads",str,5,K_EDIT|K_NUMBER);
        !          1199:                                if(uifc.changes) {
        !          1200:                                        user->dls=strtoul(str,NULL,10);
        !          1201:                                        putuserrec(cfg,user->number,U_DLS,5,ultoa(user->dls,str,10));
        !          1202:                                }
        !          1203:                                break;
        !          1204:                        case 15:
        !          1205:                                /* Downloaded Bytes */
        !          1206:                                getuserdat(cfg,user);
        !          1207:                                sprintf(str,"%lu",user->dlb);
        !          1208:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Downloaded Bytes",str,10,K_EDIT|K_NUMBER);
        !          1209:                                if(uifc.changes) {
        !          1210:                                        user->dlb=strtoul(str,NULL,10);
        !          1211:                                        putuserrec(cfg,user->number,U_DLB,10,ultoa(user->dlb,str,10));
        !          1212:                                }
        !          1213:                                break;
        !          1214:                        case 16:
        !          1215:                                /* Total Uploads */
        !          1216:                                getuserdat(cfg,user);
        !          1217:                                sprintf(str,"%hu",user->uls);
        !          1218:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Total Uploads",str,5,K_EDIT|K_NUMBER);
        !          1219:                                if(uifc.changes) {
        !          1220:                                        user->uls=strtoul(str,NULL,10);
        !          1221:                                        putuserrec(cfg,user->number,U_ULS,5,ultoa(user->uls,str,10));
        !          1222:                                }
        !          1223:                                break;
        !          1224:                        case 17:
        !          1225:                                /* Uploaded Bytes */
        !          1226:                                getuserdat(cfg,user);
        !          1227:                                sprintf(str,"%lu",user->ulb);
        !          1228:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Uploaded Bytes",str,10,K_EDIT|K_NUMBER);
        !          1229:                                if(uifc.changes) {
        !          1230:                                        user->ulb=strtoul(str,NULL,10);
        !          1231:                                        putuserrec(cfg,user->number,U_ULB,10,ultoa(user->ulb,str,10));
        !          1232:                                }
        !          1233:                                break;
        !          1234:                        case 18:
        !          1235:                                /* Leech Counter */
        !          1236:                                getuserdat(cfg,user);
        !          1237:                                sprintf(str,"%u",user->leech);
        !          1238:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Leech Counter",str,3,K_EDIT|K_NUMBER);
        !          1239:                                if(uifc.changes) {
        !          1240:                                        user->leech=strtoul(str,NULL,10);
        !          1241:                                        putuserrec(cfg,user->number,U_LEECH,2,ultoa(user->leech,str,16));
        !          1242:                                }
        !          1243:                                break;
        !          1244:                        case 19:
        !          1245:                                /* Password Last Modified */
        !          1246:                                getuserdat(cfg,user);
        !          1247:                                temptime=user->pwmod;
        !          1248:                                unixtodstr(cfg,temptime,str);
        !          1249:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Password Modified Date",str,8,K_EDIT);
        !          1250:                                user->firston=dstrtounix(cfg, str);
        !          1251:                                temptime2=temptime-user->pwmod;
        !          1252:                                sectostr(temptime2,str);
        !          1253:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Password Modified Time",str,8,K_EDIT);
        !          1254:                                temptime2=strtosec(str);
        !          1255:                                if(temptime2!=-1)
        !          1256:                                        user->pwmod += temptime2;
        !          1257:                                if(temptime!=user->pwmod)
        !          1258:                                        putuserrec(cfg,user->number,U_PWMOD,8,ultoa(user->pwmod,str,16));
        !          1259:                                break;
        !          1260:                }
        !          1261:        }
        !          1262:        return(0);
        !          1263: }
        !          1264: 
        !          1265: /* Security settings
        !          1266:  *     Level
        !          1267:  *     Expiration
        !          1268:  *     Flag Set 1
        !          1269:  *     Flag Set 2
        !          1270:  *     Flag Set 3
        !          1271:  *     Flag Set 4
        !          1272:  *     Exemptions
        !          1273:  *     Restrictions
        !          1274:  *     Credits
        !          1275:  *     Free Credits
        !          1276:  *     Minutes
        !          1277:  */
        !          1278: int edit_security(scfg_t *cfg, user_t *user)
        !          1279: {
        !          1280:        int     i,j;
        !          1281:        char    **opt;
        !          1282:        char    str[256];
        !          1283: 
        !          1284:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !          1285:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !          1286:        for(i=0;i<(MAX_OPTS+1);i++)
        !          1287:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !          1288:                        allocfail(MAX_OPLN);
        !          1289: 
        !          1290:        j=0;
        !          1291:        getuserdat(cfg,user);
        !          1292:        while(1) {
        !          1293:                i=0;
        !          1294:                sprintf(opt[i++],"Level         %d",user->level);
        !          1295:                sprintf(opt[i++],"Expiration    %s",user->expire?unixtodstr(cfg, user->expire, str):"Never");
        !          1296:                sprintf(opt[i++],"Flag Set 1    %s",ltoaf(user->flags1,str));
        !          1297:                sprintf(opt[i++],"Flag Set 2    %s",ltoaf(user->flags2,str));
        !          1298:                sprintf(opt[i++],"Flag Set 3    %s",ltoaf(user->flags3,str));
        !          1299:                sprintf(opt[i++],"Flag Set 4    %s",ltoaf(user->flags4,str));
        !          1300:                sprintf(opt[i++],"Exemptions    %s",ltoaf(user->exempt,str));
        !          1301:                sprintf(opt[i++],"Restrictions  %s",ltoaf(user->rest,str));
        !          1302:                sprintf(opt[i++],"Credits       %lu",user->cdt);
        !          1303:                sprintf(opt[i++],"Free Credits  %lu",user->freecdt);
        !          1304:                sprintf(opt[i++],"Minutes       %lu",user->min);
        !          1305:                opt[i][0]=0;
        !          1306:                switch(uifc.list(WIN_MID|WIN_ACT,0,0,0,&j,0,"Security Settings",opt)) {
        !          1307:                        case -1:
        !          1308:                                freeopt(opt);
        !          1309:                                return(0);
        !          1310:                                break;
        !          1311:                        case 0:
        !          1312:                                /* Level */
        !          1313:                                getuserdat(cfg,user);
        !          1314:                                sprintf(str,"%d",user->level);
        !          1315:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Level",str,2,K_EDIT|K_NUMBER);
        !          1316:                                if(uifc.changes) {
        !          1317:                                        user->level=atoi(str);
        !          1318:                                        putuserrec(cfg,user->number,U_LEVEL,2,str);
        !          1319:                                }
        !          1320:                                break;
        !          1321:                        case 1:
        !          1322:                                /* Expiration */
        !          1323:                                getuserdat(cfg,user);
        !          1324:                                unixtodstr(cfg,user->expire,str);
        !          1325:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Expiration",str,8,K_EDIT);
        !          1326:                                if(uifc.changes && dstrtounix(cfg, str)!=user->expire) {
        !          1327:                                        user->expire=dstrtounix(cfg, str);
        !          1328:                                        putuserrec(cfg,user->number,U_EXPIRE,8,ultoa(user->expire,str,16));
        !          1329:                                }
        !          1330:                                break;
        !          1331:                        case 2:
        !          1332:                                /* Flag Set 1 */
        !          1333:                                getuserdat(cfg,user);
        !          1334:                                ltoaf(user->flags1,str);
        !          1335:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Flag Set 1",str,26,K_EDIT|K_UPPER|K_ALPHA);
        !          1336:                                if(uifc.changes) {
        !          1337:                                        user->flags1=aftol(str);
        !          1338:                                        putuserrec(cfg,user->number,U_FLAGS1,8,ultoa(user->flags1,str,16));
        !          1339:                                }
        !          1340:                                break;
        !          1341:                        case 3:
        !          1342:                                /* Flag Set 2 */
        !          1343:                                getuserdat(cfg,user);
        !          1344:                                ltoaf(user->flags2,str);
        !          1345:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Flag Set 2",str,26,K_EDIT|K_UPPER|K_ALPHA);
        !          1346:                                if(uifc.changes) {
        !          1347:                                        user->flags2=aftol(str);
        !          1348:                                        putuserrec(cfg,user->number,U_FLAGS2,8,ultoa(user->flags2,str,16));
        !          1349:                                }
        !          1350:                                break;
        !          1351:                        case 4:
        !          1352:                                /* Flag Set 3 */
        !          1353:                                getuserdat(cfg,user);
        !          1354:                                ltoaf(user->flags3,str);
        !          1355:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Flag Set 3",str,26,K_EDIT|K_UPPER|K_ALPHA);
        !          1356:                                if(uifc.changes) {
        !          1357:                                        user->flags3=aftol(str);
        !          1358:                                        putuserrec(cfg,user->number,U_FLAGS3,8,ultoa(user->flags3,str,16));
        !          1359:                                }
        !          1360:                                break;
        !          1361:                        case 5:
        !          1362:                                /* Flag Set 4 */
        !          1363:                                getuserdat(cfg,user);
        !          1364:                                ltoaf(user->flags4,str);
        !          1365:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Flag Set 4",str,26,K_EDIT|K_UPPER|K_ALPHA);
        !          1366:                                if(uifc.changes) {
        !          1367:                                        user->flags4=aftol(str);
        !          1368:                                        putuserrec(cfg,user->number,U_FLAGS4,8,ultoa(user->flags4,str,16));
        !          1369:                                }
        !          1370:                                break;
        !          1371:                        case 6:
        !          1372:                                /* Exemptions */
        !          1373:                                getuserdat(cfg,user);
        !          1374:                                ltoaf(user->exempt,str);
        !          1375:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Exemptions",str,26,K_EDIT|K_UPPER|K_ALPHA);
        !          1376:                                if(uifc.changes) {
        !          1377:                                        user->exempt=aftol(str);
        !          1378:                                        putuserrec(cfg,user->number,U_EXEMPT,8,ultoa(user->exempt,str,16));
        !          1379:                                }
        !          1380:                                break;
        !          1381:                        case 7:
        !          1382:                                /* Restrictions */
        !          1383:                                getuserdat(cfg,user);
        !          1384:                                ltoaf(user->rest,str);
        !          1385:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Restrictions",str,26,K_EDIT|K_UPPER|K_ALPHA);
        !          1386:                                if(uifc.changes) {
        !          1387:                                        user->rest=aftol(str);
        !          1388:                                        putuserrec(cfg,user->number,U_REST,8,ultoa(user->rest,str,16));
        !          1389:                                }
        !          1390:                                break;
        !          1391:                        case 8:
        !          1392:                                /* Credits */
        !          1393:                                getuserdat(cfg,user);
        !          1394:                                sprintf(str,"%lu",user->cdt);
        !          1395:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Credits",str,10,K_EDIT|K_NUMBER);
        !          1396:                                if(uifc.changes) {
        !          1397:                                        user->cdt=strtoul(str,NULL,10);
        !          1398:                                        putuserrec(cfg,user->number,U_CDT,10,ultoa(user->cdt,str,10));
        !          1399:                                }
        !          1400:                                break;
        !          1401:                        case 9:
        !          1402:                                /* Free Credits */
        !          1403:                                getuserdat(cfg,user);
        !          1404:                                sprintf(str,"%lu",user->freecdt);
        !          1405:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Free Credits",str,10,K_EDIT|K_NUMBER);
        !          1406:                                if(uifc.changes) {
        !          1407:                                        user->freecdt=strtoul(str,NULL,10);
        !          1408:                                        putuserrec(cfg,user->number,U_FREECDT,10,ultoa(user->freecdt,str,10));
        !          1409:                                }
        !          1410:                                break;
        !          1411:                        case 10:
        !          1412:                                /* Minutes */
        !          1413:                                getuserdat(cfg,user);
        !          1414:                                sprintf(str,"%lu",user->min);
        !          1415:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Minutes",str,10,K_EDIT|K_NUMBER);
        !          1416:                                if(uifc.changes) {
        !          1417:                                        user->min=strtoul(str,NULL,10);
        !          1418:                                        putuserrec(cfg,user->number,U_MIN,10,ultoa(user->min,str,10));
        !          1419:                                }
        !          1420:                                break;
        !          1421:                }
        !          1422:        }
        !          1423: 
        !          1424:        return(0);
        !          1425: }
        !          1426: 
        !          1427: /*
        !          1428:  * Personal settings...
        !          1429:  *     Real Name
        !          1430:  *     Alias
        !          1431:  *     Chat Handle
        !          1432:  *     Computer
        !          1433:  *     NetMail
        !          1434:  *     Gender
        !          1435:  *     Birthdate
        !          1436:  *     Address 1
        !          1437:  *     Location
        !          1438:  *     Postal/ZIP
        !          1439:  *     Phone
        !          1440:  *     Computer
        !          1441:  *     Connection
        !          1442:  *     Password
        !          1443:  *     Note
        !          1444:  *     Comment
        !          1445:  */
        !          1446: int edit_personal(scfg_t *cfg, user_t *user)
        !          1447: {
        !          1448:        int     i,j;
        !          1449:        char    **opt;
        !          1450:        char    onech[2];
        !          1451:        char    str[256];
        !          1452: 
        !          1453:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !          1454:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !          1455:        for(i=0;i<(MAX_OPTS+1);i++)
        !          1456:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !          1457:                        allocfail(MAX_OPLN);
        !          1458: 
        !          1459:        j=0;
        !          1460:        while(1) {
        !          1461:                getuserdat(cfg,user);
        !          1462:                i=0;
        !          1463:                sprintf(opt[i++],"Real Name   %s",user->name);
        !          1464:                sprintf(opt[i++],"Alias       %s",user->alias);
        !          1465:                sprintf(opt[i++],"Chat Handle %s",user->handle);
        !          1466:                sprintf(opt[i++],"NetMail     %s",user->netmail);
        !          1467:                sprintf(opt[i++],"Gender      %c",user->sex);
        !          1468:                sprintf(opt[i++],"D.O.B.      %s",user->birth);
        !          1469:                sprintf(opt[i++],"Address     %s",user->address);
        !          1470:                sprintf(opt[i++],"Location    %s",user->location);
        !          1471:                sprintf(opt[i++],"Postal/Zip  %s",user->zipcode);
        !          1472:                sprintf(opt[i++],"Phone       %s",user->phone);
        !          1473:                sprintf(opt[i++],"Computer    %s",user->comp);
        !          1474:                sprintf(opt[i++],"Connection  %s",user->modem);
        !          1475:                sprintf(opt[i++],"Password    %s",user->pass);
        !          1476:                sprintf(opt[i++],"Note        %s",user->note);
        !          1477:                sprintf(opt[i++],"Comment     %s",user->comment);
        !          1478:                opt[i][0]=0;
        !          1479:                uifc.changes=FALSE;
        !          1480:                switch(uifc.list(WIN_MID|WIN_ACT,0,0,0,&j,0,"Personal Settings",opt)) {
        !          1481:                        case -1:
        !          1482:                                freeopt(opt);
        !          1483:                                return(0);
        !          1484:                        case 0:
        !          1485:                                /* Real Name */
        !          1486:                                getuserdat(cfg,user);
        !          1487:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Real Name",user->name,LEN_NAME,K_EDIT);
        !          1488:                                if(uifc.changes)
        !          1489:                                        putuserrec(cfg,user->number,U_NAME,LEN_NAME,user->name);
        !          1490:                                break;
        !          1491:                        case 1:
        !          1492:                                /* Alias */
        !          1493:                                getuserdat(cfg,user);
        !          1494:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Alias",user->alias,LEN_ALIAS,K_EDIT);
        !          1495:                                if(uifc.changes)
        !          1496:                                        putuserrec(cfg,user->number,U_ALIAS,LEN_ALIAS,user->alias);
        !          1497:                                        putusername(cfg,user->number,user->alias);
        !          1498:                                break;
        !          1499:                        case 2:
        !          1500:                                /* Handle */
        !          1501:                                getuserdat(cfg,user);
        !          1502:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Chat Handle",user->handle,LEN_ALIAS,K_EDIT);
        !          1503:                                if(uifc.changes)
        !          1504:                                        putuserrec(cfg,user->number,U_HANDLE,LEN_HANDLE,user->handle);
        !          1505:                                break;
        !          1506:                        case 3:
        !          1507:                                /* NetMail */
        !          1508:                                getuserdat(cfg,user);
        !          1509:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"NetMail Address",user->netmail,LEN_NETMAIL,K_EDIT);
        !          1510:                                if(uifc.changes)
        !          1511:                                        putuserrec(cfg,user->number,U_NETMAIL,LEN_NETMAIL,user->netmail);
        !          1512:                                break;
        !          1513:                        case 4:
        !          1514:                                /* Gender */
        !          1515:                                getuserdat(cfg,user);
        !          1516:                                sprintf(onech,"%c",user->sex);
        !          1517:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Gender",onech,1,K_UPPER|K_ALPHA|K_EDIT);
        !          1518:                                if(uifc.changes) {
        !          1519:                                        user->sex=onech[0];
        !          1520:                                        putuserrec(cfg,user->number,U_SEX,1,onech);
        !          1521:                                }
        !          1522:                                break;
        !          1523:                        case 5:
        !          1524:                            /* D.O.B */
        !          1525:                                getuserdat(cfg,user);
        !          1526:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"D.O.B.",user->birth,LEN_BIRTH,K_EDIT);
        !          1527:                                if(uifc.changes)
        !          1528:                                        putuserrec(cfg,user->number,U_BIRTH,LEN_BIRTH,user->birth);
        !          1529:                                break;
        !          1530:                        case 6:
        !          1531:                                /* Address */
        !          1532:                                getuserdat(cfg,user);
        !          1533:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Address",user->address,LEN_ADDRESS,K_EDIT);
        !          1534:                                if(uifc.changes)
        !          1535:                                        putuserrec(cfg,user->number,U_ADDRESS,LEN_ADDRESS,user->address);
        !          1536:                                break;
        !          1537:                        case 7:
        !          1538:                                /* Location */
        !          1539:                                getuserdat(cfg,user);
        !          1540:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Location",user->location,LEN_LOCATION,K_EDIT);
        !          1541:                                if(uifc.changes)
        !          1542:                                        putuserrec(cfg,user->number,U_LOCATION,LEN_LOCATION,user->location);
        !          1543:                                break;
        !          1544:                        case 8:
        !          1545:                                /* Postal/Zip */
        !          1546:                                getuserdat(cfg,user);
        !          1547:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Postal/Zip Code",user->zipcode,LEN_ZIPCODE,K_EDIT);
        !          1548:                                if(uifc.changes)
        !          1549:                                        putuserrec(cfg,user->number,U_ZIPCODE,LEN_ZIPCODE,user->zipcode);
        !          1550:                                break;
        !          1551:                        case 9:
        !          1552:                                /* Phone */
        !          1553:                                getuserdat(cfg,user);
        !          1554:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Phone",user->phone,LEN_PHONE,K_EDIT);
        !          1555:                                if(uifc.changes)
        !          1556:                                        putuserrec(cfg,user->number,U_PHONE,LEN_PHONE,user->phone);
        !          1557:                                break;
        !          1558:                        case 10:
        !          1559:                                /* Computer */
        !          1560:                                getuserdat(cfg,user);
        !          1561:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Computer",user->comp,LEN_COMP,K_EDIT);
        !          1562:                                if(uifc.changes)
        !          1563:                                        putuserrec(cfg,user->number,U_COMP,LEN_COMP,user->comp);
        !          1564:                                break;
        !          1565: 
        !          1566:             case 11:
        !          1567:                                /* Connection */
        !          1568:                                getuserdat(cfg,user);
        !          1569:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Connection",user->modem,LEN_MODEM,K_EDIT);
        !          1570:                                if(uifc.changes)
        !          1571:                                        putuserrec(cfg,user->number,U_MODEM,LEN_MODEM,user->modem);
        !          1572:                                break;
        !          1573:                        case 12:
        !          1574:                                /* Password */
        !          1575:                                getuserdat(cfg,user);
        !          1576:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Password",user->pass,LEN_PASS,K_EDIT);
        !          1577:                                if(uifc.changes) {
        !          1578:                                        putuserrec(cfg,user->number,U_PASS,LEN_PASS,user->pass);
        !          1579:                                        user->pwmod=time(NULL);
        !          1580:                                        putuserrec(cfg,user->number,U_PWMOD,8,ultoa(user->pwmod,str,16));
        !          1581:                                }
        !          1582:                                break;
        !          1583:                        case 13:
        !          1584:                                /* Note */
        !          1585:                                getuserdat(cfg,user);
        !          1586:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Note",user->note,LEN_NOTE,K_EDIT);
        !          1587:                                if(uifc.changes)
        !          1588:                                        putuserrec(cfg,user->number,U_NOTE,LEN_NOTE,user->note);
        !          1589:                                break;
        !          1590:                        case 14:
        !          1591:                            /* Comment */
        !          1592:                                getuserdat(cfg,user);
        !          1593:                                uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Comment",user->comment,LEN_COMMENT,K_EDIT);
        !          1594:                                if(uifc.changes)
        !          1595:                                        putuserrec(cfg,user->number,U_COMMENT,60,user->comment);
        !          1596:                                break;
        !          1597:                }
        !          1598:        }
        !          1599: 
        !          1600:        return(0);
        !          1601: }
        !          1602: 
        !          1603: /* This is where the good stuff happens */
        !          1604: 
        !          1605: int edit_user(scfg_t *cfg, int usernum)
        !          1606: {
        !          1607:        char**  opt;
        !          1608:        int     i,j;
        !          1609:        user_t  user;
        !          1610:        char    str[256];
        !          1611: 
        !          1612:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !          1613:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !          1614:        for(i=0;i<(MAX_OPTS+1);i++)
        !          1615:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !          1616:                        allocfail(MAX_OPLN);
        !          1617: 
        !          1618:        user.number=usernum;
        !          1619: 
        !          1620:        j=0;
        !          1621:        while(1) {
        !          1622:                getuserdat(cfg,&user);
        !          1623:                i=0;
        !          1624:                if (user.misc & DELETED)
        !          1625:                        strcpy(opt[i++],"Undelete");
        !          1626:                else
        !          1627:                        strcpy(opt[i++],"Delete");
        !          1628:                if (user.misc & INACTIVE)
        !          1629:                        strcpy(opt[i++],"Activate");
        !          1630:                else
        !          1631:                strcpy(opt[i++],"Deactivate");
        !          1632:                strcpy(opt[i++],"Personal");
        !          1633:                strcpy(opt[i++],"Security");
        !          1634:                strcpy(opt[i++],"Statistics");
        !          1635:                strcpy(opt[i++],"Settings");
        !          1636:                strcpy(opt[i++],"MSG/File Settings");
        !          1637:                strcpy(opt[i++],"Extended Comment");
        !          1638:                opt[i][0]=0;
        !          1639: 
        !          1640:                sprintf(str,"Edit User: %d (%s)",user.number,user.name[0]?user.name:user.alias);
        !          1641:                switch(uifc.list(WIN_ORG|WIN_ACT,0,0,0,&j,0,str,opt)) {
        !          1642:                        case -1:
        !          1643:                                freeopt(opt);
        !          1644:                                return(0);
        !          1645: 
        !          1646:                        case 0:
        !          1647:                                user.misc ^= DELETED;
        !          1648:                                putuserrec(cfg,user.number,U_MISC,8,ultoa(user.misc,str,16));
        !          1649:                                putusername(cfg,user.number,nulstr);
        !          1650:                                break;
        !          1651: 
        !          1652:                        case 1:
        !          1653:                                user.misc ^= INACTIVE;
        !          1654:                                putuserrec(cfg,user.number,U_MISC,8,ultoa(user.misc,str,16));
        !          1655:                                break;
        !          1656: 
        !          1657:                        case 2:
        !          1658:                                edit_personal(cfg,&user);
        !          1659:                                break;
        !          1660: 
        !          1661:                        case 3:
        !          1662:                                edit_security(cfg,&user);
        !          1663:                                break;
        !          1664: 
        !          1665:                        case 4:
        !          1666:                                edit_stats(cfg,&user);
        !          1667:                                break;
        !          1668: 
        !          1669:                        case 5:
        !          1670:                                edit_settings(cfg,&user);
        !          1671:                                break;
        !          1672: 
        !          1673:                        case 6:
        !          1674:                                edit_msgfile(cfg,&user);
        !          1675:                                break;
        !          1676: 
        !          1677:                        case 7:
        !          1678:                                edit_comment(cfg,&user);
        !          1679:                                break;
        !          1680: 
        !          1681:                        default:
        !          1682:                                break;
        !          1683:                }
        !          1684:        }
        !          1685: 
        !          1686:        return(0);
        !          1687: }
        !          1688: 
        !          1689: int finduser(scfg_t *cfg, user_t *user)
        !          1690: {
        !          1691:        int i,j,last;
        !          1692:        ushort un;
        !          1693:        char str[256];
        !          1694:        struct user_list **opt;
        !          1695:        int done=0;
        !          1696: 
        !          1697:        if((opt=(struct user_list **)MALLOC(sizeof(struct user_list *)*(MAX_OPTS+1)))==NULL)
        !          1698:                allocfail(sizeof(struct user_list *)*(MAX_OPTS+1));
        !          1699:        for(i=0;i<(MAX_OPTS+1);i++)
        !          1700:                opt[i]=NULL;
        !          1701: 
        !          1702:        str[0]=0;
        !          1703:        uifc.input(WIN_MID|WIN_ACT|WIN_SAV,0,0,"Search String",str,LEN_NAME,K_EDIT);
        !          1704:        un=atoi(str);
        !          1705:        /* User List */
        !          1706:        done=0;
        !          1707:        while(!done) {
        !          1708:                last=lastuser(cfg);
        !          1709:                j=0;
        !          1710:                for(i=1; i<=last; i++) {
        !          1711:                        user->number=i;
        !          1712:                        getuserdat(cfg,user);
        !          1713:                        if(strcasestr(user->alias, str)!=NULL || strcasestr(user->name, str)!=NULL || strcasestr(user->handle, str)!=NULL
        !          1714:                                        || user->number==un) {
        !          1715:                                if((opt[j]=(struct user_list *)malloc(sizeof(struct user_list)))==NULL)
        !          1716:                                        allocfail(sizeof(struct user_list));
        !          1717:                                sprintf(opt[j]->info,"%1.1s�%1.1s� %-25.25s � %-25.25s",user->misc&DELETED?"*":" ",user->misc&INACTIVE?"*":" ",user->name,user->alias);
        !          1718:                                opt[j++]->usernum=i;
        !          1719:                        }
        !          1720:                }
        !          1721:                if((opt[j]=(struct user_list *)malloc(sizeof(struct user_list)))==NULL)
        !          1722:                        allocfail(sizeof(struct user_list));
        !          1723:                opt[j]->info[0]=0;
        !          1724:                i=0;
        !          1725:                switch(uifc.list(WIN_ORG|WIN_MID|WIN_ACT,0,0,0,&i,0,"D�I� Real Name                 � Alias                    ",(char **)opt)) {
        !          1726:                        case -1:
        !          1727:                                done=1;
        !          1728:                                break;
        !          1729:                        default:
        !          1730:                                edit_user(cfg, opt[i]->usernum);
        !          1731:                                break;
        !          1732:                }
        !          1733:        }
        !          1734:        return(0);
        !          1735: }
        !          1736: 
        !          1737: /* Get newly created Default User "New User" and set for Editing */
        !          1738: /*               Adapted from finduser function                  */
        !          1739: 
        !          1740: int getuser(scfg_t *cfg, user_t *user, char* str)
        !          1741: {
        !          1742:        int i,j,last;
        !          1743:        ushort un;
        !          1744:        struct user_list **opt;
        !          1745:        int done=0;
        !          1746: 
        !          1747:        if((opt=(struct user_list **)MALLOC(sizeof(struct user_list *)*(MAX_OPTS+1)))==NULL)
        !          1748:                allocfail(sizeof(struct user_list *)*(MAX_OPTS+1));
        !          1749:        for(i=0;i<(MAX_OPTS+1);i++)
        !          1750:                opt[i]=NULL;
        !          1751: 
        !          1752:        /* User List */
        !          1753:        done=0;
        !          1754:        while(!done) {
        !          1755:                last=lastuser(cfg);
        !          1756:                j=0;
        !          1757:                for(i=1; i<=last; i++) {
        !          1758:                        user->number=i;
        !          1759:                        getuserdat(cfg,user);
        !          1760:                        if(strcasestr(user->alias, str)!=NULL || strcasestr(user->name, str)!=NULL || strcasestr(user->handle, str)!=NULL) {
        !          1761:                                if((opt[j]=(struct user_list *)malloc(sizeof(struct user_list)))==NULL)
        !          1762:                                        allocfail(sizeof(struct user_list));
        !          1763:                                sprintf(opt[j]->info,"%1.1s�%1.1s� %-25.25s � %-25.25s",user->misc&DELETED?"*":" ",user->misc&INACTIVE?"*":" ",user->name,user->alias);
        !          1764:                                opt[j++]->usernum=i;
        !          1765:                        }
        !          1766:                }
        !          1767:                if((opt[j]=(struct user_list *)malloc(sizeof(struct user_list)))==NULL)
        !          1768:                        allocfail(sizeof(struct user_list));
        !          1769:                opt[j]->info[0]=0;
        !          1770:                i=0;
        !          1771:                switch(uifc.list(WIN_ORG|WIN_MID|WIN_ACT,0,0,0,&i,0,"D�I� Real Name                 � Alias                    ",(char **)opt)) {
        !          1772:                        case -1:
        !          1773:                                done=1;
        !          1774:                                break;
        !          1775:                        default:
        !          1776:                                edit_user(cfg, opt[i]->usernum);
        !          1777:                                done=1;
        !          1778:                                break;
        !          1779:                }
        !          1780:        }
        !          1781:        return(0);
        !          1782: }
        !          1783: 
        !          1784: /* Create a Default User: "New User" */
        !          1785: /*      Adapted from makeuser.c      */
        !          1786: 
        !          1787: int createdefaults()
        !          1788: 
        !          1789: {
        !          1790:        int             i;
        !          1791:        time_t  now;
        !          1792:        scfg_t cfg;
        !          1793:        user_t  user;
        !          1794:        char    error[512];
        !          1795:        char* environ;
        !          1796: 
        !          1797:        environ=getenv("SBBSCTRL");
        !          1798: 
        !          1799:        memset(&cfg,0,sizeof(cfg));
        !          1800:        cfg.size=sizeof(cfg);
        !          1801:        SAFECOPY(cfg.ctrl_dir,environ);
        !          1802: 
        !          1803:        if(chdir(cfg.ctrl_dir)!=0)
        !          1804:                lprintf("!ERROR changing directory to: %s", cfg.ctrl_dir);
        !          1805: 
        !          1806:        if(!load_cfg(&cfg,NULL,TRUE,error)) {
        !          1807:                lprintf("!ERROR loading configuration files: %s\n",error);
        !          1808:                exit(1);
        !          1809:        }
        !          1810: 
        !          1811:        if(!(cfg.sys_misc&SM_LOCAL_TZ))
        !          1812:                putenv("TZ=UTC0");
        !          1813: 
        !          1814:        now=time(NULL);
        !          1815: 
        !          1816:        memset(&user,0,sizeof(user));
        !          1817: 
        !          1818:     SAFECOPY(user.alias,"New Alias");
        !          1819:     SAFECOPY(user.name,"New User");
        !          1820:     SAFECOPY(user.handle,"New Handle");
        !          1821:     SAFECOPY(user.pass,"PASSWORD");
        !          1822:     SAFECOPY(user.birth,"01/01/80");
        !          1823: 
        !          1824:     SAFECOPY(user.address,"123 My Street");
        !          1825:     SAFECOPY(user.location,"City, St");
        !          1826:     SAFECOPY(user.zipcode,"123456");
        !          1827: 
        !          1828:        SAFECOPY(user.phone,"123-456-7890");
        !          1829: 
        !          1830:     user.level=10;
        !          1831: 
        !          1832:     SAFECOPY(user.comment," ");
        !          1833: 
        !          1834:     SAFECOPY(user.netmail,"[email protected]");
        !          1835: 
        !          1836:        user.level=cfg.new_level;
        !          1837:        user.flags1=cfg.new_flags1;
        !          1838:        user.flags2=cfg.new_flags2;
        !          1839:        user.flags3=cfg.new_flags3;
        !          1840:        user.flags4=cfg.new_flags4;
        !          1841:        user.rest=cfg.new_rest;
        !          1842:        user.exempt=cfg.new_exempt;
        !          1843: 
        !          1844:        user.cdt=cfg.new_cdt;
        !          1845:        user.min=cfg.new_min;
        !          1846:        user.freecdt=cfg.level_freecdtperday[user.level];
        !          1847: 
        !          1848:        if(cfg.total_fcomps)
        !          1849:                strcpy(user.tmpext,cfg.fcomp[0]->ext);
        !          1850:        else
        !          1851:                strcpy(user.tmpext,"ZIP");
        !          1852:        for(i=0;i<cfg.total_xedits;i++)
        !          1853:                if(!stricmp(cfg.xedit[i]->code,cfg.new_xedit))
        !          1854:                        break;
        !          1855:        if(i<cfg.total_xedits)
        !          1856:                user.xedit=i+1;
        !          1857: 
        !          1858:        user.shell=cfg.new_shell;
        !          1859:        user.misc=(cfg.new_misc&~(DELETED|INACTIVE|QUIET|NETMAIL));
        !          1860:     user.misc^=AUTOTERM;
        !          1861:     user.misc^=ANSI;
        !          1862:     user.misc^=COLOR;
        !          1863:        user.qwk=QWK_DEFAULT;
        !          1864:        user.firston=now;
        !          1865:        user.laston=now;
        !          1866:        user.pwmod=now;
        !          1867:        user.logontime=now;
        !          1868:        user.sex=' ';
        !          1869:        user.prot=cfg.new_prot;
        !          1870:        if(cfg.new_expire)
        !          1871:                user.expire=now+((long)cfg.new_expire*24L*60L*60L);
        !          1872: 
        !          1873:        if((i=matchuser(&cfg,user.alias,FALSE))!=0) {
        !          1874:            lprintf("Error!  Default User already in Userfile");
        !          1875:                return(2);
        !          1876:        }
        !          1877: 
        !          1878:        if(user.handle[0]==0)
        !          1879:                SAFECOPY(user.handle,user.alias);
        !          1880:        if(user.name[0]==0)
        !          1881:                SAFECOPY(user.name,user.alias);
        !          1882: 
        !          1883:        if((i=newuserdat(&cfg, &user))!=0) {
        !          1884:            lprintf("%s %d", "Error creating Default User.  Error # ",i);
        !          1885:                return(i);
        !          1886:        }
        !          1887:        return(i);
        !          1888: }
        !          1889: 
        !          1890: int main(int argc, char** argv)  {
        !          1891:        char**  opt;
        !          1892:        char**  mopt;
        !          1893:        int             main_dflt=0;
        !          1894:        int             main_bar=0;
        !          1895:        char    revision[16];
        !          1896:        char    str[256],ctrl_dir[41],*p;
        !          1897:        char    title[256];
        !          1898:        int             i,j,result;
        !          1899:        scfg_t  cfg;
        !          1900:        int             done;
        !          1901:        int             last, newlast;
        !          1902:        user_t  user;
        !          1903:        int             edtuser=0;
        !          1904:        int             ciolib_mode=CIOLIB_MODE_AUTO;
        !          1905: 
        !          1906:        /******************/
        !          1907:        /* Ini file stuff */
        !          1908:        /******************/
        !          1909:        char    ini_file[MAX_PATH+1];
        !          1910:        FILE*                           fp;
        !          1911:        bbs_startup_t           bbs_startup;
        !          1912: 
        !          1913:        sscanf("$Revision: 1.38 $", "%*s %s", revision);
        !          1914: 
        !          1915:     printf("\nSynchronet User Editor %s-%s  Copyright 2004 "
        !          1916:         "Rob Swindell\n",revision,PLATFORM_DESC);
        !          1917: 
        !          1918:        p=getenv("SBBSCTRL");
        !          1919:        if(p==NULL) {
        !          1920:                printf("\7\nSBBSCTRL environment variable is not set.\n");
        !          1921:                printf("This environment variable must be set to your CTRL directory.");
        !          1922:                printf("\nExample: SET SBBSCTRL=/sbbs/ctrl\n");
        !          1923:                exit(1); }
        !          1924: 
        !          1925:        sprintf(ctrl_dir,"%.40s",p);
        !          1926:        if(ctrl_dir[strlen(ctrl_dir)-1]!='\\'
        !          1927:                && ctrl_dir[strlen(ctrl_dir)-1]!='/')
        !          1928:                strcat(ctrl_dir,"/");
        !          1929: 
        !          1930:        gethostname(str,sizeof(str)-1);
        !          1931: 
        !          1932:        sbbs_get_ini_fname(ini_file, ctrl_dir, str);
        !          1933: 
        !          1934:        /* Initialize BBS startup structure */
        !          1935:     memset(&bbs_startup,0,sizeof(bbs_startup));
        !          1936:     bbs_startup.size=sizeof(bbs_startup);
        !          1937:     strcpy(bbs_startup.ctrl_dir,ctrl_dir);
        !          1938: 
        !          1939:        /* Read .ini file here */
        !          1940:        if(ini_file[0]!=0 && (fp=fopen(ini_file,"r"))!=NULL) {
        !          1941:                printf("Reading %s\n",ini_file);
        !          1942:        }
        !          1943:        /* We call this function to set defaults, even if there's no .ini file */
        !          1944:        sbbs_read_ini(fp,
        !          1945:                NULL,           /* global_startup */
        !          1946:                NULL, &bbs_startup,
        !          1947:                NULL, NULL, /* ftp_startup */
        !          1948:                NULL, NULL, /* web_startup */
        !          1949:                NULL, NULL, /* mail_startup */
        !          1950:                NULL, NULL  /* services_startup */
        !          1951:                );
        !          1952: 
        !          1953:        /* close .ini file here */
        !          1954:        if(fp!=NULL)
        !          1955:                fclose(fp);
        !          1956: 
        !          1957:        chdir(bbs_startup.ctrl_dir);
        !          1958: 
        !          1959:        /* Read .cfg files here */
        !          1960:     memset(&cfg,0,sizeof(cfg));
        !          1961:        cfg.size=sizeof(cfg);
        !          1962:        SAFECOPY(cfg.ctrl_dir,bbs_startup.ctrl_dir);
        !          1963:        if(!load_cfg(&cfg, NULL, TRUE, str)) {
        !          1964:                printf("ERROR! %s\n",str);
        !          1965:                exit(1);
        !          1966:        }
        !          1967:        prep_dir(cfg.data_dir, cfg.temp_dir, sizeof(cfg.temp_dir));
        !          1968: 
        !          1969:     memset(&uifc,0,sizeof(uifc));
        !          1970: 
        !          1971:        uifc.esc_delay=500;
        !          1972: 
        !          1973:        for(i=1;i<argc;i++) {
        !          1974:         if(argv[i][0]=='-')
        !          1975:             switch(toupper(argv[i][1])) {
        !          1976:                 case 'C':
        !          1977:                                uifc.mode|=UIFC_COLOR;
        !          1978:                     break;
        !          1979:                 case 'L':
        !          1980:                     uifc.scrn_len=atoi(argv[i]+2);
        !          1981:                     break;
        !          1982:                 case 'E':
        !          1983:                     uifc.esc_delay=atoi(argv[i]+2);
        !          1984:                     break;
        !          1985:                                case 'I':
        !          1986:                                        switch(toupper(argv[i][2])) {
        !          1987:                                                case 'A':
        !          1988:                                                        ciolib_mode=CIOLIB_MODE_ANSI;
        !          1989:                                                        break;
        !          1990:                                                case 'C':
        !          1991:                                                        ciolib_mode=CIOLIB_MODE_CURSES;
        !          1992:                                                        break;
        !          1993:                                                case 0:
        !          1994:                                                        printf("NOTICE: The -i option is depreciated, use -if instead\r\n");
        !          1995:                                                        SLEEP(2000);
        !          1996:                                                case 'F':
        !          1997:                                                        ciolib_mode=CIOLIB_MODE_CURSES_IBM;
        !          1998:                                                        break;
        !          1999:                                                case 'X':
        !          2000:                                                        ciolib_mode=CIOLIB_MODE_X;
        !          2001:                                                        break;
        !          2002:                                                case 'W':
        !          2003:                                                        ciolib_mode=CIOLIB_MODE_CONIO;
        !          2004:                                                        break;
        !          2005:                                                default:
        !          2006:                                                        goto USAGE;
        !          2007:                                        }
        !          2008:                                        break;
        !          2009:                 default:
        !          2010:                                        USAGE:
        !          2011:                     printf("\nusage: %s [ctrl_dir] [options]"
        !          2012:                         "\n\noptions:\n\n"
        !          2013:                         "-c  =  force color mode\n"
        !          2014:                         "-e# =  set escape delay to #msec\n"
        !          2015:                                                "-iX =  set interface mode to X (default=auto) where X is one of:\r\n"
        !          2016: #ifdef __unix__
        !          2017:                                                "       X = X11 mode\r\n"
        !          2018:                                                "       C = Curses mode\r\n"
        !          2019:                                                "       F = Curses mode with forced IBM charset\r\n"
        !          2020: #else
        !          2021:                                                "       W = Win32 native mode\r\n"
        !          2022: #endif
        !          2023:                                                "       A = ANSI mode\r\n"
        !          2024:                         "-l# =  set screen lines to #\n"
        !          2025:                                                ,argv[0]
        !          2026:                         );
        !          2027:                                exit(0);
        !          2028:                }
        !          2029:                if(atoi(argv[i]))
        !          2030:                        edtuser=atoi(argv[i]);
        !          2031:     }
        !          2032: 
        !          2033: #ifdef __unix__
        !          2034:        signal(SIGPIPE, SIG_IGN);
        !          2035: #endif
        !          2036: 
        !          2037:        uifc.size=sizeof(uifc);
        !          2038:        i=initciolib(ciolib_mode);
        !          2039:        if(i!=0) {
        !          2040:        printf("ciolib library init returned error %d\n",i);
        !          2041:        exit(1);
        !          2042:        }
        !          2043:        i=uifcini32(&uifc);  /* curses */
        !          2044:        if(i!=0) {
        !          2045:                printf("uifc library init returned error %d\n",i);
        !          2046:                exit(1);
        !          2047:        }
        !          2048: 
        !          2049:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !          2050:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !          2051:        for(i=0;i<(MAX_OPTS+1);i++)
        !          2052:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !          2053:                        allocfail(MAX_OPLN);
        !          2054: 
        !          2055:        if((mopt=(char **)MALLOC(sizeof(char *)*MAX_OPTS))==NULL)
        !          2056:                allocfail(sizeof(char *)*MAX_OPTS);
        !          2057:        for(i=0;i<MAX_OPTS;i++)
        !          2058:                if((mopt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
        !          2059:                        allocfail(MAX_OPLN);
        !          2060: 
        !          2061:        sprintf(title,"Synchronet User Editor %s-%s",revision,PLATFORM_DESC);
        !          2062:        if(uifc.scrn(title)) {
        !          2063:                printf(" USCRN (len=%d) failed!\n",uifc.scrn_len+1);
        !          2064:                bail(1);
        !          2065:        }
        !          2066: 
        !          2067:        if(edtuser) {
        !          2068:                edit_user(&cfg, edtuser);
        !          2069:                bail(0);
        !          2070:        }
        !          2071: 
        !          2072:        strcpy(mopt[0],"New User");
        !          2073:        strcpy(mopt[1],"Find User");
        !          2074:        strcpy(mopt[2],"User List");
        !          2075:        mopt[3][0]=0;
        !          2076: 
        !          2077:        uifc.helpbuf=   "`User Editor\n"
        !          2078:                                        "`-----------\n\n"
        !          2079:                                        "`New User  : `Add a new user.  This will created a default user using\n"
        !          2080:                                        "            some default entries that you can then edit.\n"
        !          2081:                                        "`Find User : `Find a user using full or partial search name\n"
        !          2082:                                        "`User List : `Display the complete User List.  Users can be edited from\n"
        !          2083:                                        "            this list by highlighting a user and pressing Enter";
        !          2084: 
        !          2085:        while(1) {
        !          2086:                j=uifc.list(WIN_L2R|WIN_ESC|WIN_ACT|WIN_DYN|WIN_ORG|WIN_EXTKEYS,0,5,0,&main_dflt,&main_bar
        !          2087:                        ,title,mopt);
        !          2088: 
        !          2089:                if(j == -2)
        !          2090:                        continue;
        !          2091: 
        !          2092:                if(j==-8) {     /* CTRL-F */
        !          2093:                        /* Find User */
        !          2094:                        finduser(&cfg,&user);
        !          2095:                }
        !          2096: 
        !          2097:                if(j <= -2)
        !          2098:                        continue;
        !          2099: 
        !          2100:                if(j==-1) {
        !          2101:                        uifc.helpbuf=   "`Exit Synchronet User Editor\n"
        !          2102:                                                        "`---------------------------\n\n"
        !          2103:                                                        "If you want to exit the Synchronet user editor,\n"
        !          2104:                                                        "select `Yes`. Otherwise, select `No` or hit ~ ESC ~.";
        !          2105:                        if(confirm("Exit Synchronet User Editor")==1)
        !          2106:                                bail(0);
        !          2107:                        continue;
        !          2108:                }
        !          2109: 
        !          2110:                if(j==0) {
        !          2111:                        /* New User */
        !          2112:                            createdefaults();
        !          2113:                            lprintf("Please edit defaults using next screen.");
        !          2114:                            getuser(&cfg,&user,"New User");
        !          2115:                }
        !          2116:                if(j==1) {
        !          2117:                    /* Find User */
        !          2118:                        finduser(&cfg,&user);
        !          2119:                }
        !          2120:                if(j==2) {
        !          2121:                        /* User List */
        !          2122:                        done=0;
        !          2123:                        while(!done) {
        !          2124:                                last=lastuser(&cfg);
        !          2125:                                for(i=1; i<=last; i++) {
        !          2126:                                        user.number=i;
        !          2127:                                        getuserdat(&cfg,&user);
        !          2128:                                        sprintf(opt[i-1],"%1.1s�%1.1s� %-25.25s � %-25.25s",user.misc&DELETED?"*":" ",user.misc&INACTIVE?"*":" ",user.name,user.alias);
        !          2129:                                }
        !          2130:                                opt[i-1][0]=0;
        !          2131:                                i=0;
        !          2132:                                switch(uifc.list(WIN_ORG|WIN_MID|WIN_ACT,0,0,0,&i,0,"D�I� Real Name                 � Alias                    ",opt)) {
        !          2133:                                        case -1:
        !          2134:                                                done=1;
        !          2135:                                                break;
        !          2136:                                        default:
        !          2137:                                                edit_user(&cfg, i+1);
        !          2138:                                                break;
        !          2139:                                }
        !          2140:                        }
        !          2141:                }
        !          2142:        }
        !          2143: }
        !          2144: 
        !          2145: 
        !          2146: 

unix.superglobalmegacorp.com

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