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

1.1     ! root        1: #line 1 "DATA_OVL.C"
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: #include "sbbs.h"
        !             6: 
        !             7: /****************************************************************************/
        !             8: /* Writes into user.number's slot in USER.DAT data in structure 'user'      */
        !             9: /* Called from functions newuser, useredit and main                         */
        !            10: /****************************************************************************/
        !            11: void putuserdat(user_t user)
        !            12: {
        !            13:     int i,file;
        !            14:     char userdat[U_LEN+1],str[U_LEN+1];
        !            15:     node_t node;
        !            16: 
        !            17: if(!user.number) {
        !            18:     errormsg(WHERE,ERR_CHK,"user number",0);
        !            19:     return; }
        !            20: memset(userdat,ETX,U_LEN);
        !            21: putrec(userdat,U_ALIAS,LEN_ALIAS+5,user.alias);
        !            22: putrec(userdat,U_NAME,LEN_NAME,user.name);
        !            23: putrec(userdat,U_HANDLE,LEN_HANDLE,user.handle);
        !            24: putrec(userdat,U_HANDLE+LEN_HANDLE,2,crlf);
        !            25: 
        !            26: putrec(userdat,U_NOTE,LEN_NOTE,user.note);
        !            27: putrec(userdat,U_COMP,LEN_COMP,user.comp);
        !            28: putrec(userdat,U_COMP+LEN_COMP,2,crlf);
        !            29: 
        !            30: putrec(userdat,U_COMMENT,LEN_COMMENT,user.comment);
        !            31: putrec(userdat,U_COMMENT+LEN_COMMENT,2,crlf);
        !            32: 
        !            33: putrec(userdat,U_NETMAIL,LEN_NETMAIL,user.netmail);
        !            34: putrec(userdat,U_NETMAIL+LEN_NETMAIL,2,crlf);
        !            35: 
        !            36: putrec(userdat,U_ADDRESS,LEN_ADDRESS,user.address);
        !            37: putrec(userdat,U_LOCATION,LEN_LOCATION,user.location);
        !            38: putrec(userdat,U_ZIPCODE,LEN_ZIPCODE,user.zipcode);
        !            39: putrec(userdat,U_ZIPCODE+LEN_ZIPCODE,2,crlf);
        !            40: 
        !            41: putrec(userdat,U_PASS,LEN_PASS,user.pass);
        !            42: putrec(userdat,U_PHONE,LEN_PHONE,user.phone);
        !            43: putrec(userdat,U_BIRTH,LEN_BIRTH,user.birth);
        !            44: putrec(userdat,U_MODEM,LEN_MODEM,user.modem);
        !            45: putrec(userdat,U_LASTON,8,ultoa(user.laston,str,16));
        !            46: putrec(userdat,U_FIRSTON,8,ultoa(user.firston,str,16));
        !            47: putrec(userdat,U_EXPIRE,8,ultoa(user.expire,str,16));
        !            48: putrec(userdat,U_PWMOD,8,ultoa(user.pwmod,str,16));
        !            49: putrec(userdat,U_PWMOD+8,2,crlf);
        !            50: 
        !            51: putrec(userdat,U_LOGONS,5,itoa(user.logons,str,10));
        !            52: putrec(userdat,U_LTODAY,5,itoa(user.ltoday,str,10));
        !            53: putrec(userdat,U_TIMEON,5,itoa(user.timeon,str,10));
        !            54: putrec(userdat,U_TEXTRA,5,itoa(user.textra,str,10));
        !            55: putrec(userdat,U_TTODAY,5,itoa(user.ttoday,str,10));
        !            56: putrec(userdat,U_TLAST,5,itoa(user.tlast,str,10));
        !            57: putrec(userdat,U_POSTS,5,itoa(user.posts,str,10));
        !            58: putrec(userdat,U_EMAILS,5,itoa(user.emails,str,10));
        !            59: putrec(userdat,U_FBACKS,5,itoa(user.fbacks,str,10));
        !            60: putrec(userdat,U_ETODAY,5,itoa(user.etoday,str,10));
        !            61: putrec(userdat,U_PTODAY,5,itoa(user.ptoday,str,10));
        !            62: putrec(userdat,U_PTODAY+5,2,crlf);
        !            63: 
        !            64: putrec(userdat,U_ULB,10,ultoa(user.ulb,str,10));
        !            65: putrec(userdat,U_ULS,5,itoa(user.uls,str,10));
        !            66: putrec(userdat,U_DLB,10,ultoa(user.dlb,str,10));
        !            67: putrec(userdat,U_DLS,5,itoa(user.dls,str,10));
        !            68: putrec(userdat,U_CDT,10,ultoa(user.cdt,str,10));
        !            69: putrec(userdat,U_MIN,10,ultoa(user.min,str,10));
        !            70: putrec(userdat,U_MIN+10,2,crlf);
        !            71: 
        !            72: putrec(userdat,U_LEVEL,2,itoa(user.level,str,10));
        !            73: putrec(userdat,U_FLAGS1,8,ultoa(user.flags1,str,16));
        !            74: putrec(userdat,U_TL,2,nulstr); /* unused */
        !            75: putrec(userdat,U_FLAGS2,8,ultoa(user.flags2,str,16));
        !            76: putrec(userdat,U_EXEMPT,8,ultoa(user.exempt,str,16));
        !            77: putrec(userdat,U_REST,8,ultoa(user.rest,str,16));
        !            78: putrec(userdat,U_REST+8,2,crlf);
        !            79: 
        !            80: putrec(userdat,U_ROWS,2,itoa(user.rows,str,10));
        !            81: userdat[U_SEX]=user.sex;
        !            82: userdat[U_PROT]=user.prot;
        !            83: putrec(userdat,U_MISC,8,ultoa(user.misc,str,16));
        !            84: putrec(userdat,U_LEECH,2,itoa(user.leech,str,16));
        !            85: 
        !            86: putrec(userdat,U_CURSUB,8,user.cursub);
        !            87: putrec(userdat,U_CURDIR,8,user.curdir);
        !            88: 
        !            89: // putrec(userdat,U_CMDSET,2,itoa(user.cmdset,str,16)); /* Unused */
        !            90: putrec(userdat,U_CMDSET+2,2,crlf);
        !            91: 
        !            92: putrec(userdat,U_XFER_CMD+LEN_XFER_CMD,2,crlf);
        !            93: 
        !            94: putrec(userdat,U_MAIL_CMD+LEN_MAIL_CMD,2,crlf);
        !            95: 
        !            96: putrec(userdat,U_FREECDT,10,ultoa(user.freecdt,str,10));
        !            97: 
        !            98: putrec(userdat,U_FLAGS3,8,ultoa(user.flags3,str,16));
        !            99: putrec(userdat,U_FLAGS4,8,ultoa(user.flags4,str,16));
        !           100: 
        !           101: if(user.xedit)
        !           102:        putrec(userdat,U_XEDIT,8,xedit[user.xedit-1]->code);
        !           103: else
        !           104:        putrec(userdat,U_XEDIT,8,nulstr);
        !           105: 
        !           106: putrec(userdat,U_SHELL,8,shell[user.shell]->code);
        !           107: 
        !           108: putrec(userdat,U_QWK,8,ultoa(user.qwk,str,16));
        !           109: putrec(userdat,U_TMPEXT,3,user.tmpext);
        !           110: putrec(userdat,U_CHAT,8,ultoa(user.chat,str,16));
        !           111: putrec(userdat,U_NS_TIME,8,ultoa(user.ns_time,str,16));
        !           112: 
        !           113: putrec(userdat,U_UNUSED,29,crlf);
        !           114: putrec(userdat,U_UNUSED+29,2,crlf);
        !           115: 
        !           116: sprintf(str,"%sUSER\\USER.DAT",data_dir);
        !           117: if((file=nopen(str,O_WRONLY|O_CREAT|O_DENYNONE))==-1) {
        !           118:        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_DENYNONE);
        !           119:        return; }
        !           120: 
        !           121: /***           This shouldn't be necessary
        !           122: if(filelength(file)<(long)((long)user.number*U_LEN))
        !           123:     lseek(file,0L,SEEK_END);
        !           124: else
        !           125: ***/
        !           126: 
        !           127: lseek(file,(long)((long)((long)user.number-1)*U_LEN),SEEK_SET);
        !           128: 
        !           129: i=0;
        !           130: while(i<LOOP_NODEDAB
        !           131:        && lock(file,(long)((long)(user.number-1)*U_LEN),U_LEN)==-1) {
        !           132:        if(i>10)
        !           133:                mswait(55);
        !           134:        i++; }
        !           135: 
        !           136: if(i>=LOOP_NODEDAB) {
        !           137:        close(file);
        !           138:        errormsg(WHERE,ERR_LOCK,"USER.DAT",user.number);
        !           139:     return; }
        !           140: 
        !           141: if(write(file,userdat,U_LEN)!=U_LEN) {
        !           142:        unlock(file,(long)((long)(user.number-1)*U_LEN),U_LEN);
        !           143:     close(file);
        !           144:     errormsg(WHERE,ERR_WRITE,str,U_LEN);
        !           145:     return; }
        !           146: unlock(file,(long)((long)(user.number-1)*U_LEN),U_LEN);
        !           147: close(file);
        !           148: for(i=1;i<=sys_nodes;i++) { /* instant user data update */
        !           149:     if(i==node_num)
        !           150:         continue;
        !           151:     getnodedat(i,&node,0);
        !           152:     if(node.useron==user.number && (node.status==NODE_INUSE
        !           153:         || node.status==NODE_QUIET)) {
        !           154:         getnodedat(i,&node,1);
        !           155:         node.misc|=NODE_UDAT;
        !           156:         putnodedat(i,node);
        !           157:         break; } }
        !           158: }
        !           159: 
        !           160: 
        !           161: /****************************************************************************/
        !           162: /* Puts 'name' into slot 'number' in USER\\NAME.DAT                                                    */
        !           163: /****************************************************************************/
        !           164: void putusername(int number, char *name)
        !           165: {
        !           166:        char str[256];
        !           167:        int file;
        !           168:        long length,l;
        !           169: 
        !           170: sprintf(str,"%sUSER\\NAME.DAT",data_dir);
        !           171: if((file=nopen(str,O_RDWR|O_CREAT))==-1) {
        !           172:        errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT);
        !           173:        return; }
        !           174: length=filelength(file);
        !           175: if(length && length%(LEN_ALIAS+2)) {
        !           176:        close(file);
        !           177:        errormsg(WHERE,ERR_LEN,str,length);
        !           178:        return; }
        !           179: if(length<(((long)number-1)*(LEN_ALIAS+2))) {
        !           180:        sprintf(str,"%*s",LEN_ALIAS,nulstr);
        !           181:        strset(str,ETX);
        !           182:        strcat(str,crlf);
        !           183:        lseek(file,0L,SEEK_END);
        !           184:        while(filelength(file)<((long)number*(LEN_ALIAS+2)))
        !           185:                write(file,str,(LEN_ALIAS+2)); }
        !           186: lseek(file,(long)(((long)number-1)*(LEN_ALIAS+2)),SEEK_SET);
        !           187: putrec(str,0,LEN_ALIAS,name);
        !           188: putrec(str,LEN_ALIAS,2,crlf);
        !           189: write(file,str,LEN_ALIAS+2);
        !           190: close(file);
        !           191: }
        !           192: 
        !           193: /****************************************************************************/
        !           194: /* Fills the 'ptr' element of the each element of the sub[] array of sub_t  */
        !           195: /* and the sub_misc and sub_ptr global variables                            */
        !           196: /* Called from function main                                                */
        !           197: /****************************************************************************/
        !           198: void getmsgptrs()
        !           199: {
        !           200:        char    str[256];
        !           201:        ushort  ch;
        !           202:        uint    i;
        !           203:        int     file;
        !           204:        long    length;
        !           205:        FILE    *stream;
        !           206: 
        !           207: now=time(NULL);
        !           208: if(!useron.number)
        !           209:     return;
        !           210: bputs(text[LoadingMsgPtrs]);
        !           211: sprintf(str,"%sUSER\\PTRS\\%4.4u.IXB",data_dir,useron.number);
        !           212: if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
        !           213:        for(i=0;i<total_subs;i++) {
        !           214:                sub_ptr[i]=sub[i]->ptr=sub_last[i]=sub[i]->last=0;
        !           215:                if(sub[i]->misc&SUB_NSDEF)
        !           216:                        sub[i]->misc|=SUB_NSCAN;
        !           217:                else
        !           218:                        sub[i]->misc&=~SUB_NSCAN;
        !           219:                if(sub[i]->misc&SUB_SSDEF)
        !           220:                        sub[i]->misc|=SUB_SSCAN;
        !           221:                else
        !           222:                        sub[i]->misc&=~SUB_SSCAN;
        !           223:                sub_misc[i]=sub[i]->misc; }
        !           224:        bputs(text[LoadedMsgPtrs]);
        !           225:        return; }
        !           226: length=filelength(file);
        !           227: for(i=0;i<total_subs;i++) {
        !           228:        if(length<(sub[i]->ptridx+1)*10L) {
        !           229:                sub[i]->ptr=sub[i]->last=0L;
        !           230:                if(sub[i]->misc&SUB_NSDEF)
        !           231:                        sub[i]->misc|=SUB_NSCAN;
        !           232:                else
        !           233:                        sub[i]->misc&=~SUB_NSCAN;
        !           234:                if(sub[i]->misc&SUB_SSDEF)
        !           235:                        sub[i]->misc|=SUB_SSCAN;
        !           236:                else
        !           237:                        sub[i]->misc&=~SUB_SSCAN; }
        !           238:        else {
        !           239:                fseek(stream,(long)sub[i]->ptridx*10L,SEEK_SET);
        !           240:                fread(&sub[i]->ptr,4,1,stream);
        !           241:                fread(&sub[i]->last,4,1,stream);
        !           242:                fread(&ch,2,1,stream);
        !           243:                if(ch&5)        /* Either bit 0 or 2 */
        !           244:                        sub[i]->misc|=SUB_NSCAN;
        !           245:                else
        !           246:                        sub[i]->misc&=~SUB_NSCAN;
        !           247:                if(ch&2)
        !           248:                        sub[i]->misc|=SUB_SSCAN;
        !           249:                else
        !           250:                        sub[i]->misc&=~SUB_SSCAN;
        !           251:                if(ch&0x100)
        !           252:                        sub[i]->misc|=SUB_YSCAN;
        !           253:                else
        !           254:                        sub[i]->misc&=~SUB_YSCAN; }
        !           255:        sub_ptr[i]=sub[i]->ptr;
        !           256:        sub_last[i]=sub[i]->last;
        !           257:     sub_misc[i]=sub[i]->misc; }
        !           258: fclose(stream);
        !           259: bputs(text[LoadedMsgPtrs]);
        !           260: }
        !           261: 
        !           262: /****************************************************************************/
        !           263: /* Writes to DATA\USER\PTRS\xxxx.DAB the msgptr array for the current user     */
        !           264: /* Called from functions main and newuser                                   */
        !           265: /****************************************************************************/
        !           266: void putmsgptrs()
        !           267: {
        !           268:        char    str[256];
        !           269:        ushort  idx,ch;
        !           270:        uint    i,j;
        !           271:        int     file;
        !           272:        ulong   l=0L,length;
        !           273: 
        !           274: if(!useron.number)
        !           275:     return;
        !           276: sprintf(str,"%sUSER\\PTRS\\%4.4u.IXB",data_dir,useron.number);
        !           277: if((file=nopen(str,O_WRONLY|O_CREAT))==-1) {
        !           278:        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT);
        !           279:        return; }
        !           280: length=filelength(file);
        !           281: for(i=0;i<total_subs;i++) {
        !           282:        if(sub[i]->ptr==sub_ptr[i] && sub[i]->last==sub_last[i]
        !           283:                && length>=((long)(sub[i]->ptridx+1)*10)
        !           284:                && ((sub[i]->misc&(SUB_NSCAN|SUB_SSCAN|SUB_YSCAN))
        !           285:                        ==(sub_misc[i]&(SUB_NSCAN|SUB_SSCAN|SUB_YSCAN))))
        !           286:         continue;
        !           287:        while(filelength(file)<(long)(sub[i]->ptridx)*10) {
        !           288:         lseek(file,0L,SEEK_END);
        !           289:                idx=tell(file)/10;
        !           290:                for(j=0;j<total_subs;j++)
        !           291:                        if(sub[j]->ptridx==idx)
        !           292:                                break;
        !           293:         write(file,&l,4);
        !           294:         write(file,&l,4);
        !           295:                ch=0xff;                                        /* default to scan ON for new sub */
        !           296:                if(j<total_subs) {
        !           297:                        if(!(sub[j]->misc&SUB_NSCAN))
        !           298:                                ch&=~5;
        !           299:                        if(!(sub[j]->misc&SUB_SSCAN))
        !           300:                                ch&=~2;
        !           301:                        if(sub[j]->misc&SUB_YSCAN)
        !           302:                                ch|=0x100; }
        !           303:                write(file,&ch,2); }
        !           304:        lseek(file,(long)((long)(sub[i]->ptridx)*10),SEEK_SET);
        !           305:     write(file,&(sub[i]->ptr),4);
        !           306:        write(file,&(sub[i]->last),4);
        !           307:        ch=0xff;
        !           308:        if(!(sub[i]->misc&SUB_NSCAN))
        !           309:                ch&=~5;
        !           310:        if(!(sub[i]->misc&SUB_SSCAN))
        !           311:                ch&=~2;
        !           312:        if(sub[i]->misc&SUB_YSCAN)
        !           313:                ch|=0x100;
        !           314:        write(file,&ch,2); }
        !           315: close(file);
        !           316: if(!flength(str))                              /* Don't leave 0 byte files */
        !           317:        remove(str);
        !           318: }
        !           319: 
        !           320: /****************************************************************************/
        !           321: /* Checks for a duplicate user filed starting at user record offset         */
        !           322: /* 'offset', reading in 'datlen' chars, comparing to 'str' for each user    */
        !           323: /* except 'usernumber' if it is non-zero. Comparison is NOT case sensitive. */
        !           324: /* del is 1 if the search is to included deleted/inactive users 0 otherwise */
        !           325: /* Returns the usernumber of the dupe if found, 0 if not                    */
        !           326: /****************************************************************************/
        !           327: uint userdatdupe(uint usernumber, uint offset, uint datlen, char *dat
        !           328:     , char del)
        !           329: {
        !           330:     char str[256];
        !           331:     int i,file;
        !           332:     long l,length;
        !           333: 
        !           334: truncsp(dat);
        !           335: sprintf(str,"%sUSER\\USER.DAT",data_dir);
        !           336: if((file=nopen(str,O_RDONLY|O_DENYNONE))==-1)
        !           337:     return(0);
        !           338: length=filelength(file);
        !           339: bputs(text[SearchingForDupes]);
        !           340: for(l=0;l<length && online;l+=U_LEN) {
        !           341:        checkline();
        !           342:     if(usernumber && l/U_LEN==usernumber-1)
        !           343:         continue;
        !           344:     lseek(file,l+offset,SEEK_SET);
        !           345:        i=0;
        !           346:        while(i<LOOP_NODEDAB && lock(file,l,U_LEN)==-1) {
        !           347:                if(i>10)
        !           348:                        mswait(55);
        !           349:                i++; }
        !           350: 
        !           351:        if(i>=LOOP_NODEDAB) {
        !           352:                close(file);
        !           353:                errormsg(WHERE,ERR_LOCK,"USER.DAT",l);
        !           354:                return(0); }
        !           355: 
        !           356:     read(file,str,datlen);
        !           357:     for(i=0;i<datlen;i++)
        !           358:         if(str[i]==ETX) break;
        !           359:     str[i]=0;
        !           360:     truncsp(str);
        !           361:     if(!stricmp(str,dat)) {
        !           362:         if(!del) {      /* Don't include deleted users in search */
        !           363:             lseek(file,l+U_MISC,SEEK_SET);
        !           364:             read(file,str,8);
        !           365:             getrec(str,0,8,str);
        !           366:                        if(ahtoul(str)&(DELETED|INACTIVE)) {
        !           367:                                unlock(file,l,U_LEN);
        !           368:                                continue; } }
        !           369:                unlock(file,l,U_LEN);
        !           370:         close(file);
        !           371:         bputs(text[SearchedForDupes]);
        !           372:                return((l/U_LEN)+1); }
        !           373:        else
        !           374:                unlock(file,l,U_LEN); }
        !           375: close(file);
        !           376: bputs(text[SearchedForDupes]);
        !           377: return(0);
        !           378: }
        !           379: 
        !           380: 
        !           381: /****************************************************************************/
        !           382: /* Removes any files in the user transfer index (XFER.IXT) that match the   */
        !           383: /* specifications of dest, or source user, or filename or any combination.  */
        !           384: /****************************************************************************/
        !           385: void rmuserxfers(int fromuser, int destuser, char *fname)
        !           386: {
        !           387:     char str[256],*ixtbuf;
        !           388:     int file;
        !           389:     long l,length;
        !           390: 
        !           391: sprintf(str,"%sXFER.IXT",data_dir);
        !           392: if(!fexist(str))
        !           393:     return;
        !           394: if(!flength(str)) {
        !           395:     remove(str);
        !           396:     return; }
        !           397: if((file=nopen(str,O_RDONLY))==-1) {
        !           398:     errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
        !           399:     return; }
        !           400: length=filelength(file);
        !           401: if((ixtbuf=(char *)MALLOC(length))==NULL) {
        !           402:     close(file);
        !           403:     errormsg(WHERE,ERR_ALLOC,str,length);
        !           404:     return; }
        !           405: if(read(file,ixtbuf,length)!=length) {
        !           406:     close(file);
        !           407:        FREE(ixtbuf);
        !           408:     errormsg(WHERE,ERR_READ,str,length);
        !           409:     return; }
        !           410: close(file);
        !           411: if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) {
        !           412:        FREE(ixtbuf);
        !           413:     errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC);
        !           414:     return; }
        !           415: for(l=0;l<length;l+=24) {
        !           416:     if(fname!=NULL && fname[0]) {               /* fname specified */
        !           417:         if(!strncmp(ixtbuf+l+5,fname,12)) {     /* this is the file */
        !           418:             if(destuser && fromuser) {          /* both dest and from user */
        !           419:                 if(atoi(ixtbuf+l)==destuser && atoi(ixtbuf+l+18)==fromuser)
        !           420:                     continue; }                 /* both match */
        !           421:             else if(fromuser) {                 /* from user */
        !           422:                 if(atoi(ixtbuf+l+18)==fromuser) /* matches */
        !           423:                     continue; }
        !           424:             else if(destuser) {                 /* dest user */
        !           425:                 if(atoi(ixtbuf+l)==destuser)    /* matches */
        !           426:                     continue; }
        !           427:             else continue; } }                  /* no users, so match */
        !           428:     else if(destuser && fromuser) {
        !           429:         if(atoi(ixtbuf+l+18)==fromuser && atoi(ixtbuf+l)==destuser)
        !           430:             continue; }
        !           431:     else if(destuser && atoi(ixtbuf+l)==destuser)
        !           432:         continue;
        !           433:     else if(fromuser && atoi(ixtbuf+l+18)==fromuser)
        !           434:         continue;
        !           435:     write(file,ixtbuf+l,24); }
        !           436: close(file);
        !           437: FREE(ixtbuf);
        !           438: }
        !           439: 

unix.superglobalmegacorp.com

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