|
|
1.1 root 1: #line 1 "GETUSER.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: /* Fills the structure 'user' with info for user.number from USER.DAT */
10: /* Called from functions useredit, waitforcall and main_sec */
11: /****************************************************************************/
12: void getuserdat(user_t *user)
13: {
14: uchar userdat[U_LEN+1],str[U_LEN+1];
15: int i,file;
16:
17: if(!user->number || user->number>lastuser()) {
18: memset(user,0L,sizeof(user_t));
19: user->number=0;
20: return; }
21: sprintf(userdat,"%sUSER\\USER.DAT",data_dir);
22: if((file=nopen(userdat,O_RDONLY|O_DENYNONE))==-1) {
23: close(file);
24: memset(user,0L,sizeof(user_t));
25: user->number=0;
26: return; }
27: lseek(file,(long)((long)(user->number-1)*U_LEN),SEEK_SET);
28: i=0;
29: while(i<LOOP_NODEDAB
30: && lock(file,(long)((long)(user->number-1)*U_LEN),U_LEN)==-1) {
31: if(i>10)
32: mswait(55);
33: i++; }
34:
35: if(i>=LOOP_NODEDAB) {
36: close(file);
37: errormsg(WHERE,ERR_LOCK,"USER.DAT",user->number);
38: memset(user,0L,sizeof(user_t));
39: user->number=0;
40: return; }
41:
42: if(read(file,userdat,U_LEN)!=U_LEN) {
43: unlock(file,(long)((long)(user->number-1)*U_LEN),U_LEN);
44: close(file);
45: errormsg(WHERE,ERR_READ,"USER.DAT",U_LEN);
46: memset(user,0L,sizeof(user_t));
47: user->number=0;
48: return; }
49:
50: unlock(file,(long)((long)(user->number-1)*U_LEN),U_LEN);
51: close(file);
52: getrec(userdat,U_ALIAS,LEN_ALIAS,user->alias);
53: /* order of these function */
54: getrec(userdat,U_NAME,LEN_NAME,user->name);
55: /* calls is irrelevant */
56: getrec(userdat,U_HANDLE,LEN_HANDLE,user->handle);
57: getrec(userdat,U_NOTE,LEN_NOTE,user->note);
58: getrec(userdat,U_COMP,LEN_COMP,user->comp);
59: getrec(userdat,U_COMMENT,LEN_COMMENT,user->comment);
60: getrec(userdat,U_NETMAIL,LEN_NETMAIL,user->netmail);
61: getrec(userdat,U_ADDRESS,LEN_ADDRESS,user->address);
62: getrec(userdat,U_LOCATION,LEN_LOCATION,user->location);
63: getrec(userdat,U_ZIPCODE,LEN_ZIPCODE,user->zipcode);
64: getrec(userdat,U_PASS,LEN_PASS,user->pass);
65: getrec(userdat,U_PHONE,LEN_PHONE,user->phone);
66: getrec(userdat,U_BIRTH,LEN_BIRTH,user->birth);
67: getrec(userdat,U_MODEM,LEN_MODEM,user->modem);
68: getrec(userdat,U_LASTON,8,str); user->laston=ahtoul(str);
69: getrec(userdat,U_FIRSTON,8,str); user->firston=ahtoul(str);
70: getrec(userdat,U_EXPIRE,8,str); user->expire=ahtoul(str);
71: getrec(userdat,U_PWMOD,8,str); user->pwmod=ahtoul(str);
72: getrec(userdat,U_NS_TIME,8,str);
73: user->ns_time=ahtoul(str);
74: if(user->ns_time<0x20000000L)
75: user->ns_time=user->laston; /* Fix for v2.00->v2.10 */
76:
77: getrec(userdat,U_LOGONS,5,str); user->logons=atoi(str);
78: getrec(userdat,U_LTODAY,5,str); user->ltoday=atoi(str);
79: getrec(userdat,U_TIMEON,5,str); user->timeon=atoi(str);
80: getrec(userdat,U_TEXTRA,5,str); user->textra=atoi(str);
81: getrec(userdat,U_TTODAY,5,str); user->ttoday=atoi(str);
82: getrec(userdat,U_TLAST,5,str); user->tlast=atoi(str);
83: getrec(userdat,U_POSTS,5,str); user->posts=atoi(str);
84: getrec(userdat,U_EMAILS,5,str); user->emails=atoi(str);
85: getrec(userdat,U_FBACKS,5,str); user->fbacks=atoi(str);
86: getrec(userdat,U_ETODAY,5,str); user->etoday=atoi(str);
87: getrec(userdat,U_PTODAY,5,str); user->ptoday=atoi(str);
88: getrec(userdat,U_ULB,10,str); user->ulb=atol(str);
89: getrec(userdat,U_ULS,5,str); user->uls=atoi(str);
90: getrec(userdat,U_DLB,10,str); user->dlb=atol(str);
91: getrec(userdat,U_DLS,5,str); user->dls=atoi(str);
92: getrec(userdat,U_CDT,10,str); user->cdt=atol(str);
93: getrec(userdat,U_MIN,10,str); user->min=atol(str);
94: getrec(userdat,U_LEVEL,2,str); user->level=atoi(str);
95: getrec(userdat,U_FLAGS1,8,str); user->flags1=ahtoul(str); /***
96: getrec(userdat,U_TL,2,str); user->tl=atoi(str); ***/
97: getrec(userdat,U_FLAGS2,8,str); user->flags2=ahtoul(str);
98: getrec(userdat,U_FLAGS3,8,str); user->flags3=ahtoul(str);
99: getrec(userdat,U_FLAGS4,8,str); user->flags4=ahtoul(str);
100: getrec(userdat,U_EXEMPT,8,str); user->exempt=ahtoul(str);
101: getrec(userdat,U_REST,8,str); user->rest=ahtoul(str);
102: getrec(userdat,U_ROWS,2,str); user->rows=atoi(str);
103: if(user->rows && user->rows<10)
104: user->rows=10;
105: user->sex=userdat[U_SEX];
106: if(!user->sex)
107: user->sex=SP; /* fix for v1b04 that could save as 0 */
108: user->prot=userdat[U_PROT];
109: if(user->prot<SP)
110: user->prot=SP;
111: getrec(userdat,U_MISC,8,str); user->misc=ahtoul(str);
112: if(user->rest&FLAG('Q'))
113: user->misc&=~SPIN;
114:
115: getrec(userdat,U_LEECH,2,str);
116: user->leech=(uchar)ahtoul(str);
117: getrec(userdat,U_CURSUB,8,useron.cursub);
118: getrec(userdat,U_CURDIR,8,useron.curdir);
119:
120: getrec(userdat,U_FREECDT,10,str);
121: user->freecdt=atol(str);
122:
123: getrec(userdat,U_XEDIT,8,str);
124: for(i=0;i<total_xedits;i++)
125: if(!stricmp(str,xedit[i]->code) && chk_ar(xedit[i]->ar,*user))
126: break;
127: user->xedit=i+1;
128: if(user->xedit>total_xedits)
129: user->xedit=0;
130:
131: getrec(userdat,U_SHELL,8,str);
132: for(i=0;i<total_shells;i++)
133: if(!stricmp(str,shell[i]->code))
134: break;
135: if(i==total_shells)
136: i=0;
137: user->shell=i;
138:
139: getrec(userdat,U_QWK,8,str);
140: if(str[0]<SP) { /* v1c, so set defaults */
141: if(user->rest&FLAG('Q'))
142: user->qwk=(QWK_RETCTLA);
143: else
144: user->qwk=(QWK_FILES|QWK_ATTACH|QWK_EMAIL|QWK_DELMAIL); }
145: else
146: user->qwk=ahtoul(str);
147:
148: getrec(userdat,U_TMPEXT,3,user->tmpext);
149: if((!user->tmpext[0] || !strcmp(user->tmpext,"0")) && total_fcomps)
150: strcpy(user->tmpext,fcomp[0]->ext); /* For v1x to v2x conversion */
151:
152: getrec(userdat,U_CHAT,8,str);
153: user->chat=ahtoul(str);
154:
155: if(useron.number==user->number) {
156: useron=*user;
157:
158: if(online) {
159:
160: #if 0
161: getusrdirs();
162: getusrsubs();
163: #endif
164: if(useron.misc&AUTOTERM) {
165: useron.misc&=~(ANSI|RIP|WIP);
166: useron.misc|=autoterm; }
167: statusline(); } }
168: }
169:
170:
171: /****************************************************************************/
172: /* Returns the username in 'str' that corresponds to the 'usernumber' */
173: /* Called from functions everywhere */
174: /****************************************************************************/
175: char *username(int usernumber,char *strin)
176: {
177: char str[256];
178: char c;
179: int file;
180:
181: if(usernumber<1) {
182: strin[0]=0;
183: return(strin); }
184: sprintf(str,"%sUSER\\NAME.DAT",data_dir);
185: if(flength(str)<1L) {
186: strin[0]=0;
187: return(strin); }
188: if((file=nopen(str,O_RDONLY))==-1) {
189: errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
190: strin[0]=0;
191: return(strin); }
192: if(filelength(file)<(long)((long)usernumber*(LEN_ALIAS+2))) {
193: close(file);
194: strin[0]=0;
195: return(strin); }
196: lseek(file,(long)((long)(usernumber-1)*(LEN_ALIAS+2)),SEEK_SET);
197: read(file,strin,LEN_ALIAS);
198: close(file);
199: for(c=0;c<LEN_ALIAS;c++)
200: if(strin[c]==ETX) break;
201: strin[c]=0;
202: if(!c)
203: strcpy(strin,"DELETED USER");
204: return(strin);
205: }
206:
207: /****************************************************************************/
208: /* Fills the timeleft variable with the correct value. Hangs up on the */
209: /* user if their time is up. */
210: /* Called from functions main_sec and xfer_sec */
211: /****************************************************************************/
212: void gettimeleft(void)
213: {
214: static inside;
215: char str[128];
216: int i;
217: time_t eventtime=0,thisevent;
218: long tleft;
219: struct date lastdate;
220: struct tm *gm;
221:
222: now=time(NULL);
223:
224: gm=localtime(&now);
225: if(useron.exempt&FLAG('T')) { /* Time online exemption */
226: timeleft=level_timepercall[useron.level]*60;
227: if(timeleft<10) /* never get below 10 for exempt users */
228: timeleft=10; }
229: else {
230: tleft=(((long)level_timeperday[useron.level]-useron.ttoday)
231: +useron.textra)*60L;
232: if(tleft<0) tleft=0;
233: if(tleft>level_timepercall[useron.level]*60)
234: tleft=level_timepercall[useron.level]*60;
235: tleft+=useron.min*60L;
236: tleft-=now-starttime;
237: if(tleft>0x7fffL)
238: timeleft=0x7fff;
239: else
240: timeleft=tleft; }
241:
242: /* Timed event time reduction handler */
243:
244: for(i=0;i<total_events;i++) {
245: if(!event[i]->node || event[i]->node>sys_nodes)
246: continue;
247: if(!(event[i]->misc&EVENT_FORCE)
248: || (!(event[i]->misc&EVENT_EXCL) && event[i]->node!=node_num)
249: || !(event[i]->days&(1<<gm->tm_wday)))
250: continue;
251: unixtodos(event[i]->last,&lastdate,&curtime);
252: unixtodos(now,&date,&curtime);
253: curtime.ti_hour=event[i]->time/60; /* hasn't run yet today */
254: curtime.ti_min=event[i]->time-(curtime.ti_hour*60);
255: curtime.ti_sec=0;
256: thisevent=dostounix(&date,&curtime);
257: if(date.da_day==lastdate.da_day && date.da_mon==lastdate.da_mon)
258: thisevent+=24L*60L*60L; /* already ran today, so add 24hrs */
259: if(!eventtime || thisevent<eventtime)
260: eventtime=thisevent; }
261: if(eventtime && now+timeleft>eventtime) { /* less time, set flag */
262: sys_status|=SS_EVENT;
263: timeleft=eventtime-now; }
264:
265: /* Event time passed by front-end */
266: if(next_event && (next_event<now || next_event-now<timeleft)) {
267: timeleft=next_event-now;
268: sys_status|=SS_EVENT; }
269:
270: if(timeleft<0) /* timeleft can't go negative */
271: timeleft=0;
272: if(thisnode.status==NODE_NEWUSER) {
273: timeleft=level_timepercall[new_level];
274: if(timeleft<10*60L)
275: timeleft=10*60L; }
276:
277: if(inside) /* The following code is not recursive */
278: return;
279: inside=1;
280:
281: if(!timeleft && !SYSOP && !(sys_status&SS_LCHAT)) {
282: logline(nulstr,"Ran out of time");
283: SAVELINE;
284: bputs(text[TimesUp]);
285: if(!(sys_status&(SS_EVENT|SS_USERON)) && useron.cdt>=100L*1024L
286: && !(sys_misc&SM_NOCDTCVT)) {
287: sprintf(tmp,text[Convert100ktoNminQ],cdt_min_value);
288: if(yesno(tmp)) {
289: logline(" ","Credit to Minute Conversion");
290: useron.min=adjustuserrec(useron.number,U_MIN,10,cdt_min_value);
291: useron.cdt=adjustuserrec(useron.number,U_CDT,10,-(102400L));
292: sprintf(str,"Credit Adjustment: %ld",-(102400L));
293: logline("$-",str);
294: sprintf(str,"Minute Adjustment: %u",cdt_min_value);
295: logline("*+",str);
296: RESTORELINE;
297: gettimeleft();
298: inside=0;
299: return; } }
300: if(sys_misc&SM_TIME_EXP && !(sys_status&SS_EVENT)
301: && !(useron.exempt&FLAG('E'))) {
302: /* set to expired values */
303: bputs(text[AccountHasExpired]);
304: sprintf(str,"%s Expired",useron.alias);
305: logentry("!%",str);
306: if(level_misc[useron.level]&LEVEL_EXPTOVAL
307: && level_expireto[useron.level]<10) {
308: useron.flags1=val_flags1[level_expireto[useron.level]];
309: useron.flags2=val_flags2[level_expireto[useron.level]];
310: useron.flags3=val_flags3[level_expireto[useron.level]];
311: useron.flags4=val_flags4[level_expireto[useron.level]];
312: useron.exempt=val_exempt[level_expireto[useron.level]];
313: useron.rest=val_rest[level_expireto[useron.level]];
314: if(val_expire[level_expireto[useron.level]])
315: useron.expire=now
316: +(val_expire[level_expireto[useron.level]]*24*60*60);
317: else
318: useron.expire=0;
319: useron.level=val_level[level_expireto[useron.level]]; }
320: else {
321: if(level_misc[useron.level]&LEVEL_EXPTOLVL)
322: useron.level=level_expireto[useron.level];
323: else
324: useron.level=expired_level;
325: useron.flags1&=~expired_flags1; /* expired status */
326: useron.flags2&=~expired_flags2; /* expired status */
327: useron.flags3&=~expired_flags3; /* expired status */
328: useron.flags4&=~expired_flags4; /* expired status */
329: useron.exempt&=~expired_exempt;
330: useron.rest|=expired_rest;
331: useron.expire=0; }
332: putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,str,10));
333: putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,str,16));
334: putuserrec(useron.number,U_FLAGS2,8,ultoa(useron.flags2,str,16));
335: putuserrec(useron.number,U_FLAGS3,8,ultoa(useron.flags3,str,16));
336: putuserrec(useron.number,U_FLAGS4,8,ultoa(useron.flags4,str,16));
337: putuserrec(useron.number,U_EXPIRE,8,ultoa(useron.expire,str,16));
338: putuserrec(useron.number,U_EXEMPT,8,ultoa(useron.exempt,str,16));
339: putuserrec(useron.number,U_REST,8,ultoa(useron.rest,str,16));
340: if(expire_mod[0])
341: exec_bin(expire_mod,&main_csi);
342: RESTORELINE;
343: gettimeleft();
344: inside=0;
345: return; }
346: SYNC;
347: hangup(); }
348: inside=0;
349: }
350:
351: /****************************************************************************/
352: /* Places into 'strout' CR or ETX terminated string starting at */
353: /* 'start' and ending at 'start'+'length' or terminator from 'strin' */
354: /****************************************************************************/
355: void getrec(char *strin,int start,int length,char *strout)
356: {
357: int i=0,stop;
358:
359: stop=start+length;
360: while(start<stop) {
361: if(strin[start]==ETX || strin[start]==CR || strin[start]==LF)
362: break;
363: strout[i++]=strin[start++]; }
364: strout[i]=0;
365: }
366:
367: /****************************************************************************/
368: /* Places into 'strout', 'strin' starting at 'start' and ending at */
369: /* 'start'+'length' */
370: /****************************************************************************/
371: void putrec(char *strout,int start,int length,char *strin)
372: {
373: int i=0,j;
374:
375: j=strlen(strin);
376: while(i<j && i<length)
377: strout[start++]=strin[i++];
378: while(i++<length)
379: strout[start++]=ETX;
380: }
381:
382:
383: /****************************************************************************/
384: /* Returns the age derived from the string 'birth' in the format MM/DD/YY */
385: /* Called from functions statusline, main_sec, xfer_sec, useredit and */
386: /* text files */
387: /****************************************************************************/
388: char getage(char *birth)
389: {
390: char age;
391:
392: if(!atoi(birth) || !atoi(birth+3)) /* Invalid */
393: return(0);
394: getdate(&date);
395: age=(date.da_year-1900)-(((birth[6]&0xf)*10)+(birth[7]&0xf));
396: if(sys_misc&SM_EURODATE) { /* DD/MM/YY format */
397: if(atoi(birth)>31 || atoi(birth+3)>12)
398: return(0);
399: if(((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_mon ||
400: (((birth[3]&0xf)*10)+(birth[4]&0xf)==date.da_mon &&
401: ((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_day))
402: age--; }
403: else { /* MM/DD/YY format */
404: if(atoi(birth)>12 || atoi(birth+3)>31)
405: return(0);
406: if(((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_mon ||
407: (((birth[0]&0xf)*10)+(birth[1]&0xf)==date.da_mon &&
408: ((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_day))
409: age--; }
410: if(age<0)
411: return(0);
412: return(age);
413: }
414:
415:
416: /****************************************************************************/
417: /* Converts an ASCII Hex string into an ulong */
418: /****************************************************************************/
419: ulong ahtoul(char *str)
420: {
421: ulong l,val=0;
422:
423: while((l=(*str++)|0x20)!=0x20)
424: val=(l&0xf)+(l>>6&1)*9+val*16;
425: return(val);
426: }
427:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.