Annotation of sbbs/sbbs2/logout.c, revision 1.1.1.1

1.1       root        1: #line 1 "LOGOUT.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include "sbbs.h"
                      6: #include "cmdshell.h"
                      7: 
                      8: /****************************************************************************/
                      9: /* Function that is called after a user hangs up or logs off                           */
                     10: /****************************************************************************/
                     11: void logout()
                     12: {
                     13:        char    str[256];
                     14:        int     done,i,j;
                     15:        ushort  ttoday;
                     16:        file_t  f;
                     17:        node_t  node;
                     18:        struct  date logondate;
                     19:        struct  time lt;
                     20:        FILE    *stream;
                     21: 
                     22: now=time(NULL);
                     23: unixtodos(now,&date,&curtime);
                     24: 
                     25: if(!useron.number) {                            /* Not logged in, so do nothing */
                     26:        if(!online) {
                     27:                sprintf(str,"%02d:%02d%c  T:%3u sec\r\n"
                     28:                        ,curtime.ti_hour>12 ? curtime.ti_hour-12
                     29:                        : curtime.ti_hour==0 ? 12 : curtime.ti_hour, curtime.ti_min
                     30:                        , curtime.ti_hour>=12 ? 'p' : 'a'
                     31:                        ,(uint)(now-answertime));
                     32:                logline("@-",str); }
                     33:        return; }
                     34: 
                     35: strcpy(lastuseron,useron.alias);       /* for use with WFC status display */
                     36: 
                     37: if(useron.rest&FLAG('G')) {        /* Reset guest's msg scan cfg */
                     38:        for(i=0;i<total_subs;i++) {
                     39:                if(sub[i]->misc&SUB_NSDEF)
                     40:                        sub[i]->misc|=SUB_NSCAN;
                     41:                else
                     42:                        sub[i]->misc&=~SUB_NSCAN;
                     43:                if(sub[i]->misc&SUB_SSDEF)
                     44:                        sub[i]->misc|=SUB_SSCAN;
                     45:                else
                     46:                        sub[i]->misc&=~SUB_SSCAN; }
                     47:        batdn_total=0; }
                     48: 
                     49: if(batdn_total) {
                     50:        sprintf(str,"%sFILE\\%04u.DWN",data_dir,useron.number);
                     51:        if((stream=fnopen(&i,str,O_WRONLY|O_TRUNC|O_CREAT))!=NULL) {
                     52:                for(i=0;i<batdn_total;i++)
                     53:                        fprintf(stream,"%s\r\n",batdn_name[i]);
                     54:                fclose(stream); } }
                     55: 
                     56: if(thisnode.status!=NODE_QUIET && !(useron.rest&FLAG('Q')))
                     57:        for(i=1;i<=sys_nodes;i++)
                     58:                if(i!=node_num) {
                     59:                        getnodedat(i,&node,0);
                     60:                        if((node.status==NODE_INUSE || node.status==NODE_QUIET)
                     61:                                && !(node.misc&NODE_AOFF) && node.useron!=useron.number) {
                     62:                                sprintf(str,text[NodeLoggedOff],node_num
                     63:                                        ,thisnode.misc&NODE_ANON
                     64:                                        ? text[UNKNOWN_USER] : useron.alias);
                     65:                                putnmsg(i,str); } }
                     66: 
                     67: if(!online) {          /* NOT re-login */
                     68: 
                     69:        getnodedat(node_num,&thisnode,1);
                     70:        thisnode.status=NODE_WFC;
                     71:        thisnode.misc&=~(NODE_INTR|NODE_MSGW|NODE_NMSG
                     72:                |NODE_UDAT|NODE_POFF|NODE_AOFF|NODE_EXT);
                     73:        putnodedat(node_num,thisnode);
                     74: 
                     75:        if(sys_status&SS_SYSALERT) {
                     76:                mswait(500);
                     77:                if(com_port)
                     78:                        dtr(1);
                     79:                mswait(500);
                     80:                offhook();
                     81:                CLS;
                     82:                lputs("\r\n\r\nAlerting Sysop...");
                     83:                while(!lkbrd(1)) {
                     84:                        beep(1000,200);
                     85:                        nosound();
                     86:                        mswait(200); }
                     87:                lkbrd(0); }
                     88: 
                     89:        sys_status&=~SS_SYSALERT;
                     90:        if(sys_logout[0])               /* execute system logoff event */
                     91:                external(cmdstr(sys_logout,nulstr,nulstr,NULL),EX_OUTL);        /* EX_CC */
                     92:        }
                     93: 
                     94: if(logout_mod[0])
                     95:        exec_bin(logout_mod,&main_csi);
                     96: backout();
                     97: sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,useron.number);
                     98: if(!flength(str))              /* remove any 0 byte message files */
                     99:        remove(str);
                    100: 
                    101: delfiles(temp_dir,"*.*");
                    102: putmsgptrs();
                    103: if(!REALSYSOP)
                    104:        logofflist();
                    105: useron.laston=now;
                    106: 
                    107: ttoday=useron.ttoday-useron.textra;            /* billable time used prev calls */
                    108: if(ttoday>=level_timeperday[useron.level])
                    109:        i=0;
                    110: else
                    111:        i=level_timeperday[useron.level]-ttoday;
                    112: if(i>level_timepercall[useron.level])      /* i=amount of time without min */
                    113:        i=level_timepercall[useron.level];
                    114: j=(now-starttime)/60;                  /* j=billable time online in min */
                    115: if(i<0) i=0;
                    116: if(j<0) j=0;
                    117: 
                    118: if(useron.min && j>i) {
                    119:     j-=i;                               /* j=time to deduct from min */
                    120:        sprintf(str,"Minute Adjustment: %d",-j);
                    121:        logline(">>",str);
                    122:     if(useron.min>j)
                    123:         useron.min-=j;
                    124:     else
                    125:         useron.min=0L;
                    126:     putuserrec(useron.number,U_MIN,10,ultoa(useron.min,str,10)); }
                    127: 
                    128: useron.tlast=(now-logontime)/60;
                    129: useron.timeon+=useron.tlast;
                    130: useron.ttoday+=useron.tlast;
                    131: 
                    132: if(timeleft>0 && starttime-logontime>0)                        /* extra time */
                    133:        useron.textra+=(starttime-logontime)/60;
                    134: 
                    135: unixtodos(logontime,&logondate,&lt);
                    136: if(logondate.da_day!=date.da_day) { /* date has changed while online */
                    137:     putuserrec(useron.number,U_LTODAY,5,"0");
                    138:        useron.ttoday=0;                        /* so zero logons today and time on today */
                    139:        useron.textra=0; }                      /* and extra time */
                    140: 
                    141: 
                    142: 
                    143: putuserrec(useron.number,U_NS_TIME,8,ultoa(last_ns_time,str,16));
                    144: putuserrec(useron.number,U_LASTON,8,ultoa(useron.laston,str,16));
                    145: putuserrec(useron.number,U_TIMEON,5,itoa(useron.timeon,str,10));
                    146: putuserrec(useron.number,U_TTODAY,5,itoa(useron.ttoday,str,10));
                    147: putuserrec(useron.number,U_TEXTRA,5,itoa(useron.textra,str,10));
                    148: putuserrec(useron.number,U_TLAST,5,itoa(useron.tlast,str,10));
                    149: 
                    150: getusrsubs();
                    151: getusrdirs();
                    152: putuserrec(useron.number,U_CURSUB,8,sub[usrsub[curgrp][cursub[curgrp]]]->code);
                    153: putuserrec(useron.number,U_CURDIR,8,dir[usrdir[curlib][curdir[curlib]]]->code);
                    154: 
                    155: sprintf(str,"%02d:%02d%c  ",curtime.ti_hour>12 ? curtime.ti_hour-12
                    156:        : curtime.ti_hour==0 ? 12 : curtime.ti_hour, curtime.ti_min
                    157:        , curtime.ti_hour>=12 ? 'p' : 'a');
                    158: if(sys_status&SS_USERON)
                    159:        sprintf(tmp,"T:%3u   R:%3lu   P:%3lu   E:%3lu   F:%3lu   "
                    160:                "U:%3luk %lu   D:%3luk %lu"
                    161:                ,(uint)(now-logontime)/60,posts_read,logon_posts
                    162:                ,logon_emails,logon_fbacks,logon_ulb/1024UL,logon_uls
                    163:                ,logon_dlb/1024UL,logon_dls);
                    164: else
                    165:        sprintf(tmp,"T:%3u sec",(uint)(now-answertime));
                    166: strcat(str,tmp);
                    167: strcat(str,"\r\n");
                    168: logline("@-",str);
                    169: sys_status&=~SS_USERON;
                    170: answertime=now; // Incase we're relogging on
                    171: }
                    172: 
                    173: /****************************************************************************/
                    174: /* Backout of transactions and statuses for this node                                          */
                    175: /****************************************************************************/
                    176: void backout()
                    177: {
                    178:        char str[256],code[128],*buf;
                    179:        int i,file;
                    180:        long length,l;
                    181:        file_t f;
                    182: 
                    183: sprintf(str,"%sBACKOUT.DAB",node_dir);
                    184: if(flength(str)<1L) {
                    185:        remove(str);
                    186:        return; }
                    187: if((file=nopen(str,O_RDONLY))==-1) {
                    188:        errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    189:        return; }
                    190: length=filelength(file);
                    191: if((buf=MALLOC(length))==NULL) {
                    192:        close(file);
                    193:        errormsg(WHERE,ERR_ALLOC,str,length);
                    194:        return; }
                    195: if(read(file,buf,length)!=length) {
                    196:        close(file);
                    197:        FREE(buf);
                    198:        errormsg(WHERE,ERR_READ,str,length);
                    199:        return; }
                    200: close(file);
                    201: for(l=0;l<length;l+=BO_LEN) {
                    202:        switch(buf[l]) {
                    203:                case BO_OPENFILE:       /* file left open */
                    204:                        memcpy(code,buf+l+1,8);
                    205:                        code[8]=0;
                    206:                        for(i=0;i<total_dirs;i++)                       /* search by code */
                    207:                                if(!stricmp(dir[i]->code,code))
                    208:                                        break;
                    209:                        if(i<total_dirs) {              /* found internal code */
                    210:                                f.dir=i;
                    211:                                memcpy(&f.datoffset,buf+l+9,4);
                    212:                                closefile(f); }
                    213:                        break;
                    214:                default:
                    215:                        errormsg(WHERE,ERR_CHK,str,buf[l]); } }
                    216: FREE(buf);
                    217: remove(str);   /* always remove the backout file */
                    218: }
                    219: 
                    220: /****************************************************************************/
                    221: /* Detailed usage stats for each logon                                      */
                    222: /****************************************************************************/
                    223: void logofflist()
                    224: {
                    225:     char str[256];
                    226:     int file;
                    227:     struct time ontime;
                    228: 
                    229: unixtodos(logontime,&date,&ontime);
                    230: sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOL",data_dir,date.da_mon,date.da_day
                    231:     ,date.da_year-1900);
                    232: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
                    233:     errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
                    234:     return; }
                    235: unixtodos(now,&date,&curtime);
                    236: sprintf(str,"%-*.*s %-2d %-8.8s %2.2d:%2.2d %2.2d:%2.2d %3d%3ld%3ld%3ld%3ld"
                    237:        "%3ld%3ld\r\n",LEN_ALIAS,LEN_ALIAS,useron.alias,node_num,connection
                    238:     ,ontime.ti_hour,ontime.ti_min,curtime.ti_hour,curtime.ti_min
                    239:     ,(int)(now-logontime)/60,posts_read,logon_posts,logon_emails
                    240:     ,logon_fbacks,logon_uls,logon_dls);
                    241: write(file,str,strlen(str));
                    242: close(file);
                    243: }

unix.superglobalmegacorp.com

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