|
|
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.