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