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

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

unix.superglobalmegacorp.com

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