Annotation of sbbs/sbbs2/getuser.c, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.