|
|
1.1 ! root 1: #line 1 "FILE_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: /* Adds file data in 'f' to DIR#.DAT and DIR#.IXB and updates user */ ! 9: /* info for uploader. Must have .name, .desc and .dir fields filled prior */ ! 10: /* to a call to this function. */ ! 11: /* Returns 1 if file uploaded sucessfully, 0 if not. */ ! 12: /****************************************************************************/ ! 13: char uploadfile(file_t *f) ! 14: { ! 15: uchar path[256],str[256],fname[25],ext[513],desc[513],tmp[128],*p; ! 16: static uchar sbbsfilename[128],sbbsfiledesc[128]; ! 17: int file; ! 18: uint i; ! 19: long length; ! 20: FILE *stream; ! 21: ! 22: f->misc=0; ! 23: curdirnum=f->dir; ! 24: if(findfile(f->dir,f->name)) { ! 25: errormsg(WHERE,ERR_CHK,f->name,f->dir); ! 26: return(0); } ! 27: sprintf(path,"%s%s",f->altpath>0 && f->altpath<=altpaths ! 28: ? altpath[f->altpath-1] ! 29: : dir[f->dir]->path,unpadfname(f->name,fname)); ! 30: if(!fexist(path)) { ! 31: bprintf(text[FileNotReceived],f->name); ! 32: sprintf(str,"Attempted to upload %s to %s %s (Not received)",f->name ! 33: ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname); ! 34: logline("U!",str); ! 35: return(0); } ! 36: strcpy(tmp,f->name); ! 37: truncsp(tmp); ! 38: for(i=0;i<total_ftests;i++) ! 39: if(ftest[i]->ext[0]=='*' || !strcmp(tmp+9,ftest[i]->ext)) { ! 40: if(!chk_ar(ftest[i]->ar,useron)) ! 41: continue; ! 42: attr(LIGHTGRAY); ! 43: bputs(ftest[i]->workstr); ! 44: ! 45: sprintf(sbbsfilename,"SBBSFILENAME=%.12s",unpadfname(f->name,fname)); ! 46: putenv(sbbsfilename); ! 47: sprintf(sbbsfiledesc,"SBBSFILEDESC=%.*s",LEN_FDESC,f->desc); ! 48: putenv(sbbsfiledesc); ! 49: sprintf(str,"%sSBBSFILE.NAM",node_dir); ! 50: if((stream=fopen(str,"w"))!=NULL) { ! 51: fwrite(fname,1,strlen(fname),stream); ! 52: fclose(stream); } ! 53: sprintf(str,"%sSBBSFILE.DES",node_dir); ! 54: if((stream=fopen(str,"w"))!=NULL) { ! 55: fwrite(f->desc,1,strlen(f->desc),stream); ! 56: fclose(stream); } ! 57: if(external(cmdstr(ftest[i]->cmd,path,f->desc,NULL),0)) { /* EX_OUTL */ ! 58: bprintf(text[FileHadErrors],f->name,ftest[i]->ext); ! 59: if(SYSOP) { ! 60: if(!yesno(text[DeleteFileQ])) return(0); } ! 61: remove(path); ! 62: sprintf(str,"Attempted to upload %s to %s %s (%s Errors)",f->name ! 63: ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname,ftest[i]->ext); ! 64: logline("U!",str); ! 65: return(0); } ! 66: else { ! 67: sprintf(str,"%sSBBSFILE.NAM",node_dir); ! 68: if((stream=fopen(str,"r"))!=NULL) { ! 69: if(fgets(str,128,stream)) { ! 70: truncsp(str); ! 71: strupr(str); ! 72: padfname(str,f->name); ! 73: strcpy(tmp,f->name); ! 74: truncsp(tmp); ! 75: sprintf(path,"%s%s",f->altpath>0 && f->altpath<=altpaths ! 76: ? altpath[f->altpath-1] : dir[f->dir]->path ! 77: ,unpadfname(f->name,fname)); } ! 78: fclose(stream); ! 79: } ! 80: sprintf(str,"%sSBBSFILE.DES",node_dir); ! 81: if((stream=fopen(str,"r"))!=NULL) { ! 82: if(fgets(str,128,stream)) { ! 83: truncsp(str); ! 84: sprintf(f->desc,"%.*s",LEN_FDESC,str); } ! 85: fclose(stream); } ! 86: CRLF; } } ! 87: ! 88: if((length=flength(path))<=0L) { ! 89: bprintf(text[FileZeroLength],f->name); ! 90: remove(path); ! 91: sprintf(str,"Attempted to upload %s to %s %s (Zero length)",f->name ! 92: ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname); ! 93: logline("U!",str); ! 94: return(0); } ! 95: if(dir[f->dir]->misc&DIR_DIZ) { ! 96: for(i=0;i<total_fextrs;i++) ! 97: if(!stricmp(fextr[i]->ext,tmp+9) && chk_ar(fextr[i]->ar,useron)) ! 98: break; ! 99: if(i<total_fextrs) { ! 100: sprintf(str,"%sFILE_ID.DIZ",temp_dir); ! 101: remove(str); ! 102: external(cmdstr(fextr[i]->cmd,path,"FILE_ID.DIZ",NULL),EX_OUTL); ! 103: if(!fexist(str)) { ! 104: sprintf(str,"%sDESC.SDI",temp_dir); ! 105: remove(str); ! 106: external(cmdstr(fextr[i]->cmd,path,"DESC.SDI",NULL),EX_OUTL); } ! 107: if((file=nopen(str,O_RDONLY))!=-1) { ! 108: memset(ext,0,513); ! 109: read(file,ext,512); ! 110: for(i=512;i;i--) ! 111: if(ext[i-1]>SP) ! 112: break; ! 113: ext[i]=0; ! 114: if(!f->desc[0]) { ! 115: strcpy(desc,ext); ! 116: strip_exascii(desc); ! 117: strip_ctrl(desc); ! 118: for(i=0;desc[i];i++) ! 119: if(isalnum(desc[i])) ! 120: break; ! 121: sprintf(f->desc,"%.*s",LEN_FDESC,desc+i); } ! 122: close(file); ! 123: remove(str); ! 124: f->misc|=FM_EXTDESC; } } } ! 125: ! 126: logon_ulb+=length; /* Update 'this call' stats */ ! 127: logon_uls++; ! 128: if(dir[f->dir]->misc&DIR_AONLY) /* Forced anonymous */ ! 129: f->misc|=FM_ANON; ! 130: f->cdt=length; ! 131: f->dateuled=time(NULL); ! 132: f->timesdled=0; ! 133: f->datedled=0L; ! 134: f->opencount=0; ! 135: strcpy(f->uler,useron.alias); ! 136: bprintf(text[FileNBytesReceived],f->name,ultoac(length,tmp)); ! 137: if(!f->desc[0]) ! 138: sprintf(f->desc,"%.*s",LEN_FDESC,text[NoDescription]); ! 139: if(!addfiledat(f)) ! 140: return(0); ! 141: ! 142: if(f->misc&FM_EXTDESC) ! 143: putextdesc(f->dir,f->datoffset,ext); ! 144: ! 145: sprintf(str,"Uploaded %s to %s %s",f->name,lib[dir[f->dir]->lib]->sname ! 146: ,dir[f->dir]->sname); ! 147: if(dir[f->dir]->upload_sem[0]) ! 148: if((file=nopen(dir[f->dir]->upload_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) ! 149: close(file); ! 150: logline("U+",str); ! 151: /**************************/ ! 152: /* Update Uploader's Info */ ! 153: /**************************/ ! 154: useron.uls=adjustuserrec(useron.number,U_ULS,5,1); ! 155: useron.ulb=adjustuserrec(useron.number,U_ULB,10,length); ! 156: if(dir[f->dir]->up_pct && dir[f->dir]->misc&DIR_CDTUL) { /* credit for upload */ ! 157: if(dir[f->dir]->misc&DIR_CDTMIN && cur_cps) /* Give min instead of cdt */ ! 158: useron.min=adjustuserrec(useron.number,U_MIN,10 ! 159: ,((ulong)(length*(dir[f->dir]->up_pct/100.0))/cur_cps)/60); ! 160: else ! 161: useron.cdt=adjustuserrec(useron.number,U_CDT,10 ! 162: ,(ulong)(f->cdt*(dir[f->dir]->up_pct/100.0))); } ! 163: return(1); ! 164: } ! 165: ! 166: ! 167: /****************************************************************************/ ! 168: /* Updates downloader, uploader and downloaded file data */ ! 169: /* Must have offset, dir and name fields filled prior to call. */ ! 170: /****************************************************************************/ ! 171: void downloadfile(file_t f) ! 172: { ! 173: char str[256],str2[256],fname[13]; ! 174: int i,file; ! 175: long length,mod; ! 176: ulong l; ! 177: user_t uploader; ! 178: ! 179: getfiledat(&f); /* Get current data - right after download */ ! 180: if((length=f.size)<0L) ! 181: length=0L; ! 182: logon_dlb+=length; /* Update 'this call' stats */ ! 183: logon_dls++; ! 184: bprintf(text[FileNBytesSent],f.name,ultoac(length,tmp)); ! 185: sprintf(str,"Downloaded %s from %s %s",f.name,lib[dir[f.dir]->lib]->sname ! 186: ,dir[f.dir]->sname); ! 187: logline("D-",str); ! 188: /****************************/ ! 189: /* Update Downloader's Info */ ! 190: /****************************/ ! 191: useron.dls=adjustuserrec(useron.number,U_DLS,5,1); ! 192: useron.dlb=adjustuserrec(useron.number,U_DLB,10,length); ! 193: if(!(dir[f.dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D'))) ! 194: subtract_cdt(f.cdt); ! 195: /**************************/ ! 196: /* Update Uploader's Info */ ! 197: /**************************/ ! 198: i=matchuser(f.uler); ! 199: uploader.number=i; ! 200: getuserdat(&uploader); ! 201: if(i && i!=useron.number && uploader.firston<f.dateuled) { ! 202: l=f.cdt; ! 203: if(!(dir[f.dir]->misc&DIR_CDTDL)) /* Don't give credits on d/l */ ! 204: l=0; ! 205: if(dir[f.dir]->misc&DIR_CDTMIN && cur_cps) { /* Give min instead of cdt */ ! 206: mod=((ulong)(l*(dir[f.dir]->dn_pct/100.0))/cur_cps)/60; ! 207: adjustuserrec(i,U_MIN,10,mod); ! 208: sprintf(tmp,"%lu minute",mod); ! 209: sprintf(str,text[DownloadUserMsg] ! 210: ,!strcmp(dir[f.dir]->code,"TEMP") ? temp_file : f.name ! 211: ,!strcmp(dir[f.dir]->code,"TEMP") ? text[Partially] : nulstr ! 212: ,useron.alias,tmp); } ! 213: else { ! 214: mod=(ulong)(l*(dir[f.dir]->dn_pct/100.0)); ! 215: adjustuserrec(i,U_CDT,10,mod); ! 216: ultoac(mod,tmp); ! 217: sprintf(str,text[DownloadUserMsg] ! 218: ,!strcmp(dir[f.dir]->code,"TEMP") ? temp_file : f.name ! 219: ,!strcmp(dir[f.dir]->code,"TEMP") ? text[Partially] : nulstr ! 220: ,useron.alias,tmp); } ! 221: putsmsg(i,str); } ! 222: /*******************/ ! 223: /* Update IXB File */ ! 224: /*******************/ ! 225: f.datedled=time(NULL); ! 226: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); ! 227: if((file=nopen(str,O_RDWR))==-1) { ! 228: errormsg(WHERE,ERR_OPEN,str,O_RDWR); ! 229: return; } ! 230: length=filelength(file); ! 231: if(length%F_IXBSIZE) { ! 232: close(file); ! 233: errormsg(WHERE,ERR_LEN,str,length); ! 234: return; } ! 235: strcpy(fname,f.name); ! 236: for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ ! 237: fname[i]=fname[i+1]; ! 238: for(l=0;l<length;l+=F_IXBSIZE) { ! 239: read(file,str,F_IXBSIZE); /* Look for the filename in the IXB file */ ! 240: str[11]=0; ! 241: if(!strcmp(fname,str)) break; } ! 242: if(l>=length) { ! 243: close(file); ! 244: errormsg(WHERE,ERR_CHK,f.name,0); ! 245: return; } ! 246: lseek(file,l+18,SEEK_SET); ! 247: write(file,&f.datedled,4); /* Write the current time stamp for datedled */ ! 248: close(file); ! 249: /*******************/ ! 250: /* Update DAT File */ ! 251: /*******************/ ! 252: f.timesdled++; ! 253: putfiledat(f); ! 254: /******************************************/ ! 255: /* Update User to User index if necessary */ ! 256: /******************************************/ ! 257: if(f.dir==user_dir) { ! 258: rmuserxfers(0,useron.number,f.name); ! 259: if(!getuserxfers(0,0,f.name)) { /* check if any ixt entries left */ ! 260: sprintf(str,"%s%s",f.altpath>0 && f.altpath<=altpaths ? ! 261: altpath[f.altpath-1] : dir[f.dir]->path,unpadfname(f.name,tmp)); ! 262: remove(str); ! 263: removefiledat(f); } } ! 264: } ! 265: ! 266: /****************************************************************************/ ! 267: /* Removes DAT and IXB entries for the file in the struct 'f' */ ! 268: /****************************************************************************/ ! 269: void removefiledat(file_t f) ! 270: { ! 271: char c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13]; ! 272: int file; ! 273: ulong l,length; ! 274: ! 275: strcpy(fname,f.name); ! 276: for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ ! 277: fname[c]=fname[c+1]; ! 278: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); ! 279: if((file=nopen(str,O_RDONLY))==-1) { ! 280: errormsg(WHERE,ERR_OPEN,str,O_RDONLY); ! 281: return; } ! 282: length=filelength(file); ! 283: if(!length) { ! 284: close(file); ! 285: return; } ! 286: if((ixbbuf=(char *)MALLOC(length))==0) { ! 287: close(file); ! 288: errormsg(WHERE,ERR_ALLOC,str,length); ! 289: return; } ! 290: if(lread(file,ixbbuf,length)!=length) { ! 291: close(file); ! 292: errormsg(WHERE,ERR_READ,str,length); ! 293: FREE((char *)ixbbuf); ! 294: return; } ! 295: close(file); ! 296: if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) { ! 297: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC); ! 298: return; } ! 299: for(l=0;l<length;l+=F_IXBSIZE) { ! 300: for(c=0;c<11;c++) ! 301: ixbname[c]=ixbbuf[l+c]; ! 302: ixbname[c]=0; ! 303: if(strcmp(ixbname,fname)) ! 304: if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) { ! 305: close(file); ! 306: errormsg(WHERE,ERR_WRITE,str,F_IXBSIZE); ! 307: FREE((char *)ixbbuf); ! 308: return; } } ! 309: FREE((char *)ixbbuf); ! 310: close(file); ! 311: sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); ! 312: if((file=nopen(str,O_WRONLY))==-1) { ! 313: errormsg(WHERE,ERR_OPEN,str,O_WRONLY); ! 314: return; } ! 315: lseek(file,f.datoffset,SEEK_SET); ! 316: c=ETX; /* If first char of record is ETX, record is unused */ ! 317: if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */ ! 318: close(file); ! 319: errormsg(WHERE,ERR_WRITE,str,1); ! 320: return; } ! 321: close(file); ! 322: if(f.dir==user_dir) /* remove file from index */ ! 323: rmuserxfers(0,0,f.name); ! 324: ! 325: } ! 326: ! 327: /****************************************************************************/ ! 328: /* Puts filedata into DIR_code.DAT file */ ! 329: /* Called from removefiles */ ! 330: /****************************************************************************/ ! 331: void putfiledat(file_t f) ! 332: { ! 333: char buf[F_LEN+1],str[256]; ! 334: int file; ! 335: long length; ! 336: ! 337: putrec(buf,F_CDT,LEN_FCDT,ultoa(f.cdt,tmp,10)); ! 338: putrec(buf,F_DESC,LEN_FDESC,f.desc); ! 339: putrec(buf,F_DESC+LEN_FDESC,2,crlf); ! 340: putrec(buf,F_ULER,LEN_ALIAS+5,f.uler); ! 341: putrec(buf,F_ULER+LEN_ALIAS+5,2,crlf); ! 342: putrec(buf,F_TIMESDLED,5,itoa(f.timesdled,tmp,10)); ! 343: putrec(buf,F_TIMESDLED+5,2,crlf); ! 344: putrec(buf,F_OPENCOUNT,3,itoa(f.opencount,tmp,10)); ! 345: putrec(buf,F_OPENCOUNT+3,2,crlf); ! 346: buf[F_MISC]=f.misc+SP; ! 347: putrec(buf,F_ALTPATH,2,hexplus(f.altpath,tmp)); ! 348: putrec(buf,F_ALTPATH+2,2,crlf); ! 349: sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); ! 350: if((file=nopen(str,O_WRONLY))==-1) { ! 351: errormsg(WHERE,ERR_OPEN,str,O_WRONLY); ! 352: return; } ! 353: length=filelength(file); ! 354: if(length%F_LEN) { ! 355: close(file); ! 356: errormsg(WHERE,ERR_LEN,str,length); ! 357: return; } ! 358: if(f.datoffset>length) { ! 359: close(file); ! 360: errormsg(WHERE,ERR_LEN,str,length); ! 361: return; } ! 362: lseek(file,f.datoffset,SEEK_SET); ! 363: if(write(file,buf,F_LEN)!=F_LEN) { ! 364: close(file); ! 365: errormsg(WHERE,ERR_WRITE,str,F_LEN); ! 366: return; } ! 367: length=filelength(file); ! 368: close(file); ! 369: if(length%F_LEN) ! 370: errormsg(WHERE,ERR_LEN,str,length); ! 371: } ! 372: ! 373: /****************************************************************************/ ! 374: /* Adds the data for struct filedat to the directory's data base. */ ! 375: /* changes the .datoffset field only */ ! 376: /* returns 1 if added successfully, 0 if not. */ ! 377: /****************************************************************************/ ! 378: char addfiledat(file_t *f) ! 379: { ! 380: uchar str[256],fdat[F_LEN+1],fname[13],idx[3],c,HUGE16 *ixbbuf; ! 381: int i,file; ! 382: ulong length,l; ! 383: time_t uldate; ! 384: ! 385: /************************/ ! 386: /* Add data to DAT File */ ! 387: /************************/ ! 388: sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code); ! 389: if((file=nopen(str,O_RDWR|O_CREAT))==-1) { ! 390: errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT); ! 391: return(0); } ! 392: length=filelength(file); ! 393: if(length==0L) ! 394: l=0L; ! 395: else { ! 396: if(length%F_LEN) { ! 397: close(file); ! 398: errormsg(WHERE,ERR_LEN,str,length); ! 399: return(0); } ! 400: for(l=0;l<length;l+=F_LEN) { /* Find empty slot */ ! 401: lseek(file,l,SEEK_SET); ! 402: read(file,&c,1); ! 403: if(c==ETX) break; } ! 404: if(l/F_LEN>=MAX_FILES || l/F_LEN>=dir[f->dir]->maxfiles) { ! 405: bputs(text[DirFull]); ! 406: close(file); ! 407: sprintf(str,"Directory Full: %s %s" ! 408: ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname); ! 409: logline("U!",str); ! 410: return(0); } } ! 411: putrec(fdat,F_CDT,LEN_FCDT,ultoa(f->cdt,tmp,10)); ! 412: putrec(fdat,F_DESC,LEN_FDESC,f->desc); ! 413: putrec(fdat,F_DESC+LEN_FDESC,2,crlf); ! 414: putrec(fdat,F_ULER,LEN_ALIAS+5,f->uler); ! 415: putrec(fdat,F_ULER+LEN_ALIAS+5,2,crlf); ! 416: putrec(fdat,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10)); ! 417: putrec(fdat,F_TIMESDLED+5,2,crlf); ! 418: putrec(fdat,F_OPENCOUNT,3,itoa(f->opencount,tmp,10)); ! 419: putrec(fdat,F_OPENCOUNT+3,2,crlf); ! 420: fdat[F_MISC]=f->misc+SP; ! 421: putrec(fdat,F_ALTPATH,2,hexplus(f->altpath,tmp)); ! 422: putrec(fdat,F_ALTPATH+2,2,crlf); ! 423: f->datoffset=l; ! 424: idx[0]=l&0xff; /* Get offset within DAT file for IXB file */ ! 425: idx[1]=(l>>8)&0xff; ! 426: idx[2]=(l>>16)&0xff; ! 427: lseek(file,l,SEEK_SET); ! 428: if(write(file,fdat,F_LEN)!=F_LEN) { ! 429: close(file); ! 430: errormsg(WHERE,ERR_WRITE,str,F_LEN); ! 431: return(0); } ! 432: length=filelength(file); ! 433: close(file); ! 434: if(length%F_LEN) ! 435: errormsg(WHERE,ERR_LEN,str,length); ! 436: ! 437: /*******************************************/ ! 438: /* Update last upload date/time stamp file */ ! 439: /*******************************************/ ! 440: sprintf(str,"%s%s.DAB",dir[f->dir]->data_dir,dir[f->dir]->code); ! 441: if((file=nopen(str,O_WRONLY|O_CREAT))==-1) ! 442: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT); ! 443: else { ! 444: now=time(NULL); ! 445: write(file,&now,4); ! 446: close(file); } ! 447: ! 448: /************************/ ! 449: /* Add data to IXB File */ ! 450: /************************/ ! 451: strcpy(fname,f->name); ! 452: for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ ! 453: fname[i]=fname[i+1]; ! 454: sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code); ! 455: if((file=nopen(str,O_RDWR|O_CREAT))==-1) { ! 456: errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT); ! 457: return(0); } ! 458: length=filelength(file); ! 459: if(length) { /* IXB file isn't empty */ ! 460: if(length%F_IXBSIZE) { ! 461: close(file); ! 462: errormsg(WHERE,ERR_LEN,str,length); ! 463: return(0); } ! 464: if((ixbbuf=(char *)MALLOC(length))==NULL) { ! 465: close(file); ! 466: errormsg(WHERE,ERR_ALLOC,str,length); ! 467: return(0); } ! 468: if(lread(file,ixbbuf,length)!=length) { ! 469: close(file); ! 470: errormsg(WHERE,ERR_READ,str,length); ! 471: FREE((char *)ixbbuf); ! 472: return(0); } ! 473: /************************************************/ ! 474: /* Sort by Name or Date, Assending or Decending */ ! 475: /************************************************/ ! 476: if(dir[f->dir]->sort==SORT_NAME_A || dir[f->dir]->sort==SORT_NAME_D) { ! 477: for(l=0;l<length;l+=F_IXBSIZE) { ! 478: for(i=0;i<12 && fname[i]==ixbbuf[l+i];i++); ! 479: if(i==12) { /* file already in directory index */ ! 480: close(file); ! 481: errormsg(WHERE,ERR_CHK,str,0); ! 482: FREE((char *)ixbbuf); ! 483: return(0); } ! 484: if(dir[f->dir]->sort==SORT_NAME_A && fname[i]<ixbbuf[l+i]) ! 485: break; ! 486: if(dir[f->dir]->sort==SORT_NAME_D && fname[i]>ixbbuf[l+i]) ! 487: break; } } ! 488: else { /* sort by date */ ! 489: for(l=0;l<length;l+=F_IXBSIZE) { ! 490: uldate=(ixbbuf[l+14]|((long)ixbbuf[l+15]<<8) ! 491: |((long)ixbbuf[l+16]<<16)|((long)ixbbuf[l+17]<<24)); ! 492: if(dir[f->dir]->sort==SORT_DATE_A && f->dateuled<uldate) ! 493: break; ! 494: if(dir[f->dir]->sort==SORT_DATE_D && f->dateuled>uldate) ! 495: break; } } ! 496: lseek(file,l,SEEK_SET); ! 497: if(write(file,fname,11)!=11) { /* Write filename to IXB file */ ! 498: close(file); ! 499: errormsg(WHERE,ERR_WRITE,str,11); ! 500: FREE((char *)ixbbuf); ! 501: return(0); } ! 502: if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ ! 503: close(file); ! 504: errormsg(WHERE,ERR_WRITE,str,3); ! 505: FREE((char *)ixbbuf); ! 506: return(0); } ! 507: write(file,&f->dateuled,sizeof(time_t)); ! 508: write(file,&f->datedled,4); /* Write 0 for datedled */ ! 509: if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */ ! 510: close(file); ! 511: errormsg(WHERE,ERR_WRITE,str,length-l); ! 512: FREE((char *)ixbbuf); ! 513: return(0); } ! 514: FREE((char *)ixbbuf); } ! 515: else { /* IXB file is empty... No files */ ! 516: if(write(file,fname,11)!=11) { /* Write filename it IXB file */ ! 517: close(file); ! 518: errormsg(WHERE,ERR_WRITE,str,11); ! 519: return(0); } ! 520: if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ ! 521: close(file); ! 522: errormsg(WHERE,ERR_WRITE,str,3); ! 523: return(0); } ! 524: write(file,&f->dateuled,sizeof(time_t)); ! 525: write(file,&f->datedled,4); } ! 526: length=filelength(file); ! 527: close(file); ! 528: if(length%F_IXBSIZE) ! 529: errormsg(WHERE,ERR_LEN,str,length); ! 530: return(1); ! 531: } ! 532: ! 533: /****************************************************************************/ ! 534: /* Update the upload date for the file 'f' */ ! 535: /****************************************************************************/ ! 536: void update_uldate(file_t f) ! 537: { ! 538: char str[256],fname[13]; ! 539: int i,file; ! 540: long l,length; ! 541: ! 542: /*******************/ ! 543: /* Update IXB File */ ! 544: /*******************/ ! 545: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); ! 546: if((file=nopen(str,O_RDWR))==-1) { ! 547: errormsg(WHERE,ERR_OPEN,str,O_RDWR); ! 548: return; } ! 549: length=filelength(file); ! 550: if(length%F_IXBSIZE) { ! 551: close(file); ! 552: errormsg(WHERE,ERR_LEN,str,length); ! 553: return; } ! 554: strcpy(fname,f.name); ! 555: for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ ! 556: fname[i]=fname[i+1]; ! 557: for(l=0;l<length;l+=F_IXBSIZE) { ! 558: read(file,str,F_IXBSIZE); /* Look for the filename in the IXB file */ ! 559: str[11]=0; ! 560: if(!strcmp(fname,str)) break; } ! 561: if(l>=length) { ! 562: close(file); ! 563: errormsg(WHERE,ERR_CHK,f.name,length); ! 564: return; } ! 565: lseek(file,l+14,SEEK_SET); ! 566: write(file,&f.dateuled,4); ! 567: close(file); ! 568: ! 569: /*******************************************/ ! 570: /* Update last upload date/time stamp file */ ! 571: /*******************************************/ ! 572: sprintf(str,"%s%s.DAB",dir[f.dir]->data_dir,dir[f.dir]->code); ! 573: if((file=nopen(str,O_WRONLY|O_CREAT))==-1) ! 574: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT); ! 575: else { ! 576: write(file,&f.dateuled,4); ! 577: close(file); } ! 578: ! 579: } ! 580:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.