Annotation of sbbs/sbbs2/logon.c, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.