Annotation of sbbs/src/sbbs3/uedit/uedit.c, revision 1.1.1.2

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

unix.superglobalmegacorp.com

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