Annotation of sbbs/sbbs3/data.cpp, revision 1.1.1.1

1.1       root        1: /* data.cpp */
                      2: 
                      3: /* Synchronet data access routines */
                      4: 
                      5: /* $Id: data.cpp,v 1.5 2000/12/11 23:21:11 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: /**************************************************************/
                     39: /* Functions that store and retrieve data from disk or memory */
                     40: /**************************************************************/
                     41: 
                     42: #include "sbbs.h"
                     43: 
                     44: /****************************************************************************/
                     45: /* Looks for close or perfect matches between str and valid usernames and      */
                     46: /* numbers and prompts user for near perfect matches in names.                         */
                     47: /* Returns the number of the matched user or 0 if unsuccessful                         */
                     48: /* Called from functions main_sec, useredit and readmailw                                      */
                     49: /****************************************************************************/
                     50: uint sbbs_t::finduser(char *instr)
                     51: {
                     52:        int file,i;
                     53:        char str[128],str2[256],str3[256],ynq[25],c,pass=1;
                     54:        ulong l,length;
                     55:        FILE *stream;
                     56: 
                     57:        i=atoi(instr);
                     58:        if(i>0) {
                     59:                username(&cfg, i,str2);
                     60:                if(str2[0] && strcmp(str2,"DELETED USER"))
                     61:                        return(i); }
                     62:        strcpy(str,instr);
                     63:        strupr(str);
                     64:        sprintf(str3,"%suser/name.dat",cfg.data_dir);
                     65:        if(flength(str3)<1L)
                     66:                return(0);
                     67:        if((stream=fnopen(&file,str3,O_RDONLY))==NULL) {
                     68:                errormsg(WHERE,ERR_OPEN,str3,O_RDONLY);
                     69:                return(0); }
                     70:        sprintf(ynq,"%.2s",text[YN]);
                     71:        ynq[2]='Q';
                     72:        ynq[3]=0;
                     73:        length=filelength(file);
                     74:        while(pass<3) {
                     75:                fseek(stream,0L,SEEK_SET);      /* seek to beginning for each pass */
                     76:                for(l=0;l<length;l+=LEN_ALIAS+2) {
                     77:                        if(!online) break;
                     78:                        fread(str2,LEN_ALIAS+2,1,stream);
                     79:                        for(c=0;c<LEN_ALIAS;c++)
                     80:                                if(str2[c]==ETX) break;
                     81:                        str2[c]=0;
                     82:                        if(!c)          /* deleted user */
                     83:                                continue;
                     84:                        strcpy(str3,str2);
                     85:                        strupr(str2);
                     86:                        if(pass==1 && !strcmp(str,str2)) {
                     87:                                fclose(stream);
                     88:                                return((l/(LEN_ALIAS+2))+1); }
                     89:                        if(pass==2 && strstr(str2,str)) {
                     90:                                bprintf(text[DoYouMeanThisUserQ],str3
                     91:                                        ,(uint)(l/(LEN_ALIAS+2))+1);
                     92:                                c=(char)getkeys(ynq,0);
                     93:                                if(sys_status&SS_ABORT) {
                     94:                                        fclose(stream);
                     95:                                        return(0); }
                     96:                                if(c==text[YN][0]) {
                     97:                                        fclose(stream);
                     98:                                        return((l/(LEN_ALIAS+2))+1); }
                     99:                                if(c=='Q') {
                    100:                                        fclose(stream);
                    101:                                        return(0); } } }
                    102:                pass++; }
                    103:        bputs(text[UnknownUser]);
                    104:        fclose(stream);
                    105:        return(0);
                    106: }
                    107: 
                    108: /****************************************************************************/
                    109: /* Returns the number of files in the directory 'dirnum'                    */
                    110: /****************************************************************************/
                    111: int sbbs_t::getfiles(uint dirnum)
                    112: {
                    113:        char str[256];
                    114:        long l;
                    115: 
                    116:        sprintf(str,"%s%s.ixb",cfg.dir[dirnum]->data_dir, cfg.dir[dirnum]->code);
                    117:        l=flength(str);
                    118:        if(l>0L)
                    119:                return(l/F_IXBSIZE);
                    120:        return(0);
                    121: }
                    122: 
                    123: /****************************************************************************/
                    124: /* Returns the number of user transfers in XFER.IXT for either a dest user  */
                    125: /* source user, or filename.                                                                                           */
                    126: /****************************************************************************/
                    127: int sbbs_t::getuserxfers(int fromuser, int destuser, char *fname)
                    128: {
                    129:        char str[256];
                    130:        int file,found=0;
                    131:        FILE *stream;
                    132: 
                    133:        sprintf(str,"%sxfer.ixt",cfg.data_dir);
                    134:        if(!fexist(str))
                    135:                return(0);
                    136:        if(!flength(str)) {
                    137:                remove(str);
                    138:                return(0); }
                    139:        if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
                    140:                errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    141:                return(0); }
                    142:        while(!ferror(stream)) {
                    143:                if(!fgets(str,81,stream))
                    144:                        break;
                    145:                str[22]=0;
                    146:                if(fname!=NULL && fname[0] && !strncmp(str+5,fname,12))
                    147:                                found++;
                    148:                else if(fromuser && atoi(str+18)==fromuser)
                    149:                                found++;
                    150:                else if(destuser && atoi(str)==destuser)
                    151:                                found++; }
                    152:        fclose(stream);
                    153:        return(found);
                    154: }
                    155: 
                    156: /****************************************************************************/
                    157: /* Returns the number of files in the database for 'dir'                                       */
                    158: /****************************************************************************/
                    159: uint sbbs_t::gettotalfiles(uint dirnum)
                    160: {
                    161:        char str[81];
                    162: 
                    163:        sprintf(str,"%s%s.ixb", cfg.dir[dirnum]->data_dir, cfg.dir[dirnum]->code);
                    164:        return((uint)(flength(str)/F_IXBSIZE));
                    165: }
                    166: 
                    167: 
                    168: /****************************************************************************/
                    169: /* Fills the timeleft variable with the correct value. Hangs up on the      */
                    170: /* user if their time is up.                                                */
                    171: /* Called from functions main_sec and xfer_sec                              */
                    172: /****************************************************************************/
                    173: void sbbs_t::gettimeleft(void)
                    174: {
                    175:     char    str[128];
                    176:        char    tmp[512];
                    177:     int     i;
                    178:     time_t  eventtime=0;
                    179:        time_t  thisevent;
                    180:     long    tleft;
                    181:     struct  tm *tm, last_tm;
                    182: 
                    183:        now=time(NULL);
                    184: 
                    185:        tm=localtime(&now);
                    186:        if(tm==NULL)
                    187:                return;
                    188:        if(useron.exempt&FLAG('T')) {   /* Time online exemption */
                    189:                timeleft=cfg.level_timepercall[useron.level]*60;
                    190:                if(timeleft<10)             /* never get below 10 for exempt users */
                    191:                        timeleft=10; }
                    192:        else {
                    193:                tleft=(((long)cfg.level_timeperday[useron.level]-useron.ttoday)
                    194:                        +useron.textra)*60L;
                    195:                if(tleft<0) tleft=0;
                    196:                if(tleft>cfg.level_timepercall[useron.level]*60)
                    197:                        tleft=cfg.level_timepercall[useron.level]*60;
                    198:                tleft+=useron.min*60L;
                    199:                tleft-=now-starttime;
                    200:                if(tleft>0x7fffL)
                    201:                        timeleft=0x7fff;
                    202:                else
                    203:                        timeleft=tleft; }
                    204: 
                    205:        /* Timed event time reduction handler */
                    206: 
                    207:        for(i=0;i<cfg.total_events;i++) {
                    208:                if(!cfg.event[i]->node || cfg.event[i]->node>cfg.sys_nodes)
                    209:                        continue;
                    210:                if(!(cfg.event[i]->misc&EVENT_FORCE)
                    211:                        || (!(cfg.event[i]->misc&EVENT_EXCL) && cfg.event[i]->node!=cfg.node_num)
                    212:                        || !(cfg.event[i]->days&(1<<tm->tm_wday)))
                    213:                        continue;
                    214: 
                    215:                tm=gmtime(&cfg.event[i]->last);
                    216:                if(tm)
                    217:                        last_tm=*tm;
                    218:                else
                    219:                        memset(&last_tm,0,sizeof(last_tm));
                    220:                tm=gmtime(&now);
                    221:                if(tm==NULL)
                    222:                        return;
                    223:                tm->tm_hour=cfg.event[i]->time/60;   /* hasn't run yet today */
                    224:                tm->tm_min=cfg.event[i]->time-(tm->tm_hour*60);
                    225:                tm->tm_sec=0;
                    226:                thisevent=mktime(tm);
                    227:                if(tm->tm_mday==last_tm.tm_mday && tm->tm_mon==last_tm.tm_mon)
                    228:                        thisevent+=24L*60L*60L;     /* already ran today, so add 24hrs */
                    229:                if(!eventtime || thisevent<eventtime)
                    230:                        eventtime=thisevent; 
                    231:        }
                    232:        if(eventtime && now+(time_t)timeleft>eventtime) {    /* less time, set flag */
                    233:                sys_status|=SS_EVENT;
                    234:                timeleft=eventtime-now; }
                    235: 
                    236:        /* Event time passed by front-end */
                    237:        if(next_event && (next_event<now || next_event-now<(time_t)timeleft)) {
                    238:                timeleft=next_event-now;
                    239:                sys_status|=SS_EVENT; }
                    240: 
                    241:        if(timeleft<0)  /* timeleft can't go negative */
                    242:                timeleft=0;
                    243:        if(thisnode.status==NODE_NEWUSER) {
                    244:                timeleft=cfg.level_timepercall[cfg.new_level];
                    245:                if(timeleft<10*60L)
                    246:                        timeleft=10*60L; }
                    247: 
                    248:        if(gettimeleft_inside)                  /* The following code is not recursive */
                    249:                return;
                    250:        gettimeleft_inside=1;
                    251: 
                    252:        if(!timeleft && !SYSOP && !(sys_status&SS_LCHAT)) {
                    253:                logline(nulstr,"Ran out of time");
                    254:                SAVELINE;
                    255:                if(sys_status&SS_EVENT)
                    256:                        bputs(text[ReducedTime]);
                    257:                bputs(text[TimesUp]);
                    258:                if(!(sys_status&(SS_EVENT|SS_USERON)) && useron.cdt>=100L*1024L
                    259:                        && !(cfg.sys_misc&SM_NOCDTCVT)) {
                    260:                        sprintf(tmp,text[Convert100ktoNminQ],cfg.cdt_min_value);
                    261:                        if(yesno(tmp)) {
                    262:                                logline("  ","Credit to Minute Conversion");
                    263:                                useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,cfg.cdt_min_value);
                    264:                                useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10,-(102400L));
                    265:                                sprintf(str,"Credit Adjustment: %ld",-(102400L));
                    266:                                logline("$-",str);
                    267:                                sprintf(str,"Minute Adjustment: %u",cfg.cdt_min_value);
                    268:                                logline("*+",str);
                    269:                                RESTORELINE;
                    270:                                gettimeleft();
                    271:                                gettimeleft_inside=0;
                    272:                                return; } }
                    273:                if(cfg.sys_misc&SM_TIME_EXP && !(sys_status&SS_EVENT)
                    274:                        && !(useron.exempt&FLAG('E'))) {
                    275:                                                                                        /* set to expired values */
                    276:                        bputs(text[AccountHasExpired]);
                    277:                        sprintf(str,"%s Expired",useron.alias);
                    278:                        logentry("!%",str);
                    279:                        if(cfg.level_misc[useron.level]&LEVEL_EXPTOVAL
                    280:                                && cfg.level_expireto[useron.level]<10) {
                    281:                                useron.flags1=cfg.val_flags1[cfg.level_expireto[useron.level]];
                    282:                                useron.flags2=cfg.val_flags2[cfg.level_expireto[useron.level]];
                    283:                                useron.flags3=cfg.val_flags3[cfg.level_expireto[useron.level]];
                    284:                                useron.flags4=cfg.val_flags4[cfg.level_expireto[useron.level]];
                    285:                                useron.exempt=cfg.val_exempt[cfg.level_expireto[useron.level]];
                    286:                                useron.rest=cfg.val_rest[cfg.level_expireto[useron.level]];
                    287:                                if(cfg.val_expire[cfg.level_expireto[useron.level]])
                    288:                                        useron.expire=now
                    289:                                                +(cfg.val_expire[cfg.level_expireto[useron.level]]*24*60*60);
                    290:                                else
                    291:                                        useron.expire=0;
                    292:                                useron.level=cfg.val_level[cfg.level_expireto[useron.level]]; }
                    293:                        else {
                    294:                                if(cfg.level_misc[useron.level]&LEVEL_EXPTOLVL)
                    295:                                        useron.level=cfg.level_expireto[useron.level];
                    296:                                else
                    297:                                        useron.level=cfg.expired_level;
                    298:                                useron.flags1&=~cfg.expired_flags1; /* expired status */
                    299:                                useron.flags2&=~cfg.expired_flags2; /* expired status */
                    300:                                useron.flags3&=~cfg.expired_flags3; /* expired status */
                    301:                                useron.flags4&=~cfg.expired_flags4; /* expired status */
                    302:                                useron.exempt&=~cfg.expired_exempt;
                    303:                                useron.rest|=cfg.expired_rest;
                    304:                                useron.expire=0; }
                    305:                        putuserrec(&cfg,useron.number,U_LEVEL,2,ultoa(useron.level,str,10));
                    306:                        putuserrec(&cfg,useron.number,U_FLAGS1,8,ultoa(useron.flags1,str,16));
                    307:                        putuserrec(&cfg,useron.number,U_FLAGS2,8,ultoa(useron.flags2,str,16));
                    308:                        putuserrec(&cfg,useron.number,U_FLAGS3,8,ultoa(useron.flags3,str,16));
                    309:                        putuserrec(&cfg,useron.number,U_FLAGS4,8,ultoa(useron.flags4,str,16));
                    310:                        putuserrec(&cfg,useron.number,U_EXPIRE,8,ultoa(useron.expire,str,16));
                    311:                        putuserrec(&cfg,useron.number,U_EXEMPT,8,ultoa(useron.exempt,str,16));
                    312:                        putuserrec(&cfg,useron.number,U_REST,8,ultoa(useron.rest,str,16));
                    313:                        if(cfg.expire_mod[0])
                    314:                                exec_bin(cfg.expire_mod,&main_csi);
                    315:                        RESTORELINE;
                    316:                        gettimeleft();
                    317:                        gettimeleft_inside=0;
                    318:                        return; }
                    319:                SYNC;
                    320:                hangup(); }
                    321:        gettimeleft_inside=0;
                    322: }

unix.superglobalmegacorp.com

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