|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.