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

1.1     ! root        1: /* uedit.c */
        !             2: 
        !             3: /* Synchronet for *nix user editor */
        !             4: 
        !             5: /* $Id: uedit.c,v 1.45 2006/12/22 22:09:14 deuce Exp $ */
        !             6: 
        !             7: /****************************************************************************
        !             8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
        !             9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
        !            10:  *                                                                                                                                                     *
        !            11:  * Copyright 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;
        !           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");
        !           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);
        !          1007:                sprintf(opt[i++],"Password Modified  %s",user->pwmod?timestr(cfg, &user->pwmod, str):"Never");
        !          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;
        !          1669:        for(i=0; i<(MAX_OPTS+1); i++)
        !          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:        if(!(cfg.sys_misc&SM_LOCAL_TZ))
        !          1803:                putenv("TZ=UTC0");
        !          1804: 
        !          1805:        now=time(NULL);
        !          1806: 
        !          1807:        memset(&user,0,sizeof(user));
        !          1808: 
        !          1809:     SAFECOPY(user.alias,"New Alias");
        !          1810:     SAFECOPY(user.name,"New User");
        !          1811:     SAFECOPY(user.handle,"New Handle");
        !          1812:     SAFECOPY(user.pass,"PASSWORD");
        !          1813:     SAFECOPY(user.birth,"01/01/80");
        !          1814: 
        !          1815:     SAFECOPY(user.address,"123 My Street");
        !          1816:     SAFECOPY(user.location,"City, St");
        !          1817:     SAFECOPY(user.zipcode,"123456");
        !          1818: 
        !          1819:        SAFECOPY(user.phone,"123-456-7890");
        !          1820: 
        !          1821:     user.level=10;
        !          1822: 
        !          1823:     SAFECOPY(user.comment," ");
        !          1824: 
        !          1825:     SAFECOPY(user.netmail,"[email protected]");
        !          1826: 
        !          1827:        user.level=cfg.new_level;
        !          1828:        user.flags1=cfg.new_flags1;
        !          1829:        user.flags2=cfg.new_flags2;
        !          1830:        user.flags3=cfg.new_flags3;
        !          1831:        user.flags4=cfg.new_flags4;
        !          1832:        user.rest=cfg.new_rest;
        !          1833:        user.exempt=cfg.new_exempt;
        !          1834: 
        !          1835:        user.cdt=cfg.new_cdt;
        !          1836:        user.min=cfg.new_min;
        !          1837:        user.freecdt=cfg.level_freecdtperday[user.level];
        !          1838: 
        !          1839:        if(cfg.total_fcomps)
        !          1840:                strcpy(user.tmpext,cfg.fcomp[0]->ext);
        !          1841:        else
        !          1842:                strcpy(user.tmpext,"ZIP");
        !          1843:        for(i=0;i<cfg.total_xedits;i++)
        !          1844:                if(!stricmp(cfg.xedit[i]->code,cfg.new_xedit))
        !          1845:                        break;
        !          1846:        if(i<cfg.total_xedits)
        !          1847:                user.xedit=i+1;
        !          1848: 
        !          1849:        user.shell=cfg.new_shell;
        !          1850:        user.misc=(cfg.new_misc&~(DELETED|INACTIVE|QUIET|NETMAIL));
        !          1851:     user.misc^=AUTOTERM;
        !          1852:     user.misc^=ANSI;
        !          1853:     user.misc^=COLOR;
        !          1854:        user.qwk=QWK_DEFAULT;
        !          1855:        user.firston=now;
        !          1856:        user.laston=now;
        !          1857:        user.pwmod=now;
        !          1858:        user.logontime=now;
        !          1859:        user.sex=' ';
        !          1860:        user.prot=cfg.new_prot;
        !          1861:        if(cfg.new_expire)
        !          1862:                user.expire=now+((long)cfg.new_expire*24L*60L*60L);
        !          1863: 
        !          1864:        if((i=matchuser(&cfg,user.alias,FALSE))!=0) {
        !          1865:            lprintf("Error!  Default User already in Userfile");
        !          1866:                return(2);
        !          1867:        }
        !          1868: 
        !          1869:        if(user.handle[0]==0)
        !          1870:                SAFECOPY(user.handle,user.alias);
        !          1871:        if(user.name[0]==0)
        !          1872:                SAFECOPY(user.name,user.alias);
        !          1873: 
        !          1874:        if((i=newuserdat(&cfg, &user))!=0) {
        !          1875:            lprintf("%s %d", "Error creating Default User.  Error # ",i);
        !          1876:                return(i);
        !          1877:        }
        !          1878:        return(i);
        !          1879: }
        !          1880: 
        !          1881: int main(int argc, char** argv)  {
        !          1882:        char**  opt;
        !          1883:        char**  mopt;
        !          1884:        int             main_dflt=0;
        !          1885:        int             main_bar=0;
        !          1886:        char    revision[16];
        !          1887:        char    str[256],ctrl_dir[41],*p;
        !          1888:        char    title[256];
        !          1889:        int             i,j,result;
        !          1890:        scfg_t  cfg;
        !          1891:        int             done;
        !          1892:        int             last, newlast;
        !          1893:        user_t  user;
        !          1894:        int             edtuser=0;
        !          1895:        int             ciolib_mode=CIOLIB_MODE_AUTO;
        !          1896: 
        !          1897:        /******************/
        !          1898:        /* Ini file stuff */
        !          1899:        /******************/
        !          1900:        char    ini_file[MAX_PATH+1];
        !          1901:        FILE*                           fp;
        !          1902:        bbs_startup_t           bbs_startup;
        !          1903: 
        !          1904:        sscanf("$Revision: 1.45 $", "%*s %s", revision);
        !          1905: 
        !          1906:     printf("\nSynchronet User Editor %s-%s  Copyright %s "
        !          1907:         "Rob Swindell\n",revision,PLATFORM_DESC,__DATE__+7);
        !          1908: 
        !          1909:        p=getenv("SBBSCTRL");
        !          1910:        if(p==NULL) {
        !          1911:                printf("\7\nSBBSCTRL environment variable is not set.\n");
        !          1912:                printf("This environment variable must be set to your CTRL directory.");
        !          1913:                printf("\nExample: SET SBBSCTRL=/sbbs/ctrl\n");
        !          1914:                exit(1); }
        !          1915: 
        !          1916:        sprintf(ctrl_dir,"%.40s",p);
        !          1917:        if(ctrl_dir[strlen(ctrl_dir)-1]!='\\'
        !          1918:                && ctrl_dir[strlen(ctrl_dir)-1]!='/')
        !          1919:                strcat(ctrl_dir,"/");
        !          1920: 
        !          1921:        gethostname(str,sizeof(str)-1);
        !          1922: 
        !          1923:        sbbs_get_ini_fname(ini_file, ctrl_dir, str);
        !          1924: 
        !          1925:        /* Initialize BBS startup structure */
        !          1926:     memset(&bbs_startup,0,sizeof(bbs_startup));
        !          1927:     bbs_startup.size=sizeof(bbs_startup);
        !          1928:     strcpy(bbs_startup.ctrl_dir,ctrl_dir);
        !          1929: 
        !          1930:        /* Read .ini file here */
        !          1931:        if(ini_file[0]!=0 && (fp=fopen(ini_file,"r"))!=NULL) {
        !          1932:                printf("Reading %s\n",ini_file);
        !          1933:        }
        !          1934:        /* We call this function to set defaults, even if there's no .ini file */
        !          1935:        sbbs_read_ini(fp,
        !          1936:                NULL,           /* global_startup */
        !          1937:                NULL, &bbs_startup,
        !          1938:                NULL, NULL, /* ftp_startup */
        !          1939:                NULL, NULL, /* web_startup */
        !          1940:                NULL, NULL, /* mail_startup */
        !          1941:                NULL, NULL  /* services_startup */
        !          1942:                );
        !          1943: 
        !          1944:        /* close .ini file here */
        !          1945:        if(fp!=NULL)
        !          1946:                fclose(fp);
        !          1947: 
        !          1948:        chdir(bbs_startup.ctrl_dir);
        !          1949: 
        !          1950:        /* Read .cfg files here */
        !          1951:     memset(&cfg,0,sizeof(cfg));
        !          1952:        cfg.size=sizeof(cfg);
        !          1953:        SAFECOPY(cfg.ctrl_dir,bbs_startup.ctrl_dir);
        !          1954:        if(!load_cfg(&cfg, NULL, TRUE, str)) {
        !          1955:                printf("ERROR! %s\n",str);
        !          1956:                exit(1);
        !          1957:        }
        !          1958:        prep_dir(cfg.data_dir, cfg.temp_dir, sizeof(cfg.temp_dir));
        !          1959: 
        !          1960:     memset(&uifc,0,sizeof(uifc));
        !          1961:        uifc.mode|=UIFC_NOCTRL;
        !          1962: 
        !          1963:        uifc.esc_delay=500;
        !          1964: 
        !          1965:        for(i=1;i<argc;i++) {
        !          1966:         if(argv[i][0]=='-')
        !          1967:             switch(toupper(argv[i][1])) {
        !          1968:                 case 'C':
        !          1969:                                uifc.mode|=UIFC_COLOR;
        !          1970:                     break;
        !          1971:                 case 'L':
        !          1972:                     uifc.scrn_len=atoi(argv[i]+2);
        !          1973:                     break;
        !          1974:                 case 'E':
        !          1975:                     uifc.esc_delay=atoi(argv[i]+2);
        !          1976:                     break;
        !          1977:                                case 'I':
        !          1978:                                        switch(toupper(argv[i][2])) {
        !          1979:                                                case 'A':
        !          1980:                                                        ciolib_mode=CIOLIB_MODE_ANSI;
        !          1981:                                                        break;
        !          1982:                                                case 'C':
        !          1983:                                                        ciolib_mode=CIOLIB_MODE_CURSES;
        !          1984:                                                        break;
        !          1985:                                                case 0:
        !          1986:                                                        printf("NOTICE: The -i option is depreciated, use -if instead\r\n");
        !          1987:                                                        SLEEP(2000);
        !          1988:                                                case 'F':
        !          1989:                                                        ciolib_mode=CIOLIB_MODE_CURSES_IBM;
        !          1990:                                                        break;
        !          1991:                                                case 'X':
        !          1992:                                                        ciolib_mode=CIOLIB_MODE_X;
        !          1993:                                                        break;
        !          1994:                                                case 'W':
        !          1995:                                                        ciolib_mode=CIOLIB_MODE_CONIO;
        !          1996:                                                        break;
        !          1997:                                                default:
        !          1998:                                                        goto USAGE;
        !          1999:                                        }
        !          2000:                                        break;
        !          2001:                 default:
        !          2002:                                        USAGE:
        !          2003:                     printf("\nusage: %s [ctrl_dir] [options]"
        !          2004:                         "\n\noptions:\n\n"
        !          2005:                         "-c  =  force color mode\n"
        !          2006:                         "-e# =  set escape delay to #msec\n"
        !          2007:                                                "-iX =  set interface mode to X (default=auto) where X is one of:\r\n"
        !          2008: #ifdef __unix__
        !          2009:                                                "       X = X11 mode\r\n"
        !          2010:                                                "       C = Curses mode\r\n"
        !          2011:                                                "       F = Curses mode with forced IBM charset\r\n"
        !          2012: #else
        !          2013:                                                "       W = Win32 native mode\r\n"
        !          2014: #endif
        !          2015:                                                "       A = ANSI mode\r\n"
        !          2016:                         "-l# =  set screen lines to #\n"
        !          2017:                                                ,argv[0]
        !          2018:                         );
        !          2019:                                exit(0);
        !          2020:                }
        !          2021:                if(atoi(argv[i]))
        !          2022:                        edtuser=atoi(argv[i]);
        !          2023:     }
        !          2024: 
        !          2025: #ifdef __unix__
        !          2026:        signal(SIGPIPE, SIG_IGN);
        !          2027: #endif
        !          2028: 
        !          2029:        uifc.size=sizeof(uifc);
        !          2030:        i=initciolib(ciolib_mode);
        !          2031:        if(i!=0) {
        !          2032:        printf("ciolib library init returned error %d\n",i);
        !          2033:        exit(1);
        !          2034:        }
        !          2035:        i=uifcini32(&uifc);  /* curses */
        !          2036:        if(i!=0) {
        !          2037:                printf("uifc library init returned error %d\n",i);
        !          2038:                exit(1);
        !          2039:        }
        !          2040: 
        !          2041:        if((opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)))==NULL)
        !          2042:                allocfail(sizeof(char *)*(MAX_OPTS+1));
        !          2043:        for(i=0;i<(MAX_OPTS+1);i++)
        !          2044:                if((opt[i]=(char *)malloc(MAX_OPLN))==NULL)
        !          2045:                        allocfail(MAX_OPLN);
        !          2046: 
        !          2047:        if((mopt=(char **)alloca(sizeof(char *)*4))==NULL)
        !          2048:                allocfail(sizeof(char *)*4);
        !          2049:        for(i=0;i<4;i++)
        !          2050:                if((mopt[i]=(char *)alloca(MAX_OPLN))==NULL)
        !          2051:                        allocfail(MAX_OPLN);
        !          2052: 
        !          2053:        sprintf(title,"Synchronet User Editor %s-%s",revision,PLATFORM_DESC);
        !          2054:        if(uifc.scrn(title)) {
        !          2055:                printf(" USCRN (len=%d) failed!\n",uifc.scrn_len+1);
        !          2056:                bail(1);
        !          2057:        }
        !          2058: 
        !          2059:        if(edtuser) {
        !          2060:                edit_user(&cfg, edtuser);
        !          2061:                bail(0);
        !          2062:        }
        !          2063: 
        !          2064:        strcpy(mopt[0],"New User");
        !          2065:        strcpy(mopt[1],"Find User");
        !          2066:        strcpy(mopt[2],"User List");
        !          2067:        mopt[3][0]=0;
        !          2068: 
        !          2069:        uifc.helpbuf=   "`User Editor\n"
        !          2070:                                        "`-----------\n\n"
        !          2071:                                        "`New User  : `Add a new user.  This will created a default user using\n"
        !          2072:                                        "            some default entries that you can then edit.\n"
        !          2073:                                        "`Find User : `Find a user using full or partial search name\n"
        !          2074:                                        "`User List : `Display the complete User List.  Users can be edited from\n"
        !          2075:                                        "            this list by highlighting a user and pressing Enter";
        !          2076: 
        !          2077:        while(1) {
        !          2078:                j=uifc.list(WIN_L2R|WIN_ESC|WIN_ACT|WIN_DYN|WIN_ORG|WIN_EXTKEYS,0,5,0,&main_dflt,&main_bar
        !          2079:                        ,title,mopt);
        !          2080: 
        !          2081:                if(j == -2)
        !          2082:                        continue;
        !          2083: 
        !          2084:                if(j==-8) {     /* CTRL-F */
        !          2085:                        /* Find User */
        !          2086:                        finduser(&cfg,&user);
        !          2087:                }
        !          2088: 
        !          2089:                if(j <= -2)
        !          2090:                        continue;
        !          2091: 
        !          2092:                if(j==-1) {
        !          2093:                        uifc.helpbuf=   "`Exit Synchronet User Editor\n"
        !          2094:                                                        "`---------------------------\n\n"
        !          2095:                                                        "If you want to exit the Synchronet user editor,\n"
        !          2096:                                                        "select `Yes`. Otherwise, select `No` or hit ~ ESC ~.";
        !          2097:                        if(confirm("Exit Synchronet User Editor")==1)
        !          2098:                                bail(0);
        !          2099:                        continue;
        !          2100:                }
        !          2101: 
        !          2102:                if(j==0) {
        !          2103:                        /* New User */
        !          2104:                            createdefaults();
        !          2105:                            lprintf("Please edit defaults using next screen.");
        !          2106:                            getuser(&cfg,&user,"New User");
        !          2107:                }
        !          2108:                if(j==1) {
        !          2109:                    /* Find User */
        !          2110:                        finduser(&cfg,&user);
        !          2111:                }
        !          2112:                if(j==2) {
        !          2113:                        /* User List */
        !          2114:                        done=0;
        !          2115:                        while(!done) {
        !          2116:                                last=lastuser(&cfg);
        !          2117:                                for(i=1; i<=last; i++) {
        !          2118:                                        user.number=i;
        !          2119:                                        getuserdat(&cfg,&user);
        !          2120:                                        sprintf(opt[i-1],"%1.1s�%1.1s� %-25.25s � %-25.25s",user.misc&DELETED?"*":" ",user.misc&INACTIVE?"*":" ",user.name,user.alias);
        !          2121:                                }
        !          2122:                                opt[i-1][0]=0;
        !          2123:                                i=0;
        !          2124:                                switch(uifc.list(WIN_ORG|WIN_MID|WIN_ACT,0,0,0,&i,0,"D�I� Real Name                 � Alias                    ",opt)) {
        !          2125:                                        case -1:
        !          2126:                                                done=1;
        !          2127:                                                break;
        !          2128:                                        default:
        !          2129:                                                edit_user(&cfg, i+1);
        !          2130:                                                break;
        !          2131:                                }
        !          2132:                        }
        !          2133:                }
        !          2134:        }
        !          2135:        free_opts(opt);
        !          2136: }
        !          2137: 
        !          2138: 
        !          2139: 

unix.superglobalmegacorp.com

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