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