|
|
1.1 ! root 1: #line 1 "LOGON.C" ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: /****************************************************************************/ ! 6: /* Functions pertaining to the logging on and off of a user */ ! 7: /****************************************************************************/ ! 8: ! 9: #include "sbbs.h" ! 10: #include "cmdshell.h" ! 11: ! 12: extern char qwklogon,onquiet; ! 13: ! 14: /****************************************************************************/ ! 15: /* Called once upon each user logging on the board */ ! 16: /* Returns 1 if user passed logon, 0 if user failed. */ ! 17: /****************************************************************************/ ! 18: char logon() ! 19: { ! 20: char str[256],c; ! 21: int file; ! 22: uint i,j,k,mailw; ! 23: ulong totallogons; ! 24: node_t node; ! 25: FILE *stream; ! 26: struct tm *gm; ! 27: ! 28: now=time(NULL); ! 29: gm=localtime(&now); ! 30: if(!useron.number) ! 31: return(0); ! 32: ! 33: if(useron.rest&FLAG('Q')) ! 34: qwklogon=1; ! 35: if(SYSOP && ((online==ON_REMOTE && !(sys_misc&SM_R_SYSOP)) ! 36: || (online==ON_LOCAL && !(sys_misc&SM_L_SYSOP)))) ! 37: return(0); ! 38: if(cur_rate<node_minbps && !(useron.exempt&FLAG('M'))) { ! 39: bprintf(text[MinimumModemSpeed],node_minbps); ! 40: sprintf(str,"%sTOOSLOW.MSG",text_dir); ! 41: if(fexist(str)) ! 42: printfile(str,0); ! 43: sprintf(str,"(%04u) %-25s Modem speed: %u<%u" ! 44: ,useron.number,useron.alias,cur_rate,node_minbps); ! 45: logline("+!",str); ! 46: return(0); } ! 47: ! 48: if(useron.rest&FLAG('G')) { /* Guest account */ ! 49: useron.misc=(new_misc&(~ASK_NSCAN)); ! 50: useron.rows=0; ! 51: useron.misc&=~(ANSI|RIP|WIP|NO_EXASCII|COLOR); ! 52: useron.misc|=autoterm; ! 53: if(!(useron.misc&ANSI) && yesno(text[AnsiTerminalQ])) ! 54: useron.misc|=ANSI; ! 55: if(useron.misc&(RIP|WIP) ! 56: || (useron.misc&ANSI && yesno(text[ColorTerminalQ]))) ! 57: useron.misc|=COLOR; ! 58: if(!yesno(text[ExAsciiTerminalQ])) ! 59: useron.misc|=NO_EXASCII; ! 60: for(i=0;i<total_xedits;i++) ! 61: if(!stricmp(xedit[i]->code,new_xedit) ! 62: && chk_ar(xedit[i]->ar,useron)) ! 63: break; ! 64: if(i<total_xedits) ! 65: useron.xedit=i+1; ! 66: else ! 67: useron.xedit=0; ! 68: useron.prot=new_prot; ! 69: useron.shell=new_shell; } ! 70: ! 71: if(node_dollars_per_call) { ! 72: adjustuserrec(useron.number,U_CDT,10 ! 73: ,cdt_per_dollar*node_dollars_per_call); ! 74: bprintf(text[CreditedAccount] ! 75: ,cdt_per_dollar*node_dollars_per_call); ! 76: sprintf(str,"%s #%u was billed $%d T: %u seconds" ! 77: ,useron.alias,useron.number ! 78: ,node_dollars_per_call,(uint)now-answertime); ! 79: logline("$+",str); ! 80: hangup(); ! 81: return(0); } ! 82: ! 83: //lclini(node_scrnlen-1); ! 84: ! 85: if(!chk_ar(node_ar,useron)) { ! 86: bputs(text[NoNodeAccess]); ! 87: sprintf(str,"(%04u) %-25s Insufficient node access" ! 88: ,useron.number,useron.alias); ! 89: logline("+!",str); ! 90: return(0); } ! 91: ! 92: getnodedat(node_num,&thisnode,1); ! 93: if(thisnode.misc&NODE_LOCK) { ! 94: putnodedat(node_num,thisnode); /* must unlock! */ ! 95: if(!SYSOP && !(useron.exempt&FLAG('N'))) { ! 96: bputs(text[NodeLocked]); ! 97: sprintf(str,"(%04u) %-25s Locked node logon attempt" ! 98: ,useron.number,useron.alias); ! 99: logline("+!",str); ! 100: return(0); } ! 101: if(yesno(text[RemoveNodeLockQ])) { ! 102: getnodedat(node_num,&thisnode,1); ! 103: logline("S-","Removed Node Lock"); ! 104: thisnode.misc&=~NODE_LOCK; } ! 105: else ! 106: getnodedat(node_num,&thisnode,1); } ! 107: ! 108: if(onquiet || (useron.exempt&FLAG('Q') && useron.misc&QUIET)) ! 109: thisnode.status=NODE_QUIET; ! 110: else ! 111: thisnode.status=NODE_INUSE; ! 112: onquiet=0; ! 113: action=thisnode.action=NODE_LOGN; ! 114: if(online==ON_LOCAL) ! 115: thisnode.connection=0; ! 116: else ! 117: thisnode.connection=cur_rate; ! 118: thisnode.misc&=~(NODE_ANON|NODE_INTR|NODE_MSGW|NODE_POFF|NODE_AOFF); ! 119: if(useron.chat&CHAT_NOACT) ! 120: thisnode.misc|=NODE_AOFF; ! 121: if(useron.chat&CHAT_NOPAGE) ! 122: thisnode.misc|=NODE_POFF; ! 123: thisnode.useron=useron.number; ! 124: putnodedat(node_num,thisnode); ! 125: ! 126: getusrsubs(); ! 127: getusrdirs(); ! 128: ! 129: if(useron.misc&CURSUB && !(useron.rest&FLAG('G'))) { ! 130: for(i=0;i<usrgrps;i++) { ! 131: for(j=0;j<usrsubs[i];j++) { ! 132: if(!strcmp(sub[usrsub[i][j]]->code,useron.cursub)) ! 133: break; } ! 134: if(j<usrsubs[i]) { ! 135: curgrp=i; ! 136: cursub[i]=j; ! 137: break; } } ! 138: for(i=0;i<usrlibs;i++) { ! 139: for(j=0;j<usrdirs[i];j++) ! 140: if(!strcmp(dir[usrdir[i][j]]->code,useron.curdir)) ! 141: break; ! 142: if(j<usrdirs[i]) { ! 143: curlib=i; ! 144: curdir[i]=j; ! 145: break; } } } ! 146: ! 147: ! 148: if(useron.misc&AUTOTERM) { ! 149: useron.misc&=~(ANSI|RIP|WIP); ! 150: useron.misc|=autoterm; } ! 151: ! 152: if(!chk_ar(shell[useron.shell]->ar,useron)) { ! 153: useron.shell=new_shell; ! 154: if(!chk_ar(shell[useron.shell]->ar,useron)) { ! 155: for(i=0;i<total_shells;i++) ! 156: if(chk_ar(shell[i]->ar,useron)) ! 157: break; ! 158: if(i==total_shells) ! 159: useron.shell=0; } } ! 160: ! 161: statline=sys_def_stat; ! 162: statusline(); ! 163: logon_ml=useron.level; ! 164: logontime=time(NULL); ! 165: starttime=logontime; ! 166: last_ns_time=ns_time=useron.ns_time; ! 167: // ns_time-=(useron.tlast*60); /* file newscan time == last logon time */ ! 168: delfiles(temp_dir,"*.*"); ! 169: sprintf(str,"%sMSGS\\N%3.3u.MSG",data_dir,node_num); ! 170: remove(str); /* remove any pending node messages */ ! 171: sprintf(str,"%sMSGS\\N%3.3u.IXB",data_dir,node_num); ! 172: remove(str); /* remove any pending node message indices */ ! 173: ! 174: if(!SYSOP && online==ON_REMOTE) { ! 175: rioctl(IOCM|ABORT); /* users can't abort anything */ ! 176: rioctl(IOCS|ABORT); } ! 177: ! 178: CLS; ! 179: if(useron.rows) ! 180: rows=useron.rows; ! 181: else if(online==ON_LOCAL) ! 182: rows=node_scrnlen-1; ! 183: unixtodstr(logontime,str); ! 184: if(!strncmp(str,useron.birth,5) && !(useron.rest&FLAG('Q'))) { ! 185: bputs(text[HappyBirthday]); ! 186: pause(); ! 187: CLS; ! 188: user_event(EVENT_BIRTHDAY); } ! 189: unixtodstr(useron.laston,tmp); ! 190: if(strcmp(str,tmp)) { /* str still equals logon time */ ! 191: useron.ltoday=1; ! 192: useron.ttoday=useron.etoday=useron.ptoday=useron.textra=0; ! 193: useron.freecdt=level_freecdtperday[useron.level]; } ! 194: else ! 195: useron.ltoday++; ! 196: ! 197: gettimeleft(); ! 198: sprintf(str,"%sFILE\\%04u.DWN",data_dir,useron.number); ! 199: batch_add_list(str); ! 200: if(!qwklogon) { /* QWK Nodes don't go through this */ ! 201: ! 202: if(sys_pwdays ! 203: && logontime>(useron.pwmod+((ulong)sys_pwdays*24UL*60UL*60UL))) { ! 204: bprintf(text[TimeToChangePw],sys_pwdays); ! 205: ! 206: c=0; ! 207: while(c<LEN_PASS) { /* Create random password */ ! 208: str[c]=random(43)+48; ! 209: if(isalnum(str[c])) ! 210: c++; } ! 211: str[c]=0; ! 212: bprintf(text[YourPasswordIs],str); ! 213: ! 214: if(sys_misc&SM_PWEDIT && yesno(text[NewPasswordQ])) ! 215: while(online) { ! 216: bputs(text[NewPassword]); ! 217: getstr(str,LEN_PASS,K_UPPER|K_LINE); ! 218: truncsp(str); ! 219: if(chkpass(str,useron)) ! 220: break; ! 221: CRLF; } ! 222: ! 223: while(online) { ! 224: if(sys_misc&SM_PWEDIT) { ! 225: CRLF; ! 226: bputs(text[VerifyPassword]); } ! 227: else ! 228: bputs(text[NewUserPasswordVerify]); ! 229: console|=CON_R_ECHOX; ! 230: if(!(sys_misc&SM_ECHO_PW)) ! 231: console|=CON_L_ECHOX; ! 232: getstr(tmp,LEN_PASS,K_UPPER); ! 233: console&=~(CON_R_ECHOX|CON_L_ECHOX); ! 234: if(strcmp(str,tmp)) { ! 235: bputs(text[Wrong]); ! 236: continue; } ! 237: break; } ! 238: strcpy(useron.pass,str); ! 239: useron.pwmod=time(NULL); ! 240: putuserrec(useron.number,U_PWMOD,8,ultoa(useron.pwmod,str,16)); ! 241: bputs(text[PasswordChanged]); ! 242: pause(); } ! 243: if(useron.ltoday>level_callsperday[useron.level] ! 244: && !(useron.exempt&FLAG('L'))) { ! 245: bputs(text[NoMoreLogons]); ! 246: sprintf(str,"(%04u) %-25s Out of logons" ! 247: ,useron.number,useron.alias); ! 248: logline("+!",str); ! 249: hangup(); ! 250: return(0); } ! 251: if(useron.rest&FLAG('L') && useron.ltoday>1) { ! 252: bputs(text[R_Logons]); ! 253: sprintf(str,"(%04u) %-25s Out of logons" ! 254: ,useron.number,useron.alias); ! 255: logline("+!",str); ! 256: hangup(); ! 257: return(0); } ! 258: if(!useron.name[0] && ((uq&UQ_ALIASES && uq&UQ_REALNAME) ! 259: || uq&UQ_COMPANY)) ! 260: while(online) { ! 261: if(uq&UQ_ALIASES && uq&UQ_REALNAME) ! 262: bputs(text[EnterYourRealName]); ! 263: else ! 264: bputs(text[EnterYourCompany]); ! 265: getstr(useron.name,LEN_NAME,K_UPRLWR|(uq&UQ_NOEXASC)); ! 266: if(uq&UQ_ALIASES && uq&UQ_REALNAME) { ! 267: if(trashcan(useron.name,"NAME") || !useron.name[0] ! 268: || !strchr(useron.name,SP) ! 269: || strchr(useron.name,0xff) ! 270: || (uq&UQ_DUPREAL ! 271: && userdatdupe(useron.number,U_NAME,LEN_NAME ! 272: ,useron.name,0))) ! 273: bputs(text[YouCantUseThatName]); ! 274: else ! 275: break; } ! 276: else ! 277: break; } ! 278: if(uq&UQ_HANDLE && !useron.handle[0]) { ! 279: sprintf(useron.handle,"%.*s",LEN_HANDLE,useron.alias); ! 280: while(online) { ! 281: bputs(text[EnterYourHandle]); ! 282: if(!getstr(useron.handle,LEN_HANDLE ! 283: ,K_LINE|K_EDIT|K_AUTODEL|(uq&UQ_NOEXASC)) ! 284: || strchr(useron.handle,0xff) ! 285: || (uq&UQ_DUPHAND ! 286: && userdatdupe(useron.number,U_HANDLE,LEN_HANDLE ! 287: ,useron.handle,0)) ! 288: || trashcan(useron.handle,"NAME")) ! 289: bputs(text[YouCantUseThatName]); ! 290: else ! 291: break; } } ! 292: if(uq&UQ_LOCATION && !useron.location[0]) ! 293: while(online) { ! 294: bputs(text[EnterYourCityState]); ! 295: if(getstr(useron.location,LEN_LOCATION,K_UPRLWR|(uq&UQ_NOEXASC))) ! 296: break; } ! 297: if(uq&UQ_ADDRESS && !useron.address[0]) ! 298: while(online) { ! 299: bputs(text[EnterYourAddress]); ! 300: if(getstr(useron.address,LEN_ADDRESS,K_UPRLWR|(uq&UQ_NOEXASC))) ! 301: break; } ! 302: if(uq&UQ_ADDRESS && !useron.zipcode[0]) ! 303: while(online) { ! 304: bputs(text[EnterYourZipCode]); ! 305: if(getstr(useron.zipcode,LEN_ZIPCODE,K_UPPER|(uq&UQ_NOEXASC))) ! 306: break; } ! 307: if(uq&UQ_PHONE && !useron.phone[0]) { ! 308: i=yesno(text[CallingFromNorthAmericaQ]); ! 309: while(online) { ! 310: bputs(text[EnterYourPhoneNumber]); ! 311: if(i) { ! 312: if(gettmplt(useron.phone,sys_phonefmt ! 313: ,K_LINE|(uq&UQ_NOEXASC))<strlen(sys_phonefmt)) ! 314: continue; } ! 315: else { ! 316: if(getstr(useron.phone,LEN_PHONE ! 317: ,K_UPPER|(uq&UQ_NOEXASC))<5) ! 318: continue; } ! 319: if(!trashcan(useron.phone,"PHONE")) ! 320: break; } } ! 321: if(uq&UQ_COMP && !useron.comp[0]) ! 322: getcomputer(useron.comp); ! 323: if(new_sif[0]) { ! 324: sprintf(str,"%sUSER\\%4.4u.DAT",data_dir,useron.number); ! 325: if(flength(str)<1L) ! 326: create_sif_dat(new_sif,str); } } ! 327: if(!online) { ! 328: sprintf(str,"(%04u) %-25s Unsuccessful logon" ! 329: ,useron.number,useron.alias); ! 330: logline("+!",str); ! 331: return(0); } ! 332: strcpy(useron.modem,connection); ! 333: useron.logons++; ! 334: putuserdat(useron); ! 335: getmsgptrs(); ! 336: sys_status|=SS_USERON; /* moved from further down */ ! 337: ! 338: if(useron.rest&FLAG('Q')) { ! 339: sprintf(str,"(%04u) %-25s QWK Network Connection" ! 340: ,useron.number,useron.alias); ! 341: logline("++",str); ! 342: return(1); } ! 343: ! 344: /********************/ ! 345: /* SUCCESSFUL LOGON */ ! 346: /********************/ ! 347: totallogons=logonstats(); ! 348: sprintf(str,"(%04u) %-25s Logon %lu - %u" ! 349: ,useron.number,useron.alias,totallogons,useron.ltoday); ! 350: logline("++",str); ! 351: ! 352: if(!qwklogon && logon_mod[0]) ! 353: exec_bin(logon_mod,&main_csi); ! 354: ! 355: if(thisnode.status!=NODE_QUIET) { ! 356: sprintf(str,"%sLOGON.LST",data_dir); ! 357: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { ! 358: errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT|O_APPEND); ! 359: return(0); } ! 360: sprintf(str,text[LastFewCallersFmt],node_num ! 361: ,totallogons,useron.alias ! 362: ,sys_misc&SM_LISTLOC ? useron.location : useron.note ! 363: ,gm->tm_hour,gm->tm_min ! 364: ,connection,useron.ltoday); ! 365: write(file,str,strlen(str)); ! 366: close(file); } ! 367: ! 368: if(sys_logon[0]) /* execute system logon event */ ! 369: external(cmdstr(sys_logon,nulstr,nulstr,NULL),EX_OUTR|EX_OUTL); /* EX_CC */ ! 370: ! 371: if(qwklogon) ! 372: return(1); ! 373: ! 374: sys_status|=SS_PAUSEON; /* always force pause on during this section */ ! 375: main_cmds=xfer_cmds=posts_read=0; ! 376: mailw=getmail(useron.number,0); ! 377: bprintf(text[SiSysName],sys_name); ! 378: bprintf(text[SiNodeNumberName],node_num,node_name); ! 379: bprintf(text[LiUserNumberName],useron.number,useron.alias); ! 380: bprintf(text[LiLogonsToday],useron.ltoday ! 381: ,level_callsperday[useron.level]); ! 382: bprintf(text[LiTimeonToday],useron.ttoday ! 383: ,level_timeperday[useron.level]+useron.min); ! 384: bprintf(text[LiMailWaiting],mailw); ! 385: strcpy(str,text[LiSysopIs]); ! 386: i=kbd_state(); /* Check scroll lock */ ! 387: if(i&16 || (sys_chat_ar[0] && chk_ar(sys_chat_ar,useron))) ! 388: strcat(str,text[LiSysopAvailable]); ! 389: else ! 390: strcat(str,text[LiSysopNotAvailable]); ! 391: bprintf("%s\r\n\r\n",str); ! 392: if(sys_status&SS_EVENT) ! 393: bputs(text[ReducedTime]); ! 394: getnodedat(node_num,&thisnode,1); ! 395: thisnode.misc&=~(NODE_AOFF|NODE_POFF); ! 396: if(useron.chat&CHAT_NOACT) ! 397: thisnode.misc|=NODE_AOFF; ! 398: if(useron.chat&CHAT_NOPAGE) ! 399: thisnode.misc|=NODE_POFF; ! 400: putnodedat(node_num,thisnode); ! 401: getsmsg(useron.number); /* Moved from further down */ ! 402: SYNC; ! 403: c=0; ! 404: for(i=1;i<=sys_nodes;i++) ! 405: if(i!=node_num) { ! 406: getnodedat(i,&node,0); ! 407: if(node.status==NODE_INUSE ! 408: || ((node.status==NODE_QUIET || node.errors) && SYSOP)) { ! 409: if(!c) ! 410: bputs(text[NodeLstHdr]); ! 411: printnodedat(i,node); ! 412: c=1; } ! 413: if(node.status==NODE_INUSE && i!=node_num && node.useron==useron.number ! 414: && !SYSOP && !(useron.exempt&FLAG('G'))) { ! 415: strcpy(tmp,"On two nodes at the same time"); ! 416: sprintf(str,"(%04u) %-25s %s" ! 417: ,useron.number,useron.alias,tmp); ! 418: logline("+!",str); ! 419: errorlog(tmp); ! 420: bputs(text[UserOnTwoNodes]); ! 421: hangup(); ! 422: return(0); } ! 423: if(thisnode.status!=NODE_QUIET ! 424: && (node.status==NODE_INUSE || node.status==NODE_QUIET) ! 425: && !(node.misc&NODE_AOFF) && node.useron!=useron.number) { ! 426: sprintf(str,text[NodeLoggedOnAtNbps] ! 427: ,node_num ! 428: ,thisnode.misc&NODE_ANON ? text[UNKNOWN_USER] : useron.alias ! 429: ,connection); ! 430: putnmsg(i,str); } } ! 431: ! 432: if(sys_exp_warn && useron.expire && useron.expire>now /* Warn user of coming */ ! 433: && (useron.expire-now)/(1440L*60L)<=sys_exp_warn) /* expiration */ ! 434: bprintf(text[AccountWillExpireInNDays],(useron.expire-now)/(1440L*60L)); ! 435: ! 436: if(criterrs && SYSOP) ! 437: bprintf(text[CriticalErrors],criterrs); ! 438: if((i=getuserxfers(0,useron.number,0))!=0) { ! 439: bprintf(text[UserXferForYou],i,i>1 ? "s" : nulstr); } ! 440: if((i=getuserxfers(useron.number,0,0))!=0) { ! 441: bprintf(text[UnreceivedUserXfer],i,i>1 ? "s" : nulstr); } ! 442: SYNC; ! 443: sys_status&=~SS_PAUSEON; /* Turn off the pause override flag */ ! 444: if(online==ON_REMOTE) ! 445: rioctl(IOSM|ABORT); /* Turn abort ability on */ ! 446: if(mailw) { ! 447: if(yesno(text[ReadYourMailNowQ])) ! 448: readmail(useron.number,MAIL_YOUR); } ! 449: lastnodemsg=0; ! 450: if(useron.misc&ASK_NSCAN && yesno(text[NScanAllGrpsQ])) ! 451: scanallsubs(SCAN_NEW); ! 452: if(useron.misc&ASK_SSCAN && yesno(text[SScanAllGrpsQ])) ! 453: scanallsubs(SCAN_TOYOU); ! 454: return(1); ! 455: } ! 456: ! 457: /****************************************************************************/ ! 458: /* Checks the system DSTS.DAB to see if it is a new day, if it is, all the */ ! 459: /* nodes' and the system's CSTS.DAB are added to, and the DSTS.DAB's daily */ ! 460: /* stats are cleared. Also increments the logon values in DSTS.DAB if */ ! 461: /* applicable. */ ! 462: /****************************************************************************/ ! 463: ulong logonstats() ! 464: { ! 465: char str[256]; ! 466: int dsts,csts; ! 467: uint i; ! 468: struct date update; ! 469: time_t update_t; ! 470: stats_t stats; ! 471: node_t node; ! 472: ! 473: sprintf(str,"%sDSTS.DAB",ctrl_dir); ! 474: if((dsts=nopen(str,O_RDWR))==-1) { ! 475: errormsg(WHERE,ERR_OPEN,str,O_RDWR); ! 476: return(0L); } ! 477: read(dsts,&update_t,4); /* Last updated */ ! 478: read(dsts,&stats.logons,4); /* Total number of logons on system */ ! 479: close(dsts); ! 480: if(update_t>now+(24L*60L*60L)) /* More than a day in the future? */ ! 481: errormsg(WHERE,ERR_CHK,"Daily stats time stamp",update_t); ! 482: unixtodos(update_t,&update,&curtime); ! 483: unixtodos(now,&date,&curtime); ! 484: if((date.da_day>update.da_day && date.da_mon==update.da_mon) ! 485: || date.da_mon>update.da_mon || date.da_year>update.da_year) { ! 486: ! 487: sprintf(str,"New Day - Prev: %s ",timestr(&update_t)); ! 488: logentry("!=",str); ! 489: ! 490: sys_status|=SS_DAILY; /* New Day !!! */ ! 491: sprintf(str,"%sLOGON.LST",data_dir); /* Truncate logon list */ ! 492: if((dsts=nopen(str,O_TRUNC|O_CREAT|O_WRONLY))==-1) { ! 493: errormsg(WHERE,ERR_OPEN,str,O_TRUNC|O_CREAT|O_WRONLY); ! 494: return(0L); } ! 495: close(dsts); ! 496: for(i=0;i<=sys_nodes;i++) { ! 497: if(i) { /* updating a node */ ! 498: getnodedat(i,&node,1); ! 499: node.misc|=NODE_EVENT; ! 500: putnodedat(i,node); } ! 501: sprintf(str,"%sDSTS.DAB",i ? node_path[i-1] : ctrl_dir); ! 502: if((dsts=nopen(str,O_RDWR))==-1) /* node doesn't have stats yet */ ! 503: continue; ! 504: sprintf(str,"%sCSTS.DAB",i ? node_path[i-1] : ctrl_dir); ! 505: if((csts=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) { ! 506: close(dsts); ! 507: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT); ! 508: continue; } ! 509: lseek(dsts,8L,SEEK_SET); /* Skip time and logons */ ! 510: write(csts,&now,4); ! 511: read(dsts,&stats.ltoday,4); ! 512: write(csts,&stats.ltoday,4); ! 513: lseek(dsts,4L,SEEK_CUR); /* Skip total time on */ ! 514: read(dsts,&stats.ttoday,4); ! 515: write(csts,&stats.ttoday,4); ! 516: read(dsts,&stats.uls,4); ! 517: write(csts,&stats.uls,4); ! 518: read(dsts,&stats.ulb,4); ! 519: write(csts,&stats.ulb,4); ! 520: read(dsts,&stats.dls,4); ! 521: write(csts,&stats.dls,4); ! 522: read(dsts,&stats.dlb,4); ! 523: write(csts,&stats.dlb,4); ! 524: read(dsts,&stats.ptoday,4); ! 525: write(csts,&stats.ptoday,4); ! 526: read(dsts,&stats.etoday,4); ! 527: write(csts,&stats.etoday,4); ! 528: read(dsts,&stats.ftoday,4); ! 529: write(csts,&stats.ftoday,4); ! 530: close(csts); ! 531: lseek(dsts,0L,SEEK_SET); /* Go back to beginning */ ! 532: write(dsts,&now,4); /* Update time stamp */ ! 533: lseek(dsts,4L,SEEK_CUR); /* Skip total logons */ ! 534: stats.ltoday=0; ! 535: write(dsts,&stats.ltoday,4); /* Logons today to 0 */ ! 536: lseek(dsts,4L,SEEK_CUR); /* Skip total time on */ ! 537: stats.ttoday=0; /* Set all other today variables to 0 */ ! 538: write(dsts,&stats.ttoday,4); /* Time on today to 0 */ ! 539: write(dsts,&stats.ttoday,4); /* Uploads today to 0 */ ! 540: write(dsts,&stats.ttoday,4); /* U/L Bytes today */ ! 541: write(dsts,&stats.ttoday,4); /* Download today */ ! 542: write(dsts,&stats.ttoday,4); /* Download bytes */ ! 543: write(dsts,&stats.ttoday,4); /* Posts today */ ! 544: write(dsts,&stats.ttoday,4); /* Emails today */ ! 545: write(dsts,&stats.ttoday,4); /* Feedback today */ ! 546: write(dsts,&stats.ttoday,2); /* New users Today */ ! 547: close(dsts); } } ! 548: ! 549: if(thisnode.status==NODE_QUIET) /* Quiet users aren't counted */ ! 550: return(0L); ! 551: ! 552: for(i=0;i<2;i++) { ! 553: sprintf(str,"%sDSTS.DAB",i ? ctrl_dir : node_dir); ! 554: if((dsts=nopen(str,O_RDWR))==-1) { ! 555: errormsg(WHERE,ERR_OPEN,str,O_RDWR); ! 556: return(0L); } ! 557: lseek(dsts,4L,SEEK_SET); /* Skip time stamp */ ! 558: read(dsts,&stats.logons,4); ! 559: read(dsts,&stats.ltoday,4); ! 560: stats.logons++; ! 561: stats.ltoday++; ! 562: lseek(dsts,4L,SEEK_SET); /* Rewind back and overwrite */ ! 563: write(dsts,&stats.logons,4); ! 564: write(dsts,&stats.ltoday,4); ! 565: close(dsts); } ! 566: return(stats.logons); ! 567: } ! 568: ! 569:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.