Annotation of sbbs/sbbs2/userrec.c, revision 1.1.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.