|
|
1.1 root 1: #line 1 "XTRN_OVL.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6:
7: char *hungupstr="\1n\1h%s\1n hung up on \1h%s\1n %s\r\n";
8:
9: #ifndef __FLAT__
10: extern uint riobp;
11: #endif
12:
13: extern mswtyp;
14: extern uint fakeriobp;
15:
16: /****************************************************************************/
17: /* Convert C string to pascal string */
18: /****************************************************************************/
19: void str2pas(char *instr, char *outstr)
20: {
21: int i;
22:
23: outstr[0]=strlen(instr);
24: for(i=0;i<outstr[0];i++)
25: outstr[i+1]=instr[i];
26: }
27:
28: /****************************************************************************/
29: /* Convert from unix time (seconds since 1/70) to julian (days since 1900) */
30: /****************************************************************************/
31: int unixtojulian(time_t unix)
32: {
33: int days[12]={0,31,59,90,120,151,181,212,243,273,304,334};
34: long j;
35: struct date d;
36: struct time t;
37:
38: unixtodos(unix,&d,&t);
39: j=36525L*d.da_year;
40: if(!(j%100) && d.da_mon<3)
41: j--;
42: j=(j-(1900*36525))/100;
43: j+=d.da_day+days[d.da_mon-1];
44: return(j);
45: }
46:
47: /****************************************************************************/
48: /* Convert julian date into unix format */
49: /****************************************************************************/
50: time_t juliantounix(ulong j)
51: {
52: int days[2][12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
53: 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
54: long temp;
55: int leap,counter;
56:
57: if(!j) return(0L);
58:
59: date.da_year=(100L*j)/36525L;
60: temp=(long)date.da_year*36525L;
61: date.da_year+=1900;
62: j-=temp/100L;
63:
64: if (!(temp%100)) {
65: j++;
66: leap=1; }
67: else leap=0;
68:
69: for(date.da_mon=counter=0;counter<12;counter++)
70: if(days[leap][counter]<j)
71: date.da_mon=counter;
72:
73: date.da_day=j-days[leap][date.da_mon];
74: date.da_mon++; /* go from 0 to 1 based */
75:
76: curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0;
77: return(dostounix(&date,&curtime));
78: }
79:
80: /****************************************************************************/
81: /* Creates various types of xtrn (Doors, Chains, etc.) data files. */
82: /****************************************************************************/
83: void xtrndat(char *name, char *dropdir, uchar type, ulong tleft)
84: {
85: char str[1024],tmp2[128],c,*p;
86: int i,file;
87: long l;
88: FILE *stream;
89: struct time lastcall;
90: stats_t stats;
91:
92: if(type==XTRN_SBBS) { /* SBBS XTRN.DAT file */
93: sprintf(str,"%sXTRN.DAT",dropdir);
94: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
95: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
96: return; }
97:
98: sprintf(str,"%s\r\n%s\r\n%s\r\n%s\r\n"
99: ,name /* User name */
100: ,sys_name /* System name */
101: ,sys_op /* Sysop name */
102: ,sys_guru); /* Guru name */
103: write(file,str,strlen(str));
104:
105: sprintf(str,"%s\r\n%s\r\n%u\r\n%u\r\n%lu\r\n%s\r\n%lu\r\n%lu\r\n"
106: ,ctrl_dir /* Ctrl dir */
107: ,data_dir /* Data dir */
108: ,sys_nodes /* Total system nodes */
109: ,node_num /* Current node */
110: ,tleft /* User Timeleft in seconds */
111: ,useron.misc&ANSI /* User ANSI ? (Yes/Mono/No) */
112: ? useron.misc&COLOR
113: ? "Yes":"Mono":"No"
114: ,rows /* User Screen lines */
115: ,useron.cdt+useron.freecdt); /* User Credits */
116: write(file,str,strlen(str));
117:
118: sprintf(str,"%u\r\n%u\r\n%s\r\n%c\r\n%u\r\n%s\r\n"
119: ,useron.level /* User main level */
120: ,useron.level /* User transfer level */
121: ,useron.birth /* User birthday */
122: ,useron.sex /* User sex (M/F) */
123: ,useron.number /* User number */
124: ,useron.phone); /* User phone number */
125: write(file,str,strlen(str));
126:
127: sprintf(str,"%u\r\n%u\r\n%x\r\n%lu\r\n%s\r\n%s\r\n"
128: "%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%lu\r\n"
129: ,online==ON_LOCAL ? 0:com_port /* Com port or 0 if local */
130: ,com_irq /* Com IRQ */
131: ,com_base /* Com base in hex */
132: ,dte_rate /* Com rate */
133: ,mdm_misc&MDM_CTS ? "Yes":"No" /* Hardware flow ctrl Y/N */
134: ,mdm_misc&MDM_STAYHIGH ? "Yes":"No" /* Locked DTE rate Y/N */
135: ,mdm_init /* Modem initialization string */
136: ,mdm_spec /* Modem special init string */
137: ,mdm_term /* Modem terminal mode init str */
138: ,mdm_dial /* Modem dial string */
139: ,mdm_offh /* Modem off-hook string */
140: ,mdm_answ /* Modem answer string */
141: #ifndef __FLAT__
142: ,sys_status&SS_DCDHIGH ? &fakeriobp : &riobp-1 /* Modem status register */
143: #else
144: ,0
145: #endif
146: );
147: write(file,str,strlen(str));
148:
149: sprintf(str,"%u\r\n",total_xtrns);
150: write(file,str,strlen(str)); /* Total external programs */
151:
152: for(i=0;i<total_xtrns;i++) { /* Each program's name */
153: if(SYSOP || chk_ar(xtrn[i]->ar,useron))
154: strcpy(str,xtrn[i]->name);
155: else
156: str[0]=0; /* Blank if no access */
157: strcat(str,crlf);
158: write(file,str,strlen(str)); }
159:
160: sprintf(str,"%s\r\n%s\r\n"
161: ,ltoaf(useron.flags1,tmp) /* Main flags */
162: ,ltoaf(useron.flags2,tmp2) /* Transfer flags */
163: );
164: write(file,str,strlen(str));
165:
166: sprintf(str,"%s\r\n%s\r\n%lx\r\n%s\r\n%s\r\n%s\r\n"
167: ,ltoaf(useron.exempt,tmp) /* Exemptions */
168: ,ltoaf(useron.rest,tmp2) /* Restrictions */
169: ,useron.expire /* Expiration date in unix form */
170: ,useron.address /* Address */
171: ,useron.location /* City/State */
172: ,useron.zipcode /* Zip/Postal code */
173: );
174: write(file,str,strlen(str));
175:
176: sprintf(str,"%s\r\n%s\r\n%d\r\n%s\r\n%lu\r\n%s\r\n%s\r\n%s\r\n%s\r\n"
177: "%lx\r\n%d\r\n"
178: ,ltoaf(useron.flags3,tmp) /* Flag set #3 */
179: ,ltoaf(useron.flags4,tmp2) /* Flag set #4 */
180: ,mswtyp /* Time-slice type */
181: ,useron.name /* Real name/company */
182: ,cur_rate /* DCE rate */
183: ,exec_dir
184: ,text_dir
185: ,temp_dir
186: ,sys_id
187: ,node_misc
188: #ifdef __FLAT__
189: ,rio_handle
190: #else
191: ,-1
192: #endif
193: );
194: write(file,str,strlen(str));
195:
196: close(file); }
197:
198: else if(type==XTRN_WWIV) { /* WWIV CHAIN.TXT File */
199: sprintf(str,"%sCHAIN.TXT",dropdir);
200: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
201: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
202: return; }
203:
204: sprintf(str,"%u\r\n%s\r\n%s\r\n%s\r\n%u\r\n%c\r\n"
205: ,useron.number /* User number */
206: ,name /* User name */
207: ,useron.name /* User real name */
208: ,nulstr /* User call sign */
209: ,getage(useron.birth) /* User age */
210: ,useron.sex); /* User sex (M/F) */
211: strupr(str);
212: write(file,str,strlen(str));
213:
214: sprintf(str,"%lu\r\n%s\r\n%u\r\n%lu\r\n%u\r\n%u\r\n%u\r\n%u\r\n%u\r\n"
215: ,useron.cdt+useron.freecdt /* Gold */
216: ,unixtodstr(useron.laston,tmp) /* User last on date */
217: ,80 /* User screen width */
218: ,rows /* User screen length */
219: ,useron.level /* User SL */
220: ,0 /* Cosysop? */
221: ,SYSOP /* Sysop? (1/0) */
222: ,(useron.misc&ANSI) ? 1:0 /* ANSI ? (1/0) */
223: ,online==ON_REMOTE); /* Remote (1/0) */
224: write(file,str,strlen(str));
225:
226: sprintf(str,"%lu\r\n%s\r\n%s\r\n%s\r\n%lu\r\n%d\r\n%s\r\n%s\r\n"
227: "%u\r\n%u\r\n%lu\r\n%u\r\n%lu\r\n%u\r\n%s\r\n"
228: ,tleft /* Time left in seconds */
229: ,node_dir /* Gfiles dir (log dir) */
230: ,data_dir /* Data dir */
231: ,"NODE.LOG" /* Name of log file */
232: ,dte_rate /* DTE rate */
233: ,com_port /* COM port number */
234: ,sys_name /* System name */
235: ,sys_op /* Sysop name */
236: ,0 /* Logon time (sec past 12am) */
237: ,0 /* Current time (sec past 12am) */
238: ,useron.ulb/1024UL /* User uploaded kbytes */
239: ,useron.uls /* User uploaded files */
240: ,useron.dlb/1024UL /* User downloaded kbytes */
241: ,useron.dls /* User downloaded files */
242: ,"8N1"); /* Data, parity, stop bits */
243: write(file,str,strlen(str));
244:
245: close(file); }
246:
247: else if(type==XTRN_GAP) { /* Gap DOOR.SYS File */
248: sprintf(str,"%sDOOR.SYS",dropdir);
249: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
250: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
251: return; }
252:
253: sprintf(str,"COM%d:\r\n%lu\r\n%u\r\n%u\r\n%lu\r\n%c\r\n%c\r\n%c\r\n%c\r\n"
254: ,online==ON_REMOTE ? com_port:0 /* 01: COM port - 0 if Local */
255: ,cur_rate /* 02: DCE rate */
256: ,8 /* 03: Data bits */
257: ,node_num /* 04: Node number */
258: ,dte_rate /* 05: DTE rate */
259: ,console&CON_L_ECHO ? 'Y':'N' /* 06: Screen display */
260: ,'Y' /* 07: Printer toggle */
261: ,'Y' /* 08: Page bell */
262: ,'Y'); /* 09: Caller alarm */
263: write(file,str,strlen(str));
264:
265: sprintf(str,"%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n"
266: ,name /* 10: User name */
267: ,useron.location /* 11: User location */
268: ,useron.phone /* 12: User home phone */
269: ,useron.phone /* 13: User work/data phone */
270: ,useron.pass); /* 14: User password */
271: write(file,str,strlen(str));
272:
273: sprintf(str,"%u\r\n%u\r\n%s\r\n%lu\r\n%lu\r\n%s\r\n"
274: ,useron.level /* 15: User security level */
275: ,useron.logons /* 16: User total logons */
276: ,unixtodstr(useron.laston,tmp) /* 17: User last on date */
277: ,tleft /* 18: User time left in sec */
278: ,tleft/60 /* 19: User time left in min */
279: ,useron.misc&NO_EXASCII /* 20: GR if COLOR ANSI */
280: ? "7E" : (useron.misc&(ANSI|COLOR))==(ANSI|COLOR) ? "GR" : "NG");
281: write(file,str,strlen(str));
282:
283: sprintf(str,"%lu\r\n%c\r\n%s\r\n%u\r\n%s\r\n%u\r\n%c\r\n%u\r\n%u\r\n"
284: ,rows /* 21: User screen length */
285: ,useron.misc&EXPERT ? 'Y':'N' /* 22: Expert? (Y/N) */
286: ,ltoaf(useron.flags1,tmp2) /* 23: Registered conferences */
287: ,0 /* 24: Conference came from */
288: ,unixtodstr(useron.expire,tmp) /* 25: User expiration date */
289: ,useron.number /* 26: User number */
290: ,'Y' /* 27: Default protocol */
291: ,useron.uls /* 28: User total uploads */
292: ,useron.dls); /* 29: User total downloads */
293: write(file,str,strlen(str));
294:
295: sprintf(str,"%u\r\n%lu\r\n%s\r\n%s\r\n%s\r\n%s"
296: "\r\n%s\r\n%02d:%02d\r\n%c\r\n"
297: ,0 /* 30: Kbytes downloaded today */
298: ,(useron.cdt+useron.freecdt)/1024UL /* 31: Max Kbytes to download today */
299: ,useron.birth /* 32: User birthday */
300: ,node_dir /* 33: Path to MAIN directory */
301: ,data_dir /* 34: Path to GEN directory */
302: ,sys_op /* 35: Sysop name */
303: ,nulstr /* 36: Alias name */
304: ,0 // sys_eventtime/60 /* 37: Event time HH:MM */
305: ,0 // sys_eventtime%60
306: ,'Y'); /* 38: Error correcting connection */
307: write(file,str,strlen(str));
308:
309: unixtodos(ns_time,&date,&curtime);
310: sprintf(str,"%c\r\n%c\r\n%u\r\n%lu\r\n%02d/%02d/%02d\r\n"
311: ,(useron.misc&(NO_EXASCII|ANSI|COLOR))==ANSI
312: ? 'Y':'N' /* 39: ANSI supported but NG mode */
313: ,'Y' /* 40: Use record locking */
314: ,14 /* 41: BBS default color */
315: ,useron.min /* 42: Time credits in minutes */
316: ,date.da_mon /* 43: File new-scan date */
317: ,date.da_day
318: ,date.da_year-1900);
319: write(file,str,strlen(str));
320:
321: unixtodos(logontime,&date,&curtime);
322: unixtodos(useron.laston,&date,&lastcall);
323: sprintf(str,"%02d:%02d\r\n%02d:%02d\r\n%u\r\n%u\r\n%lu\r\n"
324: "%lu\r\n%s\r\n%u\r\n%u\r\n"
325: ,curtime.ti_hour /* 44: Time of this call */
326: ,curtime.ti_min
327: ,lastcall.ti_hour /* 45: Time of last call */
328: ,lastcall.ti_min
329: ,999 /* 46: Max daily files available */
330: ,0 /* 47: Files downloaded so far today */
331: ,useron.ulb/1024UL /* 48: Total Kbytes uploaded */
332: ,useron.dlb/1024UL /* 49: Total Kbytes downloaded */
333: ,useron.comment /* 50: User comment */
334: ,0 /* 51: Total doors opened */
335: ,useron.posts); /* 52: User message left */
336: write(file,str,strlen(str));
337:
338: close(file); }
339:
340: else if(type==XTRN_RBBS || type==XTRN_RBBS1) {
341: if(type==XTRN_RBBS)
342: sprintf(str,"%sDORINFO%X.DEF",dropdir,node_num); /* support 1-F */
343: else
344: sprintf(str,"%sDORINFO1.DEF",dropdir);
345: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
346: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
347: return; }
348:
349: strcpy(tmp,sys_op);
350: p=strchr(tmp,SP);
351: if(p)
352: *(p++)=0;
353: else
354: p=nulstr;
355:
356: sprintf(str,"%s\r\n%s\r\n%s\r\nCOM%d\r\n%lu BAUD,N,8,1\r\n%u\r\n"
357: ,sys_name /* Name of BBS */
358: ,tmp /* Sysop's firstname */
359: ,p /* Sysop's lastname */
360: ,online==ON_REMOTE ? com_port:0 /* COM port number, 0 if local */
361: ,dte_rate /* DTE rate */
362: ,0); /* Network type */
363: strupr(str);
364: write(file,str,strlen(str));
365:
366: strcpy(tmp,name);
367: p=strchr(tmp,SP);
368: if(p)
369: *(p++)=0;
370: else
371: p=nulstr;
372: sprintf(str,"%s\r\n%s\r\n%s\r\n%u\r\n%u\r\n%lu\r\n"
373: ,tmp /* User's firstname */
374: ,p /* User's lastname */
375: ,useron.location /* User's city */
376: ,(useron.misc&ANSI)==ANSI /* 1=ANSI 0=ASCII */
377: ,useron.level /* Security level */
378: ,tleft/60); /* Time left in minutes */
379: strupr(str);
380: write(file,str,strlen(str));
381:
382: close(file);
383:
384: sprintf(str,"%sEXITINFO.BBS",dropdir);
385: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
386: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
387: return; }
388: write(file,&(uint)dte_rate,sizeof(int)); /* BaudRate */
389: /* SysInfo */
390: getstats(0,&stats);
391: write(file,&stats.logons,sizeof(long)); /* CallCount */
392: write(file,nulstr,36); /* LastCallerName */
393: write(file,nulstr,36); /* LastCallerAlias */
394: write(file,nulstr,92); /* ExtraSpace */
395: /* TimeLogInfo */
396: write(file,nulstr,9); /* StartDate */
397: write(file,nulstr,24*sizeof(int)); /* BusyPerHour */
398: write(file,nulstr,7*sizeof(int)); /* BusyPerDay */
399: /* UserInfo */
400: str2pas(name,str); /* Name */
401: write(file,str,36);
402: str2pas(useron.location,str);
403: write(file,str,26); /* City */
404: str2pas(useron.pass,str);
405: write(file,str,16); /* Pwd */
406: str2pas(useron.phone,str);
407: write(file,str,13); /* DataPhone */
408: write(file,str,13); /* HomePhone */
409: unixtodos(useron.laston,&date,&lastcall);
410: sprintf(tmp,"%02d:%02d",lastcall.ti_hour,lastcall.ti_min);
411: str2pas(tmp,str);
412: write(file,str,6); /* LastTime */
413: unixtodstr(useron.laston,tmp);
414: str2pas(tmp,str);
415: write(file,str,9); /* LastDate */
416: c=0;
417: if(useron.misc&DELETED) c|=(1<<0);
418: if(useron.misc&CLRSCRN) c|=(1<<1);
419: if(useron.misc&UPAUSE) c|=(1<<2);
420: if(useron.misc&ANSI) c|=(1<<3);
421: if(useron.sex=='F') c|=(1<<7);
422: write(file,&c,1); /* Attrib */
423: write(file,&useron.flags1,4); /* Flags */
424: i=0;
425: write(file,&i,sizeof(int)); /* Credit */
426: write(file,&i,sizeof(int)); /* Pending */
427: write(file,&useron.posts,sizeof(int)); /* TimesPosted */
428: write(file,&i,sizeof(int)); /* HighMsgRead */
429: i=useron.level;
430: write(file,&i,sizeof(int)); /* SecLvl */
431: i=0;
432: write(file,&i,sizeof(int)); /* Times */
433: write(file,&useron.uls,sizeof(int)); /* Ups */
434: write(file,&useron.dls,sizeof(int)); /* Downs */
435: i=useron.ulb/1024UL;
436: write(file,&i,sizeof(int)); /* UpK */
437: i=useron.dlb/1024UL;
438: write(file,&i,sizeof(int)); /* DownK */
439: i=logon_dlb/1024UL;
440: write(file,&i,sizeof(int)); /* TodayK */
441: i=0;
442: write(file,&i,sizeof(int)); /* Elapsed */
443: write(file,&i,sizeof(int)); /* Len */
444: write(file,&i,sizeof(int)); /* CombinedPtr */
445: write(file,&i,sizeof(int)); /* AliasPtr */
446: l=0;
447: write(file,&l,sizeof(long)); /* Birthday (as a long?) */
448: /* EventInfo */
449: c=0;
450: write(file,&c,sizeof(char)); /* Status */
451: write(file,&l /* sys_eventtime */,sizeof(long)); /* RunTime */
452: write(file,&c,sizeof(char)); /* ErrorLevel */
453: c=0xff;
454: write(file,&c,sizeof(char)); /* Days */
455: // c=sys_eventnode==node_num || sys_misc&SM_TIMED_EX ? 1 : 0;
456: c=0;
457: write(file,&c,sizeof(char)); /* Forced */
458: if(!total_events)
459: l=0;
460: else
461: l=event[0]->last;
462: write(file,&l,sizeof(long)); /* LastTimeRun */
463: memset(str,0,40);
464: write(file,str,7); /* Spare */
465:
466: c=0;
467: write(file,&c,1); /* NetMailEntered */
468: write(file,&c,1); /* EchoMailEntered */
469:
470: unixtodos(logontime,&date,&curtime);
471: sprintf(tmp,"%02d:%02d",curtime.ti_hour,curtime.ti_min);
472: str2pas(tmp,str);
473: write(file,str,6); /* LoginTime */
474: unixtodstr(logontime,tmp);
475: str2pas(tmp,str);
476: write(file,str,9); /* LoginDate */
477: write(file,&level_timepercall[useron.level],sizeof(int)); /* TmLimit */
478: write(file,&logontime,sizeof(long)); /* LoginSec */
479: write(file,&useron.cdt,sizeof(long)); /* Credit */
480: write(file,&useron.number,sizeof(int)); /* UserRecNum */
481: write(file,&i,2); /* ReadThru */
482: write(file,&i,2); /* PageTimes */
483: write(file,&i,2); /* DownLimit */
484: c=sys_status&SS_SYSPAGE ? 1:0;
485: write(file,&c,1); /* WantChat */
486: c=0;
487: write(file,&c,1); /* GosubLevel */
488:
489: memset(str,0,255);
490: for(i=1;i<20;i++)
491: write(file,str,9); /* GosubData */
492: write(file,str,9); /* Menu */
493: c=useron.misc&CLRSCRN ? 1:0;
494: write(file,&c,1); /* ScreenClear */
495: c=useron.misc&UPAUSE ? 1:0;
496: write(file,&c,1); /* MorePrompts */
497: c=useron.misc&NO_EXASCII ? 0:1;
498: write(file,&c,1); /* GraphicsMode */
499: c=useron.xedit ? 1:0;
500: write(file,&c,1); /* ExternEdit */
501: i=rows;
502: write(file,&i,2); /* ScreenLength */
503: c=1;
504: write(file,&c,1); /* MNP_Connect */
505: write(file,str,49); /* ChatReason */
506: c=0;
507: write(file,&c,1); /* ExternLogoff */
508: c=useron.misc&ANSI ? 1:0;
509: write(file,&c,1); /* ANSI_Capable */
510: close(file);
511: }
512:
513: else if(type==XTRN_WILDCAT) { /* WildCat CALLINFO.BBS File */
514: sprintf(str,"%sCALLINFO.BBS",dropdir);
515: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
516: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
517: return; }
518:
519: if(online==ON_LOCAL) i=5;
520: else
521: switch(dte_rate) {
522: case 300:
523: i=1;
524: break;
525: case 1200:
526: i=2;
527: break;
528: case 2400:
529: i=0;
530: break;
531: case 9600:
532: i=3;
533: break;
534: case 19200:
535: i=4;
536: break;
537: case 38400:
538: i=6;
539: break;
540: default:
541: i=7;
542: break; }
543: sprintf(str,"%s\r\n%u\r\n%s\r\n%u\r\n%lu\r\n%s\r\n%s\r\n%u\r\n"
544: ,name /* User name */
545: ,i /* DTE rate */
546: ,useron.location /* User location */
547: ,useron.level /* Security level */
548: ,tleft/60 /* Time left in min */
549: ,useron.misc&ANSI ? "COLOR":"MONO" /* ANSI ??? */
550: ,useron.pass /* Password */
551: ,useron.number); /* User number */
552: write(file,str,strlen(str));
553:
554: unixtodos(now,&date,&curtime);
555: sprintf(str,"%lu\r\n%02d:%02d\r\n%02d:%02d %02d/%02d/%02d\r\n%s\r\n"
556: ,tleft /* Time left in seconds */
557: ,curtime.ti_hour,curtime.ti_min /* Current time HH:MM */
558: ,curtime.ti_hour,curtime.ti_min /* Current time and date HH:MM */
559: ,date.da_mon,date.da_day /* MM/DD/YY */
560: ,date.da_year-1900
561: ,nulstr); /* Conferences with access */
562: write(file,str,strlen(str));
563:
564: unixtodos(useron.laston,&date,&lastcall);
565: sprintf(str,"%u\r\n%u\r\n%u\r\n%u\r\n%s\r\n%s %02u:%02u\r\n"
566: ,0 /* Daily download total */
567: ,0 /* Max download files */
568: ,0 /* Daily download k total */
569: ,0 /* Max download k total */
570: ,useron.phone /* User phone number */
571: ,unixtodstr(useron.laston,tmp) /* Last on date and time */
572: ,lastcall.ti_hour /* MM/DD/YY HH:MM */
573: ,lastcall.ti_min);
574: write(file,str,strlen(str));
575:
576: unixtodos(ns_time,&date,&curtime);
577: sprintf(str,"%s\r\n%s\r\n%02d/%02d/%02d\r\n%u\r\n%lu\r\n%u"
578: "\r\n%u\r\n%u\r\n"
579: ,useron.misc&EXPERT /* Expert or Novice mode */
580: ? "EXPERT":"NOVICE"
581: ,"All" /* Transfer Protocol */
582: ,date.da_mon,date.da_day /* File new-scan date */
583: ,date.da_year-1900 /* in MM/DD/YY */
584: ,useron.logons /* Total logons */
585: ,rows /* Screen length */
586: ,0 /* Highest message read */
587: ,useron.uls /* Total files uploaded */
588: ,useron.dls); /* Total files downloaded */
589: write(file,str,strlen(str));
590:
591: sprintf(str,"%u\r\n%s\r\nCOM%u\r\n%s\r\n%lu\r\n%s\r\n%s\r\n"
592: ,8 /* Data bits */
593: ,online==ON_LOCAL?"LOCAL":"REMOTE" /* Online local or remote */
594: ,com_port /* COMx port */
595: ,useron.birth /* User birthday */
596: ,dte_rate /* DTE rate */
597: ,"FALSE" /* Already connected? */
598: ,"Normal Connection"); /* Normal or ARQ connect */
599: write(file,str,strlen(str));
600:
601: sprintf(str,"%02d/%02d/%02d %02d:%02d\r\n%u\r\n%u\r\n"
602: ,date.da_mon,date.da_day /* Current date MM/DD/YY */
603: ,date.da_year-1900
604: ,curtime.ti_hour,curtime.ti_min /* Current time HH:MM */
605: ,node_num /* Node number */
606: ,0); /* Door number */
607: write(file,str,strlen(str));
608:
609: close(file); }
610:
611: else if(type==XTRN_PCBOARD) { /* PCBoard Files */
612: sprintf(str,"%sPCBOARD.SYS",dropdir);
613: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
614: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
615: return; }
616:
617: sprintf(str,"%2d%2d%2d%2d%c%2d%c%c%5u%-5.5s"
618: ,-1 /* Display on/off */
619: ,0 /* Printer on/off */
620: ,sys_status&SS_SYSPAGE ? -1:0 /* Page Bell on/off */
621: ,node_misc&NM_ANSALARM ? -1:0 /* Caller Alarm on/off */
622: ,SP /* Sysop next flag */
623: ,0 /* Error corrected */
624: ,useron.misc&NO_EXASCII ? '7' /* Graphics mode */
625: : (useron.misc&(COLOR|ANSI))==(COLOR|ANSI) ? 'Y':'N'
626: ,'A' /* Node chat status */
627: ,(uint)dte_rate /* DTE Port Speed */
628: ,connection /* Connection description */
629: );
630: write(file,str,23);
631:
632: write(file,&useron.number,2); /* User record number */
633:
634: strcpy(tmp,name);
635: p=strchr(tmp,SP);
636: if(p) *p=0;
637: sprintf(str,"%-15.15s%-12s"
638: ,tmp /* User's first name */
639: ,useron.pass); /* User's password */
640: write(file,str,27);
641:
642: unixtodos(logontime,&date,&curtime);
643: i=(curtime.ti_hour*60)+curtime.ti_min;
644: write(file,&i,2); /* Logon time in min since mid */
645:
646: now=time(NULL);
647: i=-(((now-starttime)/60)+useron.ttoday); /* Negative minutes used */
648: write(file,&i,2);
649:
650: sprintf(str,"%02d:%02d",curtime.ti_hour,curtime.ti_min);
651: write(file,str,5);
652:
653: i=level_timepercall[useron.level]; /* Time allowed on */
654: write(file,&i,2);
655:
656: i=0; /* Allowed K-bytes for D/L */
657: write(file,&i,2);
658: write(file,&i,1); /* Conference user was in */
659: write(file,&i,2); /* Conferences joined */
660: write(file,&i,2); /* "" */
661: write(file,&i,2); /* "" */
662: write(file,&i,2); /* Conferences scanned */
663: write(file,&i,2); /* "" */
664: write(file,&i,2); /* Conference add time */
665: write(file,&i,2); /* Upload/Sysop Chat time min */
666:
667: strcpy(str," ");
668: write(file,str,4); /* Language extension */
669:
670: sprintf(str,"%-25.25s",name); /* User's full name */
671: write(file,str,25);
672:
673: i=(tleft/60);
674: write(file,&i,2); /* Minutes remaining */
675:
676: write(file,&node_num,1); /* Node number */
677:
678: sprintf(str,"%02d:%02d%2d%2d" /* Scheduled Event time */
679: ,0 // sys_eventtime/60
680: ,0 // sys_eventtime%60
681: ,0 // sys_timed[0] ? -1:0 /* Event active ? */
682: ,0 /* Slide event ? */
683: );
684: write(file,str,9);
685:
686: l=0L;
687: write(file,&l,4); /* Memorized message number */
688:
689: sprintf(str,"%d%c%c%d%s%c%c%d%d%d%c%c"
690: ,com_port /* COM Port number */
691: ,SP /* Reserved */
692: ,SP /* "" */
693: ,(useron.misc&ANSI)==ANSI /* 1=ANSI 0=NO ANSI */
694: ,"01-01-80" /* last event date */
695: ,0,0 /* last event minute */
696: ,0 /* caller exited to dos */
697: ,sys_status&SS_EVENT ? 1:0 /* event up coming */
698: ,0 /* stop uploads */
699: ,0,0 /* conference user was in */
700: );
701: write(file,str,19);
702:
703: close(file); /* End of PCBOARD.SYS creation */
704:
705: sprintf(str,"%sUSERS.SYS",dropdir);
706: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
707: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
708: return; }
709:
710: /* Write goof-ball header */
711:
712: i=145;
713: write(file,&i,2); /* PCBoard version number (i.e. 145) */
714: l=useron.number;
715: write(file,&l,4); /* Record number for USER's file */
716: i=218;
717: write(file,&i,2); /* Size of "fixed" user record */
718: i=1;
719: write(file,&i,2); /* Number of conference areas */
720: i=7;
721: write(file,&i,2); /* Number of bit map fields for conferences */
722: i=5;
723: write(file,&i,2); /* Size of each bit map field */
724: memset(str,0,15);
725: write(file,str,15); /* Name of Third Party Application (if any) */
726: i=0;
727: write(file,&i,2); /* Version number for application (if any) */
728: write(file,&i,2); /* Size of a "fixed length" record (if any) */
729: write(file,&i,2); /* Size of conference record (if any) */
730: l=0;
731: write(file,&l,4); /* Offset of AppRec into USERS.INF (if any) */
732: i=0;
733: write(file,&i,1); /* 1, if USERS.SYS file has been updated */
734:
735: /* Write fixed record portion */
736:
737: write(file,name,26); /* Name */
738: sprintf(str,"%.24s",useron.location);
739: write(file,str,25); /* Location */
740: write(file,useron.pass,13); /* Password */
741: write(file,useron.phone,14); /* Business or Data Phone */
742: write(file,useron.phone,14); /* Home or Voice Phone */
743: i=unixtojulian(useron.laston);
744: write(file,&i,2); /* Date last on */
745: unixtodos(useron.laston,&date,&curtime);
746: sprintf(str,"%02d:%02d",curtime.ti_hour,curtime.ti_min);
747: write(file,str,6); /* Last time on */
748: if(useron.misc&EXPERT)
749: i=1;
750: else
751: i=0;
752: write(file,&i,1); /* Expert mode */
753: i='Z';
754: write(file,&i,1); /* Protocol (A-Z) */
755: if(useron.misc&CLRSCRN)
756: i=2;
757: else
758: i=0;
759: write(file,&i,1); /* bit packed flags */
760: i=0;
761: write(file,&i,2); /* DOS date for last DIR Scan */
762: i=useron.level;
763: write(file,&i,2); /* Security level */
764: write(file,&useron.logons,2); /* Number of times caller has connected */
765: c=rows;
766: write(file,&c,1); /* Page length */
767: write(file,&useron.uls,2); /* Number of uploads */
768: write(file,&useron.dls,2); /* Number of downloads */
769: l=0;
770: write(file,&l,4); /* Number of download bytes today */
771: write(file,&useron.note,31); /* Comment #1 */
772: write(file,&useron.comp,31); /* Comment #2 */
773: i=(now-starttime)/60;
774: write(file,&i,2); /* Minutes online (this logon?) */
775: i=unixtojulian(useron.expire);
776: write(file,&i,2); /* Expiration date */
777: i=expired_level;
778: write(file,&i,2); /* Expired security level */
779: i=1;
780: write(file,&i,2); /* Current conference */
781: write(file,&useron.dlb,4); /* Bytes downloaded */
782: write(file,&useron.ulb,4); /* Bytes uploaded */
783: if(useron.misc&DELETED)
784: i=1;
785: else
786: i=0;
787: write(file,&i,1); /* Deleted? */
788: l=useron.number;
789: write(file,&l,4); /* Record number in USERS.INF file */
790: l=0;
791: memset(str,0,9);
792: write(file,str,9); /* Reserved */
793: write(file,&l,4); /* Number of messages read */
794: l=useron.posts+useron.emails+useron.fbacks;
795: write(file,&l,4); /* Number of messages left */
796: close(file);
797:
798: /* End of USERS.SYS creation */
799:
800: }
801:
802: else if(type==XTRN_SPITFIRE) { /* SpitFire SFDOORS.DAT File */
803: sprintf(str,"%sSFDOORS.DAT",dropdir);
804: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
805: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
806: return; }
807:
808: now=time(NULL);
809: unixtodos(now,&date,&curtime);
810: l=((((long)curtime.ti_hour*60L)+(long)curtime.ti_min)*60L)
811: +(long)curtime.ti_sec;
812:
813: strcpy(tmp,name);
814: if((p=strchr(tmp,SP))!=NULL)
815: *p=0;
816:
817: sprintf(str,"%u\r\n%s\r\n%s\r\n%s\r\n%lu\r\n%u\r\n%lu\r\n%lu\r\n"
818: ,useron.number /* User number */
819: ,name /* User name */
820: ,useron.pass /* Password */
821: ,tmp /* User's first name */
822: ,dte_rate /* DTE Rate */
823: ,com_port /* COM Port */
824: ,tleft/60 /* Time left in minutes */
825: ,l /* Seconds since midnight (now) */
826: );
827: write(file,str,strlen(str));
828:
829: unixtodos(logontime,&date,&curtime);
830: l=((((long)curtime.ti_hour*60L)+(long)curtime.ti_min)*60L)
831: +(long)curtime.ti_sec;
832:
833: sprintf(str,"%s\r\n%s\r\n%u\r\n%u\r\n%u\r\n%u\r\n%lu\r\n%lu\r\n%s\r\n"
834: "%s\r\n%s\r\n%lu\r\n%s\r\n%u\r\n%u\r\n%u\r\n%u\r\n%u\r\n%lu\r\n%u\r\n"
835: "%lu\r\n%lu\r\n%s\r\n%s\r\n"
836: ,dropdir
837: ,useron.misc&ANSI ? "TRUE":"FALSE" /* ANSI ? True or False */
838: ,useron.level /* Security level */
839: ,useron.uls /* Total uploads */
840: ,useron.dls /* Total downloads */
841: ,level_timepercall[useron.level] /* Minutes allowed this call */
842: ,l /* Secs since midnight (logon) */
843: ,starttime-logontime /* Extra time in seconds */
844: ,"FALSE" /* Sysop next? */
845: ,"FALSE" /* From Front-end? */
846: ,"FALSE" /* Software Flow Control? */
847: ,dte_rate /* DTE Rate */
848: ,"FALSE" /* Error correcting connection? */
849: ,0 /* Current conference */
850: ,0 /* Current file dir */
851: ,node_num /* Node number */
852: ,15 /* Downloads allowed per day */
853: ,0 /* Downloads already this day */
854: ,100000 /* Download bytes allowed/day */
855: ,0 /* Downloaded bytes already today */
856: ,useron.ulb/1024L /* Kbytes uploaded */
857: ,useron.dlb/1024L /* Kbytes downloaded */
858: ,useron.phone /* Phone Number */
859: ,useron.location /* City, State */
860: );
861: write(file,str,strlen(str));
862:
863: close(file); }
864:
865: else if(type==XTRN_UTI) { /* UTI v2.1 - UTIDOOR.TXT */
866: sprintf(str,"%sUTIDOOR.TXT",dropdir);
867: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
868: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
869: return; }
870:
871: strcpy(tmp,name);
872: strupr(tmp);
873: sprintf(str,"%s\r\n%lu\r\n%u\r\n%lu\r\n%lu\r\n"
874: ,tmp /* User name */
875: ,cur_rate /* Actual BPS rate */
876: ,online==ON_LOCAL ? 0: com_port /* COM Port */
877: ,dte_rate /* DTE rate */
878: ,tleft); /* Time left in sec */
879: write(file,str,strlen(str));
880:
881: close(file); }
882:
883: else if(type==XTRN_SR) { /* Solar Realms DOORFILE.SR */
884: sprintf(str,"%sDOORFILE.SR",dropdir);
885: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
886: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
887: return; }
888:
889: sprintf(str,"%s\r\n%d\r\n%d\r\n%lu\r\n%lu\r\n%u\r\n%lu\r\n"
890: ,name /* Complete name of user */
891: ,useron.misc&ANSI ? 1:0 /* ANSI ? */
892: ,useron.misc&NO_EXASCII ? 0:1 /* IBM characters ? */
893: ,rows /* Page length */
894: ,dte_rate /* Baud rate */
895: ,online==ON_LOCAL ? 0:com_port /* COM port */
896: ,tleft/60 /* Time left (in minutes) */
897: );
898: write(file,str,strlen(str));
899: close(file); }
900:
901: else if(type==XTRN_TRIBBS) { /* TRIBBS.SYS */
902: sprintf(str,"%sTRIBBS.SYS",dropdir);
903: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
904: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
905: return; }
906:
907: sprintf(str,"%u\r\n%s\r\n%s\r\n%u\r\n%c\r\n%c\r\n%lu\r\n%s\r\n%s\r\n%s\r\n"
908: ,useron.number /* User's record number */
909: ,name /* User's name */
910: ,useron.pass /* User's password */
911: ,useron.level /* User's level */
912: ,useron.misc&EXPERT ? 'Y':'N' /* Expert? */
913: ,useron.misc&ANSI ? 'Y':'N' /* ANSI? */
914: ,tleft/60 /* Minutes left */
915: ,useron.phone /* User's phone number */
916: ,useron.location /* User's city and state */
917: ,useron.birth /* User's birth date */
918: );
919: write(file,str,strlen(str));
920:
921: sprintf(str,"%u\r\n%u\r\n%lu\r\n%lu\r\n%c\r\n%c\r\n%s\r\n%s\r\n%s\r\n"
922: ,node_num /* Node number */
923: ,com_port /* Serial port */
924: ,online==ON_LOCAL ? 0L:cur_rate /* Baud rate */
925: ,dte_rate /* Locked rate */
926: ,mdm_misc&(MDM_RTS|MDM_CTS) ? 'Y':'N'
927: ,'Y' /* Error correcting connection */
928: ,sys_name /* Board's name */
929: ,sys_op /* Sysop's name */
930: ,useron.handle /* User's alias */
931: );
932: write(file,str,strlen(str));
933: close(file); }
934:
935: else if(type)
936: errormsg(WHERE,ERR_CHK,"Drop file type",type);
937:
938: }
939:
940: /****************************************************************************/
941: /* Reads in MODUSER.DAT, EXITINFO.BBS, or DOOR.SYS and modify the current */
942: /* user's values. */
943: /****************************************************************************/
944: void moduserdat(uint xtrnnum)
945: {
946: char str[256],path[256],c,startup[128];
947: uint i;
948: long mod;
949: int file;
950: FILE *stream;
951:
952: sprintf(startup,"%s\\",xtrn[xtrnnum]->path);
953: if(xtrn[xtrnnum]->type==XTRN_RBBS) {
954: sprintf(path,"%sEXITINFO.BBS"
955: ,xtrn[xtrnnum]->misc&STARTUPDIR ? startup : node_dir);
956: if((file=nopen(path,O_RDONLY))!=-1) {
957: lseek(file,361,SEEK_SET);
958: read(file,&useron.flags1,4); /* Flags */
959: putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,tmp,16));
960: lseek(file,373,SEEK_SET);
961: read(file,&i,2); /* SecLvl */
962: if(i<90) {
963: useron.level=i;
964: putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10)); }
965: close(file);
966: remove(path); }
967: return; }
968: else if(xtrn[xtrnnum]->type==XTRN_GAP) {
969: sprintf(path,"%sDOOR.SYS"
970: ,xtrn[xtrnnum]->misc&STARTUPDIR ? startup : node_dir);
971: if((stream=fopen(path,"rb"))!=NULL) {
972: for(i=0;i<15;i++) /* skip first 14 lines */
973: if(!fgets(str,128,stream))
974: break;
975: if(i==15 && isdigit(str[0])) {
976: mod=atoi(str);
977: if(mod<90) {
978: useron.level=mod;
979: putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10)); } }
980:
981: for(;i<23;i++)
982: if(!fgets(str,128,stream))
983: break;
984: if(i==23) { /* set main flags */
985: useron.flags1=aftol(str);
986: putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,tmp,16)); }
987:
988: for(;i<25;i++)
989: if(!fgets(str,128,stream))
990: break;
991: if(i==25 && isdigit(str[0]) && isdigit(str[1])
992: && (str[2]=='/' || str[2]=='-') /* xx/xx/xx or xx-xx-xx */
993: && isdigit(str[3]) && isdigit(str[4])
994: && (str[5]=='/' || str[5]=='-')
995: && isdigit(str[6]) && isdigit(str[7])) { /* valid expire date */
996: useron.expire=dstrtounix(str);
997: putuserrec(useron.number,U_EXPIRE,8,ultoa(useron.expire,tmp,16)); }
998:
999: for(;i<29;i++) /* line 29, total downloaded files */
1000: if(!fgets(str,128,stream))
1001: break;
1002: if(i==29) {
1003: truncsp(str);
1004: useron.dls=atoi(str);
1005: putuserrec(useron.number,U_DLS,5,str); }
1006:
1007: if(fgets(str,128,stream)) { /* line 30, Kbytes downloaded today */
1008: i++;
1009: truncsp(str);
1010: mod=atol(str)*1024L;
1011: if(mod) {
1012: useron.dlb=adjustuserrec(useron.number,U_DLB,10,mod);
1013: subtract_cdt(mod); } }
1014:
1015: for(;i<42;i++)
1016: if(!fgets(str,128,stream))
1017: break;
1018: if(i==42 && isdigit(str[0])) { /* Time Credits in Minutes */
1019: useron.min=atol(str);
1020: putuserrec(useron.number,U_MIN,10,ultoa(useron.min,tmp,10)); }
1021:
1022: fclose(stream); }
1023: return; }
1024:
1025: else if(xtrn[xtrnnum]->type==XTRN_PCBOARD) {
1026: sprintf(path,"%sUSERS.SYS"
1027: ,xtrn[xtrnnum]->misc&STARTUPDIR ? startup : node_dir);
1028: if((file=nopen(path,O_RDONLY))!=-1) {
1029: lseek(file,39,SEEK_SET);
1030: read(file,&c,1);
1031: if(c==1) { /* file has been updated */
1032: lseek(file,105,SEEK_CUR); /* read security level */
1033: read(file,&i,2);
1034: if(i<90) {
1035: useron.level=i;
1036: putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10)); }
1037: lseek(file,75,SEEK_CUR); /* read in expiration date */
1038: read(file,&i,2); /* convert from julian to unix */
1039: useron.expire=juliantounix(i);
1040: putuserrec(useron.number,U_EXPIRE,8,ltoa(useron.expire,tmp,16)); }
1041: close(file); }
1042: return; }
1043:
1044: sprintf(path,"%sMODUSER.DAT"
1045: ,xtrn[xtrnnum]->misc&STARTUPDIR ? startup : node_dir);
1046: if((stream=fopen(path,"rb"))!=NULL) { /* File exists */
1047: if(fgets(str,81,stream) && (mod=atol(str))!=0) {
1048: ultoac(mod>0L ? mod : -mod,tmp); /* put commas in the # */
1049: strcpy(str,"Credit Adjustment: ");
1050: if(mod<0L)
1051: strcat(str,"-"); /* negative, put '-' */
1052: strcat(str,tmp);
1053: if(mod>0L)
1054: strcpy(tmp,"$+");
1055: else
1056: strcpy(tmp,"$-");
1057: logline(tmp,str);
1058: if(mod>0L) /* always add to real cdt */
1059: useron.cdt=adjustuserrec(useron.number,U_CDT,10,mod);
1060: else
1061: subtract_cdt(-mod); } /* subtract from free cdt first */
1062: if(fgets(str,81,stream)) { /* main level */
1063: mod=atoi(str);
1064: if(isdigit(str[0]) && mod<90) {
1065: useron.level=mod;
1066: putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10)); } }
1067: fgets(str,81,stream); /* was transfer level, now ignored */
1068: if(fgets(str,81,stream)) { /* flags #1 */
1069: if(strchr(str,'-')) /* remove flags */
1070: useron.flags1&=~aftol(str);
1071: else /* add flags */
1072: useron.flags1|=aftol(str);
1073: putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,tmp,16)); }
1074:
1075: if(fgets(str,81,stream)) { /* flags #2 */
1076: if(strchr(str,'-')) /* remove flags */
1077: useron.flags2&=~aftol(str);
1078: else /* add flags */
1079: useron.flags2|=aftol(str);
1080: putuserrec(useron.number,U_FLAGS2,8,ultoa(useron.flags2,tmp,16)); }
1081:
1082: if(fgets(str,81,stream)) { /* exemptions */
1083: if(strchr(str,'-'))
1084: useron.exempt&=~aftol(str);
1085: else
1086: useron.exempt|=aftol(str);
1087: putuserrec(useron.number,U_EXEMPT,8,ultoa(useron.exempt,tmp,16)); }
1088: if(fgets(str,81,stream)) { /* restrictions */
1089: if(strchr(str,'-'))
1090: useron.rest&=~aftol(str);
1091: else
1092: useron.rest|=aftol(str);
1093: putuserrec(useron.number,U_REST,8,ultoa(useron.rest,tmp,16)); }
1094: if(fgets(str,81,stream)) { /* Expiration date */
1095: if(isxdigit(str[0]))
1096: putuserrec(useron.number,U_EXPIRE,8,str); }
1097: if(fgets(str,81,stream)) { /* additional minutes */
1098: mod=atol(str);
1099: if(mod) {
1100: sprintf(str,"Minute Adjustment: %s",ultoac(mod,tmp));
1101: logline("*+",str);
1102: useron.min=adjustuserrec(useron.number,U_MIN,10,mod); } }
1103:
1104: if(fgets(str,81,stream)) { /* flags #3 */
1105: if(strchr(str,'-')) /* remove flags */
1106: useron.flags3&=~aftol(str);
1107: else /* add flags */
1108: useron.flags3|=aftol(str);
1109: putuserrec(useron.number,U_FLAGS3,8,ultoa(useron.flags3,tmp,16)); }
1110:
1111: if(fgets(str,81,stream)) { /* flags #4 */
1112: if(strchr(str,'-')) /* remove flags */
1113: useron.flags4&=~aftol(str);
1114: else /* add flags */
1115: useron.flags4|=aftol(str);
1116: putuserrec(useron.number,U_FLAGS4,8,ultoa(useron.flags4,tmp,16)); }
1117:
1118: if(fgets(str,81,stream)) { /* flags #1 to REMOVE only */
1119: useron.flags1&=~aftol(str);
1120: putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,tmp,16)); }
1121: if(fgets(str,81,stream)) { /* flags #2 to REMOVE only */
1122: useron.flags2&=~aftol(str);
1123: putuserrec(useron.number,U_FLAGS2,8,ultoa(useron.flags2,tmp,16)); }
1124: if(fgets(str,81,stream)) { /* flags #3 to REMOVE only */
1125: useron.flags3&=~aftol(str);
1126: putuserrec(useron.number,U_FLAGS3,8,ultoa(useron.flags3,tmp,16)); }
1127: if(fgets(str,81,stream)) { /* flags #4 to REMOVE only */
1128: useron.flags4&=~aftol(str);
1129: putuserrec(useron.number,U_FLAGS4,8,ultoa(useron.flags4,tmp,16)); }
1130: if(fgets(str,81,stream)) { /* exemptions to remove */
1131: useron.exempt&=~aftol(str);
1132: putuserrec(useron.number,U_EXEMPT,8,ultoa(useron.exempt,tmp,16)); }
1133: if(fgets(str,81,stream)) { /* restrictions to remove */
1134: useron.rest&=~aftol(str);
1135: putuserrec(useron.number,U_REST,8,ultoa(useron.rest,tmp,16)); }
1136:
1137: fclose(stream);
1138: remove(path); }
1139: }
1140:
1141: /****************************************************************************/
1142: /* This is the external programs (doors) section of the bbs */
1143: /* Return 1 if no externals available, 0 otherwise. */
1144: /****************************************************************************/
1145: char xtrn_sec()
1146: {
1147: char str[256];
1148: int file,j,k,xsec,*usrxtrn,usrxtrns,*usrxsec,usrxsecs;
1149: uint i;
1150:
1151: if(!total_xtrns || !total_xtrnsecs) {
1152: bputs(text[NoXtrnPrograms]);
1153: return(1); }
1154:
1155: if((usrxtrn=(int *)MALLOC(total_xtrns*sizeof(int)))==NULL) {
1156: errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrns);
1157: return(1); }
1158: if((usrxsec=(int *)MALLOC(total_xtrnsecs*sizeof(int)))==NULL) {
1159: errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrnsecs);
1160: FREE(usrxtrn);
1161: return(1); }
1162:
1163: while(online) {
1164: for(i=0,usrxsecs=0;i<total_xtrnsecs;i++)
1165: if(chk_ar(xtrnsec[i]->ar,useron))
1166: usrxsec[usrxsecs++]=i;
1167: if(!usrxsecs) {
1168: bputs(text[NoXtrnPrograms]);
1169: FREE(usrxtrn);
1170: FREE(usrxsec);
1171: return(1); }
1172: if(usrxsecs>1) {
1173: sprintf(str,"%sMENU\\XTRN_SEC.*",text_dir);
1174: if(fexist(str)) {
1175: menu("XTRN_SEC");
1176: xsec=getnum(usrxsecs);
1177: if(xsec<=0)
1178: break;
1179: xsec--;
1180: xsec=usrxsec[xsec]; }
1181: else {
1182: for(i=0;i<total_xtrnsecs;i++)
1183: uselect(1,i,"External Program Section"
1184: ,xtrnsec[i]->name,xtrnsec[i]->ar);
1185: xsec=uselect(0,0,0,0,0); }
1186: if(xsec==-1)
1187: break; }
1188: else
1189: xsec=0;
1190:
1191: while(!chk_ar(xtrnsec[xsec]->ar,useron))
1192: xsec++;
1193:
1194: if(xsec>=total_xtrnsecs) {
1195: bputs(text[NoXtrnPrograms]);
1196: FREE(usrxtrn);
1197: FREE(usrxsec);
1198: return(1); }
1199:
1200: while(online) {
1201: for(i=0,usrxtrns=0;i<total_xtrns; i++) {
1202: if(xtrn[i]->sec!=xsec)
1203: continue;
1204: if(xtrn[i]->misc&EVENTONLY)
1205: continue;
1206: if(!chk_ar(xtrn[i]->ar,useron))
1207: continue;
1208: usrxtrn[usrxtrns++]=i; }
1209: if(!usrxtrns) {
1210: bputs(text[NoXtrnPrograms]);
1211: pause();
1212: break; }
1213: sprintf(str,"%sMENU\\XTRN%u.*",text_dir,xsec+1);
1214: if(fexist(str)) {
1215: sprintf(str,"XTRN%u",xsec+1);
1216: menu(str); }
1217: else {
1218: bprintf(text[XtrnProgLstHdr],xtrnsec[xsec]->name);
1219: bputs(text[XtrnProgLstTitles]);
1220: if(usrxtrns>=10) {
1221: bputs(" ");
1222: bputs(text[XtrnProgLstTitles]); }
1223: CRLF;
1224: bputs(text[XtrnProgLstUnderline]);
1225: if(usrxtrns>=10) {
1226: bputs(" ");
1227: bputs(text[XtrnProgLstUnderline]); }
1228: CRLF;
1229: if(usrxtrns>=10)
1230: j=(usrxtrns/2)+(usrxtrns&1);
1231: else
1232: j=usrxtrns;
1233: for(i=0;i<j && !msgabort();i++) {
1234: bprintf(text[XtrnProgLstFmt],i+1
1235: ,xtrn[usrxtrn[i]]->name,xtrn[usrxtrn[i]]->cost);
1236: if(usrxtrns>=10) {
1237: k=(usrxtrns/2)+i+(usrxtrns&1);
1238: if(k<usrxtrns) {
1239: bputs(" ");
1240: bprintf(text[XtrnProgLstFmt],k+1
1241: ,xtrn[usrxtrn[k]]->name
1242: ,xtrn[usrxtrn[k]]->cost); } }
1243: CRLF; }
1244: ASYNC;
1245: mnemonics(text[WhichXtrnProg]); }
1246: getnodedat(node_num,&thisnode,1);
1247: thisnode.aux=0; /* aux is 0, only if at menu */
1248: putnodedat(node_num,thisnode);
1249: action=NODE_XTRN;
1250: SYNC;
1251: if((j=getnum(usrxtrns))<1)
1252: break;
1253: exec_xtrn(usrxtrn[j-1]); }
1254: if(usrxsecs<2)
1255: break; }
1256: FREE(usrxtrn);
1257: FREE(usrxsec);
1258: return(0);
1259: }
1260:
1261: /****************************************************************************/
1262: /* This function handles configured external program execution. */
1263: /****************************************************************************/
1264: void exec_xtrn(uint xtrnnum)
1265: {
1266: char str[256],str2[256],path[256],dropdir[128],name[32],c,e,mode;
1267: int file;
1268: uint i;
1269: long mod;
1270: ulong tleft;
1271: FILE *stream;
1272: node_t node;
1273: time_t start,end;
1274:
1275:
1276: if(!chk_ar(xtrn[xtrnnum]->run_ar,useron)
1277: || !chk_ar(xtrnsec[xtrn[xtrnnum]->sec]->ar,useron)) {
1278: bputs(text[CantRunThatProgram]);
1279: return; }
1280:
1281: if(xtrn[xtrnnum]->cost && !(useron.exempt&FLAG('X'))) { /* costs */
1282: if(xtrn[xtrnnum]->cost>useron.cdt+useron.freecdt) {
1283: bputs(text[NotEnoughCredits]);
1284: pause();
1285: return; }
1286: subtract_cdt(xtrn[xtrnnum]->cost); }
1287:
1288: if(!(xtrn[xtrnnum]->misc&MULTIUSER)) {
1289: for(i=1;i<=sys_nodes;i++) {
1290: getnodedat(i,&node,0);
1291: c=i;
1292: if((node.status==NODE_INUSE || node.status==NODE_QUIET)
1293: && node.action==NODE_XTRN && node.aux==(xtrnnum+1)) {
1294: if(node.status==NODE_QUIET) {
1295: strcpy(str,sys_guru);
1296: c=sys_nodes+1; }
1297: else if(node.misc&NODE_ANON)
1298: strcpy(str,"UNKNOWN USER");
1299: else
1300: username(node.useron,str);
1301: bprintf(text[UserRunningXtrn],str
1302: ,xtrn[xtrnnum]->name,c);
1303: pause();
1304: break; } }
1305: if(i<=sys_nodes)
1306: return; }
1307:
1308: sprintf(str,"%s\\",xtrn[xtrnnum]->path);
1309: strcpy(path,xtrn[xtrnnum]->misc&STARTUPDIR ? str : node_dir);
1310: strcpy(dropdir,xtrn[xtrnnum]->misc&STARTUPDIR ? str : node_dir);
1311:
1312: switch(xtrn[xtrnnum]->type) {
1313: case XTRN_WWIV:
1314: strcat(path,"CHAIN.TXT");
1315: break;
1316: case XTRN_GAP:
1317: strcat(path,"DOOR.SYS");
1318: break;
1319: case XTRN_RBBS:
1320: sprintf(str,"DORINFO%X.DEF",node_num);
1321: strcat(path,str);
1322: break;
1323: case XTRN_RBBS1:
1324: strcat(path,"DORINFO1.DEF");
1325: break;
1326: case XTRN_WILDCAT:
1327: strcat(path,"CALLINFO.BBS");
1328: break;
1329: case XTRN_PCBOARD:
1330: strcat(path,"PCBOARD.SYS");
1331: break;
1332: case XTRN_UTI:
1333: strcat(path,"UTIDOOR.TXT");
1334: break;
1335: case XTRN_SR:
1336: strcat(path,"DOORFILE.SR");
1337: break;
1338: default:
1339: strcat(path,"XTRN.DAT");
1340: break; }
1341: getnodedat(node_num,&thisnode,1);
1342: thisnode.aux=xtrnnum+1;
1343: thisnode.action=NODE_XTRN;
1344: putnodedat(node_num,thisnode);
1345:
1346: if(xtrn[xtrnnum]->misc&REALNAME)
1347: strcpy(name,useron.name);
1348: else
1349: strcpy(name,useron.alias);
1350:
1351: gettimeleft();
1352: tleft=timeleft+(xtrn[xtrnnum]->textra*60);
1353: if(xtrn[xtrnnum]->maxtime && tleft>xtrn[xtrnnum]->maxtime)
1354: tleft=(xtrn[xtrnnum]->maxtime*60);
1355: xtrndat(name,dropdir,xtrn[xtrnnum]->type,tleft);
1356: if(!online)
1357: return;
1358: sprintf(str,"Ran external: %s",xtrn[xtrnnum]->name);
1359: logline("X-",str);
1360: if(xtrn[xtrnnum]->cmd[0]!='*' && sys_status&SS_LOGOPEN) {
1361: close(logfile);
1362: sys_status&=~SS_LOGOPEN; }
1363:
1364: sprintf(str,"%sINTRSBBS.DAT"
1365: ,xtrn[xtrnnum]->path[0] ? xtrn[xtrnnum]->path : node_dir);
1366: remove(str);
1367: sprintf(str,"%sHANGUP.NOW",node_dir);
1368: remove(str);
1369: sprintf(str,"%sFILE\\%04u.DWN",data_dir,useron.number);
1370: remove(str);
1371:
1372: mode=0; /* EX_CC */
1373: if(xtrn[xtrnnum]->misc&IO_INTS)
1374: mode|=(EX_OUTR|EX_INR|EX_OUTL);
1375: if(xtrn[xtrnnum]->misc&WWIVCOLOR)
1376: mode|=EX_WWIV;
1377: if(xtrn[xtrnnum]->misc&SWAP)
1378: mode|=EX_SWAP;
1379: if(xtrn[xtrnnum]->misc&MODUSERDAT) { /* Delete MODUSER.DAT */
1380: sprintf(str,"%sMODUSER.DAT",dropdir); /* if for some weird */
1381: remove(str); } /* reason it's there */
1382:
1383: if(xtrn[xtrnnum]->path[0]) {
1384: if(xtrn[xtrnnum]->path[1]==':') /* drive letter specified */
1385: setdisk(toupper(xtrn[xtrnnum]->path[0])-'A');
1386: if(chdir(xtrn[xtrnnum]->path))
1387: errormsg(WHERE,ERR_CHDIR,xtrn[xtrnnum]->path,0); }
1388:
1389: start=time(NULL);
1390: external(cmdstr(xtrn[xtrnnum]->cmd,path,dropdir,NULL),mode);
1391: end=time(NULL);
1392: if(xtrn[xtrnnum]->misc&FREETIME)
1393: starttime+=end-start;
1394: if(xtrn[xtrnnum]->clean[0]) {
1395: if(xtrn[xtrnnum]->path[0]) {
1396: if(xtrn[xtrnnum]->path[1]==':') /* drive letter specified */
1397: setdisk(toupper(xtrn[xtrnnum]->path[0])-'A');
1398: if(chdir(xtrn[xtrnnum]->path))
1399: errormsg(WHERE,ERR_CHDIR,xtrn[xtrnnum]->path,0); }
1400: external(cmdstr(xtrn[xtrnnum]->clean,path,nulstr,NULL)
1401: ,mode&~EX_INR); }
1402: /* Re-open the logfile */
1403: if(!(sys_status&SS_LOGOPEN)) {
1404: sprintf(str,"%sNODE.LOG",node_dir);
1405: if((logfile=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1)
1406: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
1407: else
1408: sys_status|=SS_LOGOPEN; }
1409:
1410: sprintf(str,"%sFILE\\%04u.DWN",data_dir,useron.number);
1411: batch_add_list(str);
1412:
1413: sprintf(str,"%sHANGUP.NOW",node_dir);
1414: if(fexist(str)) {
1415: remove(str);
1416: hangup(); }
1417: if(online==ON_REMOTE) {
1418: checkline();
1419: if(!online) {
1420: sprintf(str,"%sHUNGUP.LOG",data_dir);
1421: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
1422: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
1423: return; }
1424: getnodedat(node_num,&thisnode,0);
1425: now=time(NULL);
1426: sprintf(str,hungupstr,useron.alias,xtrn[thisnode.aux-1]->name
1427: ,timestr(&now));
1428: write(file,str,strlen(str));
1429: close(file); } }
1430: if(xtrn[xtrnnum]->misc&MODUSERDAT) { /* Modify user data */
1431: moduserdat(xtrnnum);
1432: statusline(); }
1433:
1434: }
1435:
1436: /****************************************************************************/
1437: /* This function will execute an external program if it is configured to */
1438: /* run during the event specified. */
1439: /****************************************************************************/
1440: void user_event(char event)
1441: {
1442: uint i;
1443:
1444: for(i=0;i<total_xtrns;i++) {
1445: if(xtrn[i]->event!=event)
1446: continue;
1447: if(!chk_ar(xtrn[i]->ar,useron)
1448: || !chk_ar(xtrnsec[xtrn[i]->sec]->ar,useron))
1449: continue;
1450: exec_xtrn(i); }
1451: }
1452:
1453:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.