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

1.1     ! root        1: #line 1 "USERREC.C"
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: #include "sbbs.h"
        !             6: 
        !             7: /****************************************************************************/
        !             8: /* Fills 'str' with record for usernumber starting at start for length bytes*/
        !             9: /* Called from function ???                                                                                                    */
        !            10: /****************************************************************************/
        !            11: void getuserrec(int usernumber,int start, char length, char *str)
        !            12: {
        !            13:        char c,path[256];
        !            14:        int i,file;
        !            15: 
        !            16: if(!usernumber) {
        !            17:        errormsg(WHERE,ERR_CHK,"user number",0);
        !            18:        return; }
        !            19: sprintf(path,"%sUSER\\USER.DAT",data_dir);
        !            20: if((file=nopen(path,O_RDONLY|O_DENYNONE))==-1) {
        !            21:        errormsg(WHERE,ERR_OPEN,path,O_RDONLY);
        !            22:        return; }
        !            23: if(usernumber<1
        !            24:        || filelength(file)<(long)((long)(usernumber-1L)*U_LEN)+(long)start) {
        !            25:        close(file);
        !            26:        errormsg(WHERE,ERR_CHK,"user number",usernumber);
        !            27:        return; }
        !            28: lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET);
        !            29: 
        !            30: i=0;
        !            31: while(i<LOOP_NODEDAB
        !            32:        && lock(file,(long)((long)(usernumber-1)*U_LEN)+start,length)==-1) {
        !            33:        if(i>10)
        !            34:                mswait(55);
        !            35:        i++; }
        !            36: 
        !            37: if(i>=LOOP_NODEDAB) {
        !            38:        close(file);
        !            39:        errormsg(WHERE,ERR_LOCK,"USER.DAT",usernumber);
        !            40:     return; }
        !            41: 
        !            42: if(read(file,str,length)!=length) {
        !            43:        unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length);
        !            44:        close(file);
        !            45:        errormsg(WHERE,ERR_READ,"USER.DAT",length);
        !            46:        return; }
        !            47: 
        !            48: unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length);
        !            49: close(file);
        !            50: for(c=0;c<length;c++)
        !            51:        if(str[c]==ETX || str[c]==CR) break;
        !            52: str[c]=0;
        !            53: }
        !            54: 
        !            55: /****************************************************************************/
        !            56: /* Places into USER.DAT at the offset for usernumber+start for length bytes */
        !            57: /* Called from various locations                                                                                       */
        !            58: /****************************************************************************/
        !            59: void putuserrec(int usernumber,int start, char length, char *str)
        !            60: {
        !            61:        char c,str2[256];
        !            62:        int file,i;
        !            63:        node_t node;
        !            64: 
        !            65: if(usernumber<1) {
        !            66:        errormsg(WHERE,ERR_CHK,"user number",usernumber);
        !            67:        return; }
        !            68: sprintf(str2,"%sUSER\\USER.DAT",data_dir);
        !            69: if((file=nopen(str2,O_WRONLY|O_DENYNONE))==-1) {
        !            70:        errormsg(WHERE,ERR_OPEN,str2,O_WRONLY);
        !            71:        return; }
        !            72: strcpy(str2,str);
        !            73: if(strlen(str2)<length) {
        !            74:        for(c=strlen(str2);c<length;c++)
        !            75:                str2[c]=ETX;
        !            76:        str2[c]=0; }
        !            77: lseek(file,(long)((long)((long)((long)usernumber-1)*U_LEN)+start),SEEK_SET);
        !            78: 
        !            79: i=0;
        !            80: while(i<LOOP_NODEDAB
        !            81:        && lock(file,(long)((long)(usernumber-1)*U_LEN)+start,length)==-1) {
        !            82:        if(i>10)
        !            83:                mswait(55);
        !            84:        i++; }
        !            85: 
        !            86: if(i>=LOOP_NODEDAB) {
        !            87:        close(file);
        !            88:        errormsg(WHERE,ERR_LOCK,"USER.DAT",usernumber);
        !            89:     return; }
        !            90: 
        !            91: write(file,str2,length);
        !            92: unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length);
        !            93: close(file);
        !            94: for(i=1;i<=sys_nodes;i++) {    /* instant user data update */
        !            95:        if(i==node_num)
        !            96:                continue;
        !            97:        getnodedat(i,&node,0);
        !            98:        if(node.useron==usernumber && (node.status==NODE_INUSE
        !            99:                || node.status==NODE_QUIET)) {
        !           100:                getnodedat(i,&node,1);
        !           101:                node.misc|=NODE_UDAT;
        !           102:                putnodedat(i,node);
        !           103:                break; } }
        !           104: }
        !           105: 
        !           106: /****************************************************************************/
        !           107: /* Updates user 'usernumber's record (numeric string) by adding 'adj' to it */
        !           108: /* returns the new value.                                                                                                      */
        !           109: /****************************************************************************/
        !           110: ulong adjustuserrec(int usernumber,int start, char length, long adj)
        !           111: {
        !           112:        char str[256],c,path[256];
        !           113:        int i,file;
        !           114:        ulong val;
        !           115:        node_t node;
        !           116: 
        !           117: if(usernumber<1) {
        !           118:        errormsg(WHERE,ERR_CHK,"user number",usernumber);
        !           119:        return(0UL); }
        !           120: sprintf(path,"%sUSER\\USER.DAT",data_dir);
        !           121: if((file=nopen(path,O_RDWR|O_DENYNONE))==-1) {
        !           122:        errormsg(WHERE,ERR_OPEN,path,O_RDWR);
        !           123:        return(0UL); }
        !           124: lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET);
        !           125: 
        !           126: i=0;
        !           127: while(i<LOOP_NODEDAB
        !           128:        && lock(file,(long)((long)(usernumber-1)*U_LEN)+start,length)==-1) {
        !           129:        if(i>10)
        !           130:                mswait(55);
        !           131:        i++; }
        !           132: 
        !           133: if(i>=LOOP_NODEDAB) {
        !           134:        close(file);
        !           135:        errormsg(WHERE,ERR_LOCK,"USER.DAT",usernumber);
        !           136:        return(0); }
        !           137: 
        !           138: if(read(file,str,length)!=length) {
        !           139:        unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length);
        !           140:        close(file);
        !           141:        errormsg(WHERE,ERR_READ,path,length);
        !           142:        return(0UL); }
        !           143: for(c=0;c<length;c++)
        !           144:        if(str[c]==ETX || str[c]==CR) break;
        !           145: str[c]=0;
        !           146: val=atol(str);
        !           147: if(adj<0L && val<-adj)         /* don't go negative */
        !           148:        val=0UL;
        !           149: else val+=adj;
        !           150: lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET);
        !           151: putrec(str,0,length,ultoa(val,tmp,10));
        !           152: if(write(file,str,length)!=length) {
        !           153:        unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length);
        !           154:        close(file);
        !           155:        errormsg(WHERE,ERR_WRITE,path,length);
        !           156:        return(val); }
        !           157: unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length);
        !           158: close(file);
        !           159: for(i=1;i<=sys_nodes;i++) { /* instant user data update */
        !           160:        if(i==node_num)
        !           161:                continue;
        !           162:        getnodedat(i,&node,0);
        !           163:        if(node.useron==usernumber && (node.status==NODE_INUSE
        !           164:                || node.status==NODE_QUIET)) {
        !           165:                getnodedat(i,&node,1);
        !           166:                node.misc|=NODE_UDAT;
        !           167:                putnodedat(i,node);
        !           168:         break; } }
        !           169: return(val);
        !           170: }
        !           171: 
        !           172: /****************************************************************************/
        !           173: /* Subtract credits from the current user online, accounting for the new    */
        !           174: /* "free credits" field.                                                    */
        !           175: /****************************************************************************/
        !           176: void subtract_cdt(long amt)
        !           177: {
        !           178:     long mod;
        !           179: 
        !           180: if(!amt)
        !           181:     return;
        !           182: if(useron.freecdt) {
        !           183:     if(amt>useron.freecdt) {      /* subtract both credits and */
        !           184:         mod=amt-useron.freecdt;   /* free credits */
        !           185:         putuserrec(useron.number,U_FREECDT,10,"0");
        !           186:         useron.freecdt=0;
        !           187:         useron.cdt=adjustuserrec(useron.number,U_CDT,10,-mod); }
        !           188:     else {                          /* subtract just free credits */
        !           189:         useron.freecdt-=amt;
        !           190:         putuserrec(useron.number,U_FREECDT,10
        !           191:             ,ultoa(useron.freecdt,tmp,10)); } }
        !           192: else    /* no free credits */
        !           193:     useron.cdt=adjustuserrec(useron.number,U_CDT,10,-amt);
        !           194: }

unix.superglobalmegacorp.com

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