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