home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / LOGOUT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-24  |  7.3 KB  |  244 lines

  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. }
  244.