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