Annotation of sbbs/sbbs3/uedit/uedit.c, revision 1.1.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.