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