|
|
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,<); ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.