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