|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.