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

  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.  
  570.