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