|
|
1.1 ! root 1: /* ADDFILES.C */ ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: /* Program to add files to a Synchronet file database */ ! 6: ! 7: #include "sbbs.h" ! 8: ! 9: #define ADDFILES_VER "2.23" ! 10: ! 11: char tmp[256]; ! 12: char *crlf="\r\n"; ! 13: ! 14: #ifdef __TURBOC__ ! 15: unsigned _stklen=16000; ! 16: #else ! 17: unsigned _stacksize=16000; ! 18: #endif ! 19: ! 20: int cur_altpath=0; ! 21: ! 22: long files=0,removed=0,mode=0; ! 23: ! 24: #define DEL_LIST (1L<<0) ! 25: #define NO_EXTEND (1L<<1) ! 26: #define FILE_DATE (1L<<2) ! 27: #define TODAYS_DATE (1L<<3) ! 28: #define FILE_ID (1L<<4) ! 29: #define NO_UPDATE (1L<<5) ! 30: #define NO_NEWDATE (1L<<6) ! 31: #define ASCII_ONLY (1L<<7) ! 32: #define UL_STATS (1L<<8) ! 33: #define ULDATE_ONLY (1L<<9) ! 34: #define KEEP_DESC (1L<<10) ! 35: #define AUTO_ADD (1L<<11) ! 36: #define SEARCH_DIR (1L<<12) ! 37: #define SYNC_LIST (1L<<13) ! 38: #define KEEP_SPACE (1L<<14) ! 39: ! 40: #ifndef __FLAT__ ! 41: /****************************************************************************/ ! 42: /* This function reads files that are potentially larger than 32k. */ ! 43: /* Up to one megabyte of data can be read with each call. */ ! 44: /****************************************************************************/ ! 45: long lread(int file, char HUGE16 *buf,long bytes) ! 46: { ! 47: long count; ! 48: ! 49: for(count=bytes;count>32767;count-=32767,buf+=32767) ! 50: if(read(file,(char *)buf,32767)!=32767) ! 51: return(-1L); ! 52: if(read(file,(char *)buf,(int)count)!=count) ! 53: return(-1L); ! 54: return(bytes); ! 55: } ! 56: ! 57: /****************************************************************************/ ! 58: /* This function writes files that are potentially larger than 32767 bytes */ ! 59: /* Up to one megabytes of data can be written with each call. */ ! 60: /****************************************************************************/ ! 61: long lwrite(int file, char HUGE16 *buf, long bytes) ! 62: { ! 63: ! 64: long count; ! 65: ! 66: for(count=bytes;count>32767;count-=32767,buf+=32767) ! 67: if(write(file,(char *)buf,32767)!=32767) ! 68: return(-1L); ! 69: if(write(file,(char *)buf,(int)count)!=count) ! 70: return(-1L); ! 71: return(bytes); ! 72: } ! 73: #endif ! 74: ! 75: long lputs(char FAR16 *str) ! 76: { ! 77: char tmp[256]; ! 78: int i,j,k; ! 79: ! 80: j=strlen(str); ! 81: for(i=k=0;i<j;i++) /* remove CRs */ ! 82: if(str[i]==CR && str[i+1]==LF) ! 83: continue; ! 84: else ! 85: tmp[k++]=str[i]; ! 86: tmp[k]=0; ! 87: return(fputs(tmp,stdout)); ! 88: } ! 89: ! 90: /****************************************************************************/ ! 91: /* Returns string for 2 digit hex+ numbers up to 575 */ ! 92: /****************************************************************************/ ! 93: char *hexplus(uint num, char *str) ! 94: { ! 95: sprintf(str,"%03x",num); ! 96: str[0]=num/0x100 ? 'f'+(num/0x10)-0xf : str[1]; ! 97: str[1]=str[2]; ! 98: str[2]=0; ! 99: return(str); ! 100: } ! 101: ! 102: ! 103: /****************************************************************************/ ! 104: /* Places into 'strout', 'strin' starting at 'start' and ending at */ ! 105: /* 'start'+'length' */ ! 106: /****************************************************************************/ ! 107: void putrec(char *strout,int start,int length,char *strin) ! 108: { ! 109: int i=0,j; ! 110: ! 111: j=strlen(strin); ! 112: while(i<j && i<length) ! 113: strout[start++]=strin[i++]; ! 114: while(i++<length) ! 115: strout[start++]=ETX; ! 116: } ! 117: ! 118: /****************************************************************************/ ! 119: /* Performs printf() through local assembly routines */ ! 120: /* Called from everywhere */ ! 121: /****************************************************************************/ ! 122: int lprintf(char *fmat, ...) ! 123: { ! 124: va_list argptr; ! 125: char sbuf[256]; ! 126: int chcount; ! 127: ! 128: va_start(argptr,fmat); ! 129: chcount=vsprintf(sbuf,fmat,argptr); ! 130: va_end(argptr); ! 131: lputs(sbuf); ! 132: return(chcount); ! 133: } ! 134: ! 135: /****************************************************************************/ ! 136: /* Truncates white-space chars off end of 'str' and terminates at first tab */ ! 137: /****************************************************************************/ ! 138: void truncsp(char *str) ! 139: { ! 140: int c; ! 141: ! 142: str[strcspn(str,"\t")]=0; ! 143: c=strlen(str); ! 144: while(c && (uchar)str[c-1]<=SP) c--; ! 145: str[c]=0; ! 146: } ! 147: ! 148: /****************************************************************************/ ! 149: /* Puts a backslash on path strings */ ! 150: /****************************************************************************/ ! 151: void backslash(char *str) ! 152: { ! 153: int i; ! 154: ! 155: i=strlen(str); ! 156: if(i && str[i-1]!='\\') { ! 157: str[i]='\\'; str[i+1]=0; } ! 158: } ! 159: ! 160: /****************************************************************************/ ! 161: /* Checks the disk drive for the existence of a file. Returns 1 if it */ ! 162: /* exists, 0 if it doesn't. */ ! 163: /****************************************************************************/ ! 164: char fexist(char *filespec) ! 165: { ! 166: struct find_t f; ! 167: uint i; ! 168: ! 169: i=_dos_findfirst(filespec,_A_NORMAL,&f); ! 170: #ifdef __WATCOMC__ ! 171: _dos_findclose(&f); ! 172: #endif ! 173: if(!i) ! 174: return(1); ! 175: return(0); ! 176: } ! 177: ! 178: /****************************************************************************/ ! 179: /* Returns the time/date of the file in 'filespec' in time_t (unix) format */ ! 180: /****************************************************************************/ ! 181: long fdate(char *filespec) ! 182: { ! 183: int file; ! 184: ushort fd,ft; ! 185: struct tm t; ! 186: ! 187: if((file=nopen(filespec,O_RDONLY))==-1) ! 188: return(0); ! 189: _dos_getftime(file,&fd,&ft); ! 190: close(file); ! 191: memset(&t,0,sizeof(t)); ! 192: t.tm_year=((fd&0xfe00)>>9)+80; ! 193: t.tm_mon=((fd&0x01e0)>>5)-1; ! 194: t.tm_mday=fd&0x1f; ! 195: t.tm_hour=(ft&0xf800)>>11; ! 196: t.tm_min=(ft&0x07e0)>>5; ! 197: t.tm_sec=(ft&0x001f)<<1; ! 198: return(mktime(&t)); ! 199: } ! 200: ! 201: /*****************************************************************************/ ! 202: /* Returns command line generated from instr with %c replacments */ ! 203: /*****************************************************************************/ ! 204: char *cmdstr(char *instr, char *fpath, char *fspec, char *outstr) ! 205: { ! 206: static char cmd[128]; ! 207: char str[256]; ! 208: int i,j,len; ! 209: ! 210: len=strlen(instr); ! 211: for(i=j=0;i<len && j<128;i++) { ! 212: if(instr[i]=='%') { ! 213: i++; ! 214: cmd[j]=0; ! 215: switch(toupper(instr[i])) { ! 216: case 'F': /* File path */ ! 217: strcat(cmd,fpath); ! 218: break; ! 219: case 'G': /* Temp directory */ ! 220: if(temp_dir[0]!='\\' && temp_dir[1]!=':') ! 221: strcat(cmd,node_dir); ! 222: strcat(cmd,temp_dir); ! 223: break; ! 224: case 'N': /* Node Directory (same as SBBSNODE environment var) */ ! 225: strcat(cmd,node_dir); ! 226: break; ! 227: case 'S': /* File Spec */ ! 228: strcat(cmd,fspec); ! 229: break; ! 230: case '!': /* EXEC Directory */ ! 231: if(exec_dir[0]!='\\' && exec_dir[1]!=':') ! 232: strcat(cmd,node_dir); ! 233: strcat(cmd,exec_dir); ! 234: break; ! 235: case '#': /* Node number (same as SBBSNNUM environment var) */ ! 236: sprintf(str,"%d",node_num); ! 237: strcat(cmd,str); ! 238: break; ! 239: case '%': /* %% for percent sign */ ! 240: strcat(cmd,"%"); ! 241: break; ! 242: default: /* unknown specification */ ! 243: break; } ! 244: j=strlen(cmd); } ! 245: else ! 246: cmd[j++]=instr[i]; } ! 247: cmd[j]=0; ! 248: ! 249: return(cmd); ! 250: } ! 251: ! 252: ! 253: /****************************************************************************/ ! 254: /* Converts unix time format (long - time_t) into a char str MM/DD/YY */ ! 255: /****************************************************************************/ ! 256: char *unixtodstr(time_t unix, char *str) ! 257: { ! 258: struct tm *t; ! 259: ! 260: if(!unix) ! 261: strcpy(str,"00/00/00"); ! 262: else { ! 263: t=gmtime(&unix); ! 264: sprintf(str,"%02u/%02u/%02u",t->tm_mon+1,t->tm_mday ! 265: ,t->tm_year); } ! 266: return(str); ! 267: } ! 268: ! 269: /****************************************************************************/ ! 270: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ ! 271: /* number of times if the attempted file is already open or denying access */ ! 272: /* for some other reason. All files are opened in BINARY mode. */ ! 273: /****************************************************************************/ ! 274: int nopen(char *str, int access) ! 275: { ! 276: char logstr[256]; ! 277: int file,share,count=0; ! 278: ! 279: if(access==O_RDONLY) share=SH_DENYWR; ! 280: else share=SH_DENYRW; ! 281: while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) ! 282: && errno==EACCES && count++<LOOP_NOPEN); ! 283: if(file==-1 && errno==EACCES) ! 284: lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); ! 285: return(file); ! 286: } ! 287: ! 288: /****************************************************************************/ ! 289: /* This function performs an nopen, but returns a file stream with a buffer */ ! 290: /* allocated. */ ! 291: /****************************************************************************/ ! 292: FILE *fnopen(int *file, char *str, int access) ! 293: { ! 294: char mode[128]; ! 295: FILE *stream; ! 296: ! 297: if(access&O_WRONLY) access|=O_RDWR; /* fdopen can't open WRONLY */ ! 298: ! 299: if(((*file)=nopen(str,access))==-1) ! 300: return(NULL); ! 301: ! 302: if(access&O_APPEND) { ! 303: if(access&(O_RDONLY|O_RDWR)) ! 304: strcpy(mode,"a+"); ! 305: else ! 306: strcpy(mode,"a"); } ! 307: else { ! 308: if(access&(O_WRONLY|O_RDWR)) ! 309: strcpy(mode,"r+"); ! 310: else ! 311: strcpy(mode,"r"); } ! 312: stream=fdopen((*file),mode); ! 313: if(stream==NULL) { ! 314: close(*file); ! 315: return(NULL); } ! 316: setvbuf(stream,NULL,_IOFBF,16*1024); ! 317: return(stream); ! 318: } ! 319: ! 320: void allocfail(uint size) ! 321: { ! 322: lprintf("\7Error allocating %u bytes of memory.\r\n",size); ! 323: bail(1); ! 324: } ! 325: ! 326: void bail(int code) ! 327: { ! 328: exit(code); ! 329: } ! 330: ! 331: /****************************************************************************/ ! 332: /* Returns the length of the file in 'filespec' */ ! 333: /****************************************************************************/ ! 334: long flength(char *filespec) ! 335: { ! 336: struct find_t f; ! 337: uint i; ! 338: ! 339: i=_dos_findfirst(filespec,_A_NORMAL,&f); ! 340: #ifdef __WATCOMC__ ! 341: _dos_findclose(&f); ! 342: #endif ! 343: if(!i) ! 344: return(f.size); ! 345: return(-1L); ! 346: } ! 347: ! 348: /****************************************************************************/ ! 349: /* Turns FILE.EXT into FILE .EXT */ ! 350: /* Called from upload */ ! 351: /****************************************************************************/ ! 352: char *padfname(char *filename, char *str) ! 353: { ! 354: char c,d; ! 355: ! 356: for(c=0;c<8;c++) ! 357: if(filename[c]=='.' || !filename[c]) break; ! 358: else str[c]=filename[c]; ! 359: d=c; ! 360: if(filename[c]=='.') c++; ! 361: while(d<8) ! 362: str[d++]=SP; ! 363: str[d++]='.'; ! 364: while(d<12) ! 365: if(!filename[c]) break; ! 366: else str[d++]=filename[c++]; ! 367: while(d<12) ! 368: str[d++]=SP; ! 369: str[d]=0; ! 370: return(str); ! 371: } ! 372: ! 373: /****************************************************************************/ ! 374: /* Turns FILE .EXT into FILE.EXT */ ! 375: /****************************************************************************/ ! 376: char *unpadfname(char *filename, char *str) ! 377: { ! 378: char c,d; ! 379: ! 380: for(c=0,d=0;c<strlen(filename);c++) ! 381: if(filename[c]!=SP) str[d++]=filename[c]; ! 382: str[d]=0; ! 383: return(str); ! 384: } ! 385: ! 386: /****************************************************************************/ ! 387: /* Checks directory data file for 'filename' (must be padded). If found, */ ! 388: /* it returns the 1, else returns 0. */ ! 389: /* Called from upload and bulkupload */ ! 390: /****************************************************************************/ ! 391: char findfile(uint dirnum, char *filename) ! 392: { ! 393: char str[256],c,fname[128],HUGE16 *ixbbuf; ! 394: int file; ! 395: ulong length,l; ! 396: ! 397: strcpy(fname,filename); ! 398: for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ ! 399: fname[c]=fname[c+1]; ! 400: sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); ! 401: if((file=nopen(str,O_RDONLY))==-1) return(0); ! 402: length=filelength(file); ! 403: if(!length) { ! 404: close(file); ! 405: return(0); } ! 406: if((ixbbuf=(char *)MALLOC(length))==NULL) { ! 407: close(file); ! 408: printf("ERR_ALLOC %s %lu\n",str,length); ! 409: return(0); } ! 410: if(lread(file,ixbbuf,length)!=length) { ! 411: close(file); ! 412: FREE((char *)ixbbuf); ! 413: return(0); } ! 414: close(file); ! 415: for(l=0;l<length;l+=F_IXBSIZE) { ! 416: for(c=0;c<11;c++) ! 417: if(fname[c]!=ixbbuf[l+c]) break; ! 418: if(c==11) break; } ! 419: FREE((char *)ixbbuf); ! 420: if(l<length) ! 421: return(1); ! 422: return(0); ! 423: } ! 424: ! 425: ! 426: /****************************************************************************/ ! 427: /* Adds the data for struct filedat to the directory's data base. */ ! 428: /* changes the .datoffset field only */ ! 429: /****************************************************************************/ ! 430: char addfiledat(file_t *f) ! 431: { ! 432: char str[256],fdat[F_LEN+1],fname[128],idx[128],c,HUGE16 *ixbbuf; ! 433: int i,file; ! 434: ulong length,l,uldate; ! 435: ! 436: /************************/ ! 437: /* Add data to DAT File */ ! 438: /************************/ ! 439: sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code); ! 440: if((file=nopen(str,O_RDWR|O_CREAT))==-1) { ! 441: printf("ERROR opening %s\n",str); ! 442: return(0); } ! 443: length=filelength(file); ! 444: if(length==0L) ! 445: l=0L; ! 446: else { ! 447: if(length%F_LEN) { ! 448: close(file); ! 449: printf("ERR_LEN %s %lu\n",str,length); ! 450: return(0); } ! 451: for(l=0;l<length;l+=F_LEN) { /* Find empty slot */ ! 452: lseek(file,l,SEEK_SET); ! 453: read(file,&c,1); ! 454: if(c==ETX) break; } } ! 455: putrec(fdat,F_CDT,7,ultoa(f->cdt,tmp,10)); ! 456: putrec(fdat,F_CDT+7,2,crlf); ! 457: putrec(fdat,F_DESC,LEN_FDESC,f->desc); ! 458: putrec(fdat,F_DESC+LEN_FDESC,2,crlf); ! 459: putrec(fdat,F_ULER,LEN_ALIAS+5,f->uler); ! 460: putrec(fdat,F_ULER+LEN_ALIAS+5,2,crlf); ! 461: putrec(fdat,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10)); ! 462: putrec(fdat,F_TIMESDLED+5,2,crlf); ! 463: putrec(fdat,F_OPENCOUNT,3,itoa(f->opencount,tmp,10)); ! 464: putrec(fdat,F_OPENCOUNT+3,2,crlf); ! 465: fdat[F_MISC]=f->misc+SP; ! 466: putrec(fdat,F_ALTPATH,2,hexplus(f->altpath,tmp)); ! 467: putrec(fdat,F_ALTPATH+2,2,crlf); ! 468: f->datoffset=l; ! 469: idx[0]=l&0xff; /* Get offset within DAT file for IXB file */ ! 470: idx[1]=(l>>8)&0xff; ! 471: idx[2]=(l>>16)&0xff; ! 472: lseek(file,l,SEEK_SET); ! 473: if(write(file,fdat,F_LEN)!=F_LEN) { ! 474: close(file); ! 475: return(0); } ! 476: length=filelength(file); ! 477: close(file); ! 478: if(length%F_LEN) ! 479: printf("ERR_LEN %s %lu\n",str,length); ! 480: ! 481: /*******************************************/ ! 482: /* Update last upload date/time stamp file */ ! 483: /*******************************************/ ! 484: sprintf(str,"%s%s.DAB",dir[f->dir]->data_dir,dir[f->dir]->code); ! 485: if((file=nopen(str,O_WRONLY|O_CREAT))==-1) ! 486: printf("ERR_OPEN %s\r\n",str); ! 487: else { ! 488: uldate=time(NULL); ! 489: write(file,&uldate,4); ! 490: close(file); } ! 491: ! 492: /************************/ ! 493: /* Add data to IXB File */ ! 494: /************************/ ! 495: strcpy(fname,f->name); ! 496: for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ ! 497: fname[i]=fname[i+1]; ! 498: sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code); ! 499: if((file=nopen(str,O_RDWR|O_CREAT))==-1) { ! 500: printf("ERR_OPEN %s\n",str); ! 501: return(0); } ! 502: length=filelength(file); ! 503: if(length) { /* IXB file isn't empty */ ! 504: if(length%F_IXBSIZE) { ! 505: close(file); ! 506: printf("ERR_LEN %s %lu\n",str,length); ! 507: return(0); } ! 508: if((ixbbuf=(char *)MALLOC(length))==NULL) { ! 509: close(file); ! 510: printf("ERR_ALLOC %s %lu\n",str,length); ! 511: return(0); } ! 512: if(lread(file,ixbbuf,length)!=length) { ! 513: close(file); ! 514: printf("ERR_READ %s %lu\n",str,length); ! 515: FREE((char *)ixbbuf); ! 516: return(0); } ! 517: /************************************************/ ! 518: /* Sort by Name or Date, Assending or Decending */ ! 519: /************************************************/ ! 520: if(dir[f->dir]->sort==SORT_NAME_A || dir[f->dir]->sort==SORT_NAME_D) { ! 521: for(l=0;l<length;l+=F_IXBSIZE) { ! 522: for(i=0;i<12 && fname[i]==ixbbuf[l+i];i++); ! 523: if(i==12) { /* file already in directory index */ ! 524: close(file); ! 525: printf("ERR_CHK %s\n",fname); ! 526: FREE((char *)ixbbuf); ! 527: return(0); } ! 528: if(dir[f->dir]->sort==SORT_NAME_A && fname[i]<ixbbuf[l+i]) ! 529: break; ! 530: if(dir[f->dir]->sort==SORT_NAME_D && fname[i]>ixbbuf[l+i]) ! 531: break; } } ! 532: else { /* sort by date */ ! 533: for(l=0;l<length;l+=F_IXBSIZE) { ! 534: uldate=(ixbbuf[l+15]|((long)ixbbuf[l+16]<<8) ! 535: |((long)ixbbuf[l+17]<<16)|((long)ixbbuf[l+18]<<24)); ! 536: if(dir[f->dir]->sort==SORT_DATE_A && f->dateuled>uldate) ! 537: break; ! 538: if(dir[f->dir]->sort==SORT_DATE_D && f->dateuled<uldate) ! 539: break; } } ! 540: lseek(file,l,SEEK_SET); ! 541: if(write(file,fname,11)!=11) { /* Write filename to IXB file */ ! 542: close(file); ! 543: FREE((char *)ixbbuf); ! 544: return(0); } ! 545: if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ ! 546: close(file); ! 547: FREE((char *)ixbbuf); ! 548: return(0); } ! 549: write(file,&f->dateuled,sizeof(time_t)); ! 550: write(file,&f->datedled,4); /* Write 0 for datedled */ ! 551: if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */ ! 552: close(file); ! 553: FREE((char *)ixbbuf); ! 554: return(0); } ! 555: FREE((char *)ixbbuf); } ! 556: else { /* IXB file is empty... No files */ ! 557: if(write(file,fname,11)!=11) { /* Write filename it IXB file */ ! 558: close(file); ! 559: return(0); } ! 560: if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ ! 561: close(file); ! 562: return(0); } ! 563: write(file,&f->dateuled,sizeof(time_t)); ! 564: write(file,&f->datedled,4); } ! 565: length=filelength(file); ! 566: close(file); ! 567: if(length%F_IXBSIZE) ! 568: printf("ERR_LEN %s %lu\n",str,length); ! 569: return(1); ! 570: } ! 571: ! 572: void putextdesc(uint dirnum, ulong datoffset, char *ext) ! 573: { ! 574: char str[256],nulbuf[512]; ! 575: int file; ! 576: ! 577: sprintf(str,"%s%s.EXB",dir[dirnum]->data_dir,dir[dirnum]->code); ! 578: if((file=nopen(str,O_WRONLY|O_CREAT))==-1) ! 579: return; ! 580: lseek(file,0L,SEEK_END); ! 581: while(filelength(file)<(datoffset/F_LEN)*512L) ! 582: write(file,nulbuf,512); ! 583: lseek(file,(datoffset/F_LEN)*512L,SEEK_SET); ! 584: write(file,ext,512); ! 585: close(file); ! 586: } ! 587: ! 588: /****************************************************************************/ ! 589: /* Gets file data from dircode.IXB file */ ! 590: /* Need fields .name and .dir filled. */ ! 591: /* only fills .offset, .dateuled, and .datedled */ ! 592: /****************************************************************************/ ! 593: void getfileixb(file_t *f) ! 594: { ! 595: uchar HUGE16 *ixbbuf,str[256],fname[128]; ! 596: int file; ! 597: ulong l,length; ! 598: ! 599: sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code); ! 600: if((file=nopen(str,O_RDONLY))==-1) { ! 601: printf("ERR_OPEN %s\n",str); ! 602: return; } ! 603: length=filelength(file); ! 604: if(length%F_IXBSIZE) { ! 605: close(file); ! 606: printf("ERR_LEN %s\n"); ! 607: return; } ! 608: if((ixbbuf=(uchar HUGE16 *)MALLOC(length))==NULL) { ! 609: close(file); ! 610: printf("ERR_ALLOC %s\n",str); ! 611: return; } ! 612: if(lread(file,ixbbuf,length)!=length) { ! 613: close(file); ! 614: FREE((char *)ixbbuf); ! 615: printf("ERR_READ %s\n",str); ! 616: return; } ! 617: close(file); ! 618: strcpy(fname,f->name); ! 619: for(l=8;l<12;l++) /* Turn FILENAME.EXT into FILENAMEEXT */ ! 620: fname[l]=fname[l+1]; ! 621: for(l=0;l<length;l+=F_IXBSIZE) { ! 622: sprintf(str,"%11.11s",ixbbuf+l); ! 623: if(!strcmp(str,fname)) ! 624: break; } ! 625: if(l>=length) { ! 626: printf("getfileixb: ERR_CHK %s\n",fname); ! 627: FREE((char *)ixbbuf); ! 628: return; } ! 629: l+=11; ! 630: f->datoffset=ixbbuf[l]|((long)ixbbuf[l+1]<<8)|((long)ixbbuf[l+2]<<16); ! 631: f->dateuled=ixbbuf[l+3]|((long)ixbbuf[l+4]<<8) ! 632: |((long)ixbbuf[l+5]<<16)|((long)ixbbuf[l+6]<<24); ! 633: f->datedled=ixbbuf[l+7]|((long)ixbbuf[l+8]<<8) ! 634: |((long)ixbbuf[l+9]<<16)|((long)ixbbuf[l+10]<<24); ! 635: FREE((char *)ixbbuf); ! 636: } ! 637: ! 638: /****************************************************************************/ ! 639: /* Puts filedata into DIR_code.DAT file */ ! 640: /* Called from removefiles */ ! 641: /****************************************************************************/ ! 642: void putfiledat(file_t f) ! 643: { ! 644: char buf[F_LEN+1],str[256]; ! 645: int file; ! 646: long length; ! 647: ! 648: putrec(buf,F_CDT,7,ultoa(f.cdt,tmp,10)); ! 649: putrec(buf,F_CDT+7,2,crlf); ! 650: putrec(buf,F_DESC,LEN_FDESC,f.desc); ! 651: putrec(buf,F_DESC+LEN_FDESC,2,crlf); ! 652: putrec(buf,F_ULER,LEN_ALIAS+5,f.uler); ! 653: putrec(buf,F_ULER+LEN_ALIAS+5,2,crlf); ! 654: putrec(buf,F_TIMESDLED,5,itoa(f.timesdled,tmp,10)); ! 655: putrec(buf,F_TIMESDLED+5,2,crlf); ! 656: putrec(buf,F_OPENCOUNT,3,itoa(f.opencount,tmp,10)); ! 657: putrec(buf,F_OPENCOUNT+3,2,crlf); ! 658: buf[F_MISC]=f.misc+SP; ! 659: putrec(buf,F_ALTPATH,2,hexplus(f.altpath,tmp)); ! 660: putrec(buf,F_ALTPATH+2,2,crlf); ! 661: sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); ! 662: if((file=nopen(str,O_WRONLY))==-1) { ! 663: printf("ERR_OPEN %s\n",str); ! 664: return; } ! 665: length=filelength(file); ! 666: if(length%F_LEN) { ! 667: close(file); ! 668: printf("ERR_LEN %s\n",str); ! 669: return; } ! 670: if(f.datoffset>length) { ! 671: close(file); ! 672: printf("ERR_LEN %s\n",str); ! 673: return; } ! 674: lseek(file,f.datoffset,SEEK_SET); ! 675: if(write(file,buf,F_LEN)!=F_LEN) { ! 676: close(file); ! 677: printf("ERR_WRITE %s\n",str); ! 678: return; } ! 679: length=filelength(file); ! 680: close(file); ! 681: if(length%F_LEN) ! 682: printf("ERR_LEN %s\n",str); ! 683: } ! 684: ! 685: /****************************************************************************/ ! 686: /* Update the upload date for the file 'f' */ ! 687: /****************************************************************************/ ! 688: void update_uldate(file_t f) ! 689: { ! 690: char str[256],fname[128]; ! 691: int i,file; ! 692: long l,length; ! 693: ! 694: /*******************/ ! 695: /* Update IXB File */ ! 696: /*******************/ ! 697: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); ! 698: if((file=nopen(str,O_RDWR))==-1) { ! 699: printf("ERR_OPEN %s\n",str); ! 700: return; } ! 701: length=filelength(file); ! 702: if(length%F_IXBSIZE) { ! 703: close(file); ! 704: printf("ERR_LEN %s\n",str); ! 705: return; } ! 706: strcpy(fname,f.name); ! 707: for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ ! 708: fname[i]=fname[i+1]; ! 709: for(l=0;l<length;l+=F_IXBSIZE) { ! 710: read(file,str,F_IXBSIZE); /* Look for the filename in the IXB file */ ! 711: str[11]=0; ! 712: if(!strcmp(fname,str)) break; } ! 713: if(l>=length) { ! 714: close(file); ! 715: printf("ERR_CHK %s\n",f.name); ! 716: return; } ! 717: lseek(file,l+14,SEEK_SET); ! 718: write(file,&f.dateuled,4); /* Write the current time stamp for datedled */ ! 719: close(file); ! 720: ! 721: /*******************************************/ ! 722: /* Update last upload date/time stamp file */ ! 723: /*******************************************/ ! 724: sprintf(str,"%s%s.DAB",dir[f.dir]->data_dir,dir[f.dir]->code); ! 725: if((file=nopen(str,O_WRONLY|O_CREAT))==-1) ! 726: printf("ERR_OPEN %s\r\n",str); ! 727: else { ! 728: write(file,&f.dateuled,4); ! 729: close(file); } ! 730: ! 731: } ! 732: ! 733: ! 734: void strip_ctrl(char *str) ! 735: { ! 736: char tmp[1024]; ! 737: int i,j,k; ! 738: ! 739: k=strlen(str); ! 740: for(i=j=0;i<k;i++) ! 741: if(j && str[i]==SP && tmp[j-1]==SP && (mode&KEEP_SPACE)) ! 742: tmp[j++]=str[i]; ! 743: else if(j && str[i]<=SP && tmp[j-1]==SP) ! 744: continue; ! 745: else if(i && !isalnum(str[i]) && str[i]==str[i-1]) ! 746: continue; ! 747: else if((uchar)str[i]>=SP) ! 748: tmp[j++]=str[i]; ! 749: else if(str[i]==TAB || (str[i]==CR && str[i+1]==LF)) ! 750: tmp[j++]=SP; ! 751: tmp[j]=0; ! 752: strcpy(str,tmp); ! 753: } ! 754: ! 755: ! 756: void strip_exascii(char *str) ! 757: { ! 758: char tmp[1024]; ! 759: int i,j,k; ! 760: ! 761: k=strlen(str); ! 762: for(i=j=0;i<k;i++) ! 763: if(!(str[i]&0x80)) ! 764: tmp[j++]=str[i]; ! 765: tmp[j]=0; ! 766: strcpy(str,tmp); ! 767: } ! 768: ! 769: /****************************************************************************/ ! 770: /* Updates dstst.dab file */ ! 771: /****************************************************************************/ ! 772: void updatestats(ulong size) ! 773: { ! 774: char str[256]; ! 775: int i,file; ! 776: ulong l; ! 777: ! 778: sprintf(str,"%sDSTS.DAB",ctrl_dir); ! 779: if((file=nopen(str,O_RDWR))==-1) { ! 780: printf("ERR_OPEN %s\n",str); ! 781: return; } ! 782: lseek(file,20L,SEEK_SET); /* Skip timestamp, logons and logons today */ ! 783: read(file,&l,4); /* Uploads today */ ! 784: l++; ! 785: lseek(file,-4L,SEEK_CUR); ! 786: write(file,&l,4); ! 787: read(file,&l,4); /* Upload bytes today */ ! 788: l+=size; ! 789: lseek(file,-4L,SEEK_CUR); ! 790: write(file,&l,4); ! 791: close(file); ! 792: } ! 793: ! 794: void addlist(char *inpath, file_t f, char dskip, char sskip) ! 795: { ! 796: uchar str[256],fname[256],listpath[256],filepath[256] ! 797: ,curline[256],nextline[256],*p,exist,ext[1024],tmpext[513]; ! 798: int i,file; ! 799: long l; ! 800: FILE *stream; ! 801: struct find_t ff; ! 802: ! 803: if(mode&SEARCH_DIR) { ! 804: strcpy(str,cur_altpath ? altpath[cur_altpath-1] : dir[f.dir]->path); ! 805: if(str[0]=='.') { ! 806: sprintf(tmp,"%s%s",node_dir,str); ! 807: strcpy(str,tmp); } ! 808: strcat(str,"*.*"); ! 809: printf("Searching %s\n\n",str); ! 810: for(i=_dos_findfirst(str,0,&ff);!i;i=_dos_findnext(&ff)) { ! 811: strupr(ff.name); ! 812: sprintf(filepath,"%s%s",cur_altpath ? altpath[cur_altpath-1] ! 813: : dir[f.dir]->path,ff.name); ! 814: if(filepath[0]=='.') { /* relative path */ ! 815: sprintf(tmp,"%s%s",node_dir,filepath); ! 816: strcpy(filepath,tmp); } ! 817: f.misc=0; ! 818: f.desc[0]=0; ! 819: f.cdt=flength(filepath); ! 820: padfname(ff.name,f.name); ! 821: printf("%s %10lu %s\n" ! 822: ,f.name,f.cdt,unixtodstr(fdate(filepath),str)); ! 823: exist=findfile(f.dir,f.name); ! 824: if(exist) { ! 825: if(mode&NO_UPDATE) ! 826: continue; ! 827: getfileixb(&f); ! 828: if(mode&ULDATE_ONLY) { ! 829: f.dateuled=time(NULL); ! 830: update_uldate(f); ! 831: continue; } } ! 832: ! 833: if(mode&FILE_DATE) { /* get the file date and put into desc */ ! 834: unixtodstr(fdate(filepath),f.desc); ! 835: strcat(f.desc," "); } ! 836: ! 837: if(mode&TODAYS_DATE) { /* put today's date in desc */ ! 838: unixtodstr(time(NULL),f.desc); ! 839: strcat(f.desc," "); } ! 840: ! 841: if(mode&FILE_ID) { ! 842: for(i=0;i<total_fextrs;i++) ! 843: if(!stricmp(fextr[i]->ext,f.name+9)) ! 844: break; ! 845: if(i<total_fextrs) { ! 846: sprintf(tmp,"%sFILE_ID.DIZ",temp_dir); ! 847: remove(tmp); ! 848: system(cmdstr(fextr[i]->cmd,filepath,"FILE_ID.DIZ",NULL)); ! 849: if(!fexist(tmp)) { ! 850: sprintf(tmp,"%sDESC.SDI",temp_dir); ! 851: remove(tmp); ! 852: system(cmdstr(fextr[i]->cmd,filepath,"DESC.SDI",NULL)); } ! 853: if((file=nopen(tmp,O_RDONLY))!=-1) { ! 854: memset(ext,0,513); ! 855: read(file,ext,512); ! 856: for(i=512;i;i--) ! 857: if(ext[i-1]>SP) ! 858: break; ! 859: ext[i]=0; ! 860: if(mode&ASCII_ONLY) ! 861: strip_exascii(ext); ! 862: if(!(mode&KEEP_DESC)) { ! 863: sprintf(tmpext,"%.256s",ext); ! 864: strip_ctrl(tmpext); ! 865: for(i=0;tmpext[i];i++) ! 866: if(isalpha(tmpext[i])) ! 867: break; ! 868: sprintf(f.desc,"%.*s",LEN_FDESC,tmpext+i); ! 869: for(i=0;f.desc[i]>=SP && i<LEN_FDESC;i++) ! 870: ; ! 871: f.desc[i]=0; } ! 872: close(file); ! 873: f.misc|=FM_EXTDESC; } } } ! 874: ! 875: f.dateuled=time(NULL); ! 876: f.altpath=cur_altpath; ! 877: strip_ctrl(f.desc); ! 878: if(mode&ASCII_ONLY) ! 879: strip_exascii(f.desc); ! 880: if(exist) { ! 881: putfiledat(f); ! 882: if(!(mode&NO_NEWDATE)) ! 883: update_uldate(f); } ! 884: else ! 885: addfiledat(&f); ! 886: if(f.misc&FM_EXTDESC) { ! 887: truncsp(ext); ! 888: putextdesc(f.dir,f.datoffset,ext); } ! 889: ! 890: if(mode&UL_STATS) ! 891: updatestats(f.cdt); ! 892: files++; } ! 893: #ifdef __WATCOMC__ ! 894: _dos_findclose(&ff); ! 895: #endif ! 896: return; } ! 897: ! 898: ! 899: strcpy(listpath,inpath); ! 900: if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) { ! 901: sprintf(listpath,"%s%s",cur_altpath ? altpath[cur_altpath-1] ! 902: : dir[f.dir]->path,inpath); ! 903: if(listpath[0]=='.') { /* relative path */ ! 904: sprintf(str,"%s%s",node_dir,listpath); ! 905: strcpy(listpath,str); } ! 906: if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) { ! 907: printf("Can't open: %s\n" ! 908: " or: %s\n",inpath,listpath); ! 909: return; } } ! 910: ! 911: printf("Adding %s to %s %s\n\n" ! 912: ,listpath,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname); ! 913: ! 914: fgets(nextline,255,stream); ! 915: while(!feof(stream) && !ferror(stream)) { ! 916: f.misc=0; ! 917: f.desc[0]=0; ! 918: strcpy(curline,nextline); ! 919: nextline[0]=0; ! 920: fgets(nextline,255,stream); ! 921: truncsp(curline); ! 922: if(curline[0]<=SP || (uchar)curline[0]>=0x7e) ! 923: continue; ! 924: printf("%s\n",curline); ! 925: strcpy(fname,curline); ! 926: ! 927: p=strchr(fname,'.'); ! 928: if(!p || p==fname || p>fname+8) /* no dot or invalid dot location */ ! 929: continue; ! 930: p=strchr(p,SP); ! 931: if(p) *p=0; ! 932: else /* no space after filename? */ ! 933: continue; ! 934: strupr(fname); ! 935: strcpy(fname,unpadfname(fname,tmp)); ! 936: ! 937: padfname(fname,f.name); ! 938: if(strcspn(f.name,"\\/|<>+[]:=\";,")!=strlen(f.name)) ! 939: continue; ! 940: ! 941: for(i=0;i<12;i++) ! 942: if(f.name[i]<SP || (uchar)f.name[i]>0x7e) ! 943: break; ! 944: ! 945: if(i<12) /* Ctrl chars or EX-ASCII in filename? */ ! 946: continue; ! 947: exist=findfile(f.dir,f.name); ! 948: if(exist) { ! 949: if(mode&NO_UPDATE) ! 950: continue; ! 951: getfileixb(&f); ! 952: if(mode&ULDATE_ONLY) { ! 953: f.dateuled=time(NULL); ! 954: update_uldate(f); ! 955: continue; } } ! 956: ! 957: sprintf(filepath,"%s%s",cur_altpath ? altpath[cur_altpath-1] ! 958: : dir[f.dir]->path,fname); ! 959: if(filepath[0]=='.') { /* relative path */ ! 960: sprintf(tmp,"%s%s",node_dir,filepath); ! 961: strcpy(filepath,tmp); } ! 962: ! 963: if(mode&FILE_DATE) { /* get the file date and put into desc */ ! 964: l=fdate(filepath); ! 965: unixtodstr(l,f.desc); ! 966: strcat(f.desc," "); } ! 967: ! 968: if(mode&TODAYS_DATE) { /* put today's date in desc */ ! 969: l=time(NULL); ! 970: unixtodstr(l,f.desc); ! 971: strcat(f.desc," "); } ! 972: ! 973: if(dskip && strlen(curline)>=dskip) p=curline+dskip; ! 974: else { ! 975: p++; ! 976: while(*p==SP) p++; } ! 977: sprintf(tmp,"%.*s",LEN_FDESC-strlen(f.desc),p); ! 978: strcat(f.desc,tmp); ! 979: ! 980: if(nextline[0]==SP || strlen(p)>LEN_FDESC) { /* ext desc */ ! 981: if(!(mode&NO_EXTEND)) { ! 982: memset(ext,0,513); ! 983: f.misc|=FM_EXTDESC; ! 984: sprintf(ext,"%s\r\n",p); } ! 985: ! 986: if(nextline[0]==SP) { ! 987: strcpy(str,nextline); /* tack on to end of desc */ ! 988: p=str+dskip; ! 989: i=LEN_FDESC-strlen(f.desc); ! 990: if(i>1) { ! 991: p[i-1]=0; ! 992: truncsp(p); ! 993: if(p[0]) { ! 994: strcat(f.desc," "); ! 995: strcat(f.desc,p); } } } ! 996: ! 997: while(!feof(stream) && !ferror(stream) && strlen(ext)<512) { ! 998: if(nextline[0]!=SP) ! 999: break; ! 1000: truncsp(nextline); ! 1001: printf("%s\n",nextline); ! 1002: if(!(mode&NO_EXTEND)) { ! 1003: f.misc|=FM_EXTDESC; ! 1004: p=nextline+dskip; ! 1005: while(*p==SP) p++; ! 1006: strcat(ext,p); ! 1007: strcat(ext,"\r\n"); } ! 1008: nextline[0]=0; ! 1009: fgets(nextline,255,stream); } } ! 1010: ! 1011: ! 1012: if(sskip) l=atol(fname+sskip); ! 1013: else { ! 1014: l=flength(filepath); ! 1015: if(l<1L) { ! 1016: printf("%s not found.\n",filepath); ! 1017: continue; } } ! 1018: ! 1019: if(mode&FILE_ID) { ! 1020: for(i=0;i<total_fextrs;i++) ! 1021: if(!stricmp(fextr[i]->ext,f.name+9)) ! 1022: break; ! 1023: if(i<total_fextrs) { ! 1024: sprintf(tmp,"%sFILE_ID.DIZ",temp_dir); ! 1025: remove(tmp); ! 1026: system(cmdstr(fextr[i]->cmd,filepath,"FILE_ID.DIZ",NULL)); ! 1027: if(!fexist(tmp)) { ! 1028: sprintf(tmp,"%sDESC.SDI",temp_dir); ! 1029: remove(tmp); ! 1030: system(cmdstr(fextr[i]->cmd,filepath,"DESC.SDI",NULL)); } ! 1031: if((file=nopen(tmp,O_RDONLY))!=-1) { ! 1032: memset(ext,0,513); ! 1033: read(file,ext,512); ! 1034: for(i=512;i;i--) ! 1035: if(ext[i-1]>SP) ! 1036: break; ! 1037: ext[i]=0; ! 1038: if(mode&ASCII_ONLY) ! 1039: strip_exascii(ext); ! 1040: if(!(mode&KEEP_DESC)) { ! 1041: sprintf(tmpext,"%.256s",ext); ! 1042: strip_ctrl(tmpext); ! 1043: for(i=0;tmpext[i];i++) ! 1044: if(isalpha(tmpext[i])) ! 1045: break; ! 1046: sprintf(f.desc,"%.*s",LEN_FDESC,tmpext+i); ! 1047: for(i=0;f.desc[i]>=SP && i<LEN_FDESC;i++) ! 1048: ; ! 1049: f.desc[i]=0; } ! 1050: close(file); ! 1051: f.misc|=FM_EXTDESC; } } } ! 1052: ! 1053: f.cdt=l; ! 1054: f.dateuled=time(NULL); ! 1055: f.altpath=cur_altpath; ! 1056: strip_ctrl(f.desc); ! 1057: if(mode&ASCII_ONLY) ! 1058: strip_exascii(f.desc); ! 1059: if(exist) { ! 1060: putfiledat(f); ! 1061: if(!(mode&NO_NEWDATE)) ! 1062: update_uldate(f); } ! 1063: else ! 1064: addfiledat(&f); ! 1065: if(f.misc&FM_EXTDESC) { ! 1066: truncsp(ext); ! 1067: putextdesc(f.dir,f.datoffset,ext); } ! 1068: ! 1069: if(mode&UL_STATS) ! 1070: updatestats(l); ! 1071: files++; } ! 1072: fclose(stream); ! 1073: if(mode&DEL_LIST && !(mode&SYNC_LIST)) { ! 1074: printf("\nDeleting %s\n",listpath); ! 1075: remove(listpath); } ! 1076: ! 1077: } ! 1078: ! 1079: /***********************/ ! 1080: /* Hex-plus to integer */ ! 1081: /***********************/ ! 1082: uint hptoi(char *str) ! 1083: { ! 1084: char tmp[128]; ! 1085: uint i; ! 1086: ! 1087: if(!str[1] || toupper(str[0])<='F') ! 1088: return(strtol(str,0,16)); ! 1089: strcpy(tmp,str); ! 1090: tmp[0]='F'; ! 1091: i=strtol(tmp,0,16)+((toupper(str[0])-'F')*0x10); ! 1092: return(i); ! 1093: } ! 1094: ! 1095: /****************************************************************************/ ! 1096: /* Places into 'strout' CR or ETX terminated string starting at */ ! 1097: /* 'start' and ending at 'start'+'length' or terminator from 'strin' */ ! 1098: /****************************************************************************/ ! 1099: void getrec(char *strin,int start,int length,char *strout) ! 1100: { ! 1101: int i=0,stop; ! 1102: ! 1103: stop=start+length; ! 1104: while(start<stop) { ! 1105: if(strin[start]==ETX) ! 1106: break; ! 1107: strout[i++]=strin[start++]; } ! 1108: strout[i]=0; ! 1109: } ! 1110: ! 1111: ! 1112: /****************************************************************************/ ! 1113: /* Gets filedata from dircode.DAT file */ ! 1114: /* Need fields .name ,.dir and .offset to get other info */ ! 1115: /* Does not fill .dateuled or .datedled fields. */ ! 1116: /****************************************************************************/ ! 1117: void getfiledat(file_t *f) ! 1118: { ! 1119: char buf[F_LEN+1],str[256]; ! 1120: int file; ! 1121: long length; ! 1122: ! 1123: sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code); ! 1124: if((file=nopen(str,O_RDONLY))==-1) { ! 1125: printf("ERR_OPEN %s\n",str); ! 1126: return; } ! 1127: length=filelength(file); ! 1128: if(f->datoffset>length) { ! 1129: close(file); ! 1130: printf("ERR_LEN %s %lu\n",str,length); ! 1131: return; } ! 1132: if(length%F_LEN) { ! 1133: close(file); ! 1134: printf("ERR_LEN %s %lu\n",str,length); ! 1135: return; } ! 1136: lseek(file,f->datoffset,SEEK_SET); ! 1137: if(read(file,buf,F_LEN)!=F_LEN) { ! 1138: close(file); ! 1139: printf("ERR_READ %s %lu\n",str,F_LEN); ! 1140: return; } ! 1141: close(file); ! 1142: getrec(buf,F_ALTPATH,2,str); ! 1143: f->altpath=hptoi(str); ! 1144: getrec(buf,F_CDT,7,str); ! 1145: f->cdt=atol(str); ! 1146: f->timetodl=0; ! 1147: ! 1148: getrec(buf,F_DESC,LEN_FDESC,f->desc); ! 1149: getrec(buf,F_ULER,LEN_ALIAS,f->uler); ! 1150: getrec(buf,F_TIMESDLED,5,str); ! 1151: f->timesdled=atoi(str); ! 1152: getrec(buf,F_OPENCOUNT,3,str); ! 1153: f->opencount=atoi(str); ! 1154: if(buf[F_MISC]!=ETX) ! 1155: f->misc=buf[F_MISC]-SP; ! 1156: else ! 1157: f->misc=0; ! 1158: } ! 1159: ! 1160: /****************************************************************************/ ! 1161: /* Removes any files in the user transfer index (XFER.IXT) that match the */ ! 1162: /* specifications of dest, or source user, or filename or any combination. */ ! 1163: /****************************************************************************/ ! 1164: void rmuserxfers(int fromuser, int destuser, char *fname) ! 1165: { ! 1166: char str[256],*ixtbuf; ! 1167: int file; ! 1168: long l,length; ! 1169: ! 1170: sprintf(str,"%sXFER.IXT",data_dir); ! 1171: if(!fexist(str)) ! 1172: return; ! 1173: if(!flength(str)) { ! 1174: remove(str); ! 1175: return; } ! 1176: if((file=nopen(str,O_RDONLY))==-1) { ! 1177: printf("ERR_OPEN %s\n",str); ! 1178: return; } ! 1179: length=filelength(file); ! 1180: if((ixtbuf=(char *)MALLOC(length))==NULL) { ! 1181: close(file); ! 1182: printf("ERR_ALLOC %s\n",str,length); ! 1183: return; } ! 1184: if(read(file,ixtbuf,length)!=length) { ! 1185: close(file); ! 1186: FREE(ixtbuf); ! 1187: printf("ERR_READ %s %lu\n",str,length); ! 1188: return; } ! 1189: close(file); ! 1190: if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) { ! 1191: FREE(ixtbuf); ! 1192: printf("ERR_OPEN %s\n",str); ! 1193: return; } ! 1194: for(l=0;l<length;l+=24) { ! 1195: if(fname!=NULL && fname[0]) { /* fname specified */ ! 1196: if(!strncmp(ixtbuf+l+5,fname,12)) { /* this is the file */ ! 1197: if(destuser && fromuser) { /* both dest and from user */ ! 1198: if(atoi(ixtbuf+l)==destuser && atoi(ixtbuf+l+18)==fromuser) ! 1199: continue; } /* both match */ ! 1200: else if(fromuser) { /* from user */ ! 1201: if(atoi(ixtbuf+l+18)==fromuser) /* matches */ ! 1202: continue; } ! 1203: else if(destuser) { /* dest user */ ! 1204: if(atoi(ixtbuf+l)==destuser) /* matches */ ! 1205: continue; } ! 1206: else continue; } } /* no users, so match */ ! 1207: else if(destuser && fromuser) { ! 1208: if(atoi(ixtbuf+l+18)==fromuser && atoi(ixtbuf+l)==destuser) ! 1209: continue; } ! 1210: else if(destuser && atoi(ixtbuf+l)==destuser) ! 1211: continue; ! 1212: else if(fromuser && atoi(ixtbuf+l+18)==fromuser) ! 1213: continue; ! 1214: write(file,ixtbuf+l,24); } ! 1215: close(file); ! 1216: FREE(ixtbuf); ! 1217: } ! 1218: ! 1219: ! 1220: ! 1221: /****************************************************************************/ ! 1222: /* Removes DAT and IXB entries for the file in the struct 'f' */ ! 1223: /****************************************************************************/ ! 1224: void removefiledat(file_t f) ! 1225: { ! 1226: char c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13]; ! 1227: int file; ! 1228: ulong l,length; ! 1229: ! 1230: strcpy(fname,f.name); ! 1231: for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ ! 1232: fname[c]=fname[c+1]; ! 1233: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); ! 1234: if((file=nopen(str,O_RDONLY))==-1) { ! 1235: printf("ERR_OPEN %s\n",str); ! 1236: return; } ! 1237: length=filelength(file); ! 1238: if(!length) { ! 1239: close(file); ! 1240: return; } ! 1241: if((ixbbuf=(char *)MALLOC(length))==0) { ! 1242: close(file); ! 1243: printf("ERR_ALLOC %s %lu\n",str,length); ! 1244: return; } ! 1245: if(lread(file,ixbbuf,length)!=length) { ! 1246: close(file); ! 1247: printf("ERR_READ %s %lu\n",str,length); ! 1248: FREE((char *)ixbbuf); ! 1249: return; } ! 1250: close(file); ! 1251: if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) { ! 1252: printf("ERR_OPEN %s\n",str); ! 1253: return; } ! 1254: for(l=0;l<length;l+=F_IXBSIZE) { ! 1255: for(c=0;c<11;c++) ! 1256: ixbname[c]=ixbbuf[l+c]; ! 1257: ixbname[c]=0; ! 1258: if(strcmp(ixbname,fname)) ! 1259: if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) { ! 1260: close(file); ! 1261: printf("ERR_WRITE %s %lu\n",str,F_IXBSIZE); ! 1262: FREE((char *)ixbbuf); ! 1263: return; } } ! 1264: FREE((char *)ixbbuf); ! 1265: close(file); ! 1266: sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); ! 1267: if((file=nopen(str,O_WRONLY))==-1) { ! 1268: printf("ERR_OPEN %s\n",str); ! 1269: return; } ! 1270: lseek(file,f.datoffset,SEEK_SET); ! 1271: c=ETX; /* If first char of record is ETX, record is unused */ ! 1272: if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */ ! 1273: close(file); ! 1274: printf("ERR_WRITE %s 1",str); ! 1275: return; } ! 1276: close(file); ! 1277: if(f.dir==user_dir) /* remove file from index */ ! 1278: rmuserxfers(0,0,f.name); ! 1279: ! 1280: } ! 1281: ! 1282: ! 1283: void synclist(char *inpath, int dirnum) ! 1284: { ! 1285: uchar str[1024],fname[256],listpath[256], HUGE16 *ixbbuf,*p; ! 1286: int i,file,found; ! 1287: long l,m,length; ! 1288: FILE *stream; ! 1289: file_t f; ! 1290: ! 1291: sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); ! 1292: if((file=nopen(str,O_RDONLY))==-1) { ! 1293: printf("ERR_OPEN %s\n",str); ! 1294: return; } ! 1295: length=filelength(file); ! 1296: if(length%F_IXBSIZE) { ! 1297: close(file); ! 1298: printf("ERR_LEN %s\n"); ! 1299: return; } ! 1300: if((ixbbuf=(uchar HUGE16 *)MALLOC(length))==NULL) { ! 1301: close(file); ! 1302: printf("ERR_ALLOC %s\n",str); ! 1303: return; } ! 1304: if(lread(file,ixbbuf,length)!=length) { ! 1305: close(file); ! 1306: FREE((char *)ixbbuf); ! 1307: printf("ERR_READ %s\n",str); ! 1308: return; } ! 1309: close(file); ! 1310: ! 1311: strcpy(listpath,inpath); ! 1312: if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) { ! 1313: sprintf(listpath,"%s%s",cur_altpath ? altpath[cur_altpath-1] ! 1314: : dir[dirnum]->path,inpath); ! 1315: if(listpath[0]=='.') { /* relative path */ ! 1316: sprintf(str,"%s%s",node_dir,listpath); ! 1317: strcpy(listpath,str); } ! 1318: if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) { ! 1319: printf("Can't open: %s\n" ! 1320: " or: %s\n",inpath,listpath); ! 1321: return; } } ! 1322: ! 1323: printf("\nSynchronizing %s with %s %s\n\n" ! 1324: ,listpath,lib[dir[dirnum]->lib]->sname,dir[dirnum]->sname); ! 1325: ! 1326: for(l=0;l<length;l+=F_IXBSIZE) { ! 1327: m=l; ! 1328: for(i=0;i<12 && l<length;i++) ! 1329: if(i==8) ! 1330: str[i]='.'; ! 1331: else ! 1332: str[i]=ixbbuf[m++]; /* Turns FILENAMEEXT into FILENAME.EXT */ ! 1333: str[i]=0; ! 1334: unpadfname(str,fname); ! 1335: rewind(stream); ! 1336: found=0; ! 1337: while(!found) { ! 1338: if(!fgets(str,1000,stream)) ! 1339: break; ! 1340: truncsp(str); ! 1341: p=strchr(str,SP); ! 1342: if(p) *p=0; ! 1343: if(!stricmp(str,fname)) ! 1344: found=1; } ! 1345: if(found) ! 1346: continue; ! 1347: padfname(fname,f.name); ! 1348: printf("%s not found in list - ",f.name); ! 1349: f.dir=dirnum; ! 1350: f.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16); ! 1351: getfiledat(&f); ! 1352: if(f.opencount) { ! 1353: printf("currently OPEN by %u users\n",f.opencount); ! 1354: continue; } ! 1355: removefiledat(f); ! 1356: sprintf(str,"%s%s" ! 1357: ,f.altpath>0 && f.altpath<=altpaths ? altpath[f.altpath-1] ! 1358: : dir[f.dir]->path,fname); ! 1359: if(str[0]=='.') { ! 1360: sprintf(tmp,"%s%s",node_dir,str); ! 1361: strcpy(str,tmp); } ! 1362: if(remove(str)) ! 1363: printf("Error removing %s\n",str); ! 1364: removed++; ! 1365: printf("Removed from database\n"); } ! 1366: ! 1367: if(mode&DEL_LIST) { ! 1368: printf("\nDeleting %s\n",listpath); ! 1369: remove(listpath); } ! 1370: } ! 1371: ! 1372: char *usage="\nusage: addfiles code [.alt_path] [/opts] [\"*user\"] +list " ! 1373: "[desc_off] [size_off]" ! 1374: "\n or: addfiles code [.alt_path] [/opts] [\"*user\"] file " ! 1375: "\"description\"\n" ! 1376: "\navailable opts:" ! 1377: "\n a import ASCII only (no extended ASCII)" ! 1378: "\n b synchronize database with file list (use with caution)" ! 1379: "\n c do not remove extra spaces from file description" ! 1380: "\n d delete list after import" ! 1381: "\n e do not import extended descriptions" ! 1382: "\n f include file date in descriptions" ! 1383: "\n t include today's date in descriptions" ! 1384: "\n i include added files in upload statistics" ! 1385: "\n n do not update information for existing files" ! 1386: "\n o update upload date only for existing files" ! 1387: "\n u do not update upload date for existing files" ! 1388: "\n z check for and import FILE_ID.DIZ and DESC.SDI" ! 1389: "\n k keep original short description (not DIZ)" ! 1390: "\n s search directory for files (no file list)" ! 1391: "\n" ! 1392: "\nAuto-ADD: use * in place of code for Auto-ADD of FILES.BBS" ! 1393: "\n use *filename to Auto-ADD a different filename" ! 1394: "\n" ! 1395: ; ! 1396: ! 1397: /*********************/ ! 1398: /* Entry point (duh) */ ! 1399: /*********************/ ! 1400: int main(int argc, char **argv) ! 1401: { ! 1402: uchar str[256],str2[256],*p,exist,listgiven=0,namegiven=0,ext[513] ! 1403: ,auto_name[13]="FILES.BBS"; ! 1404: int i,j,k,file; ! 1405: long l; ! 1406: read_cfg_text_t txt; ! 1407: file_t f; ! 1408: ! 1409: putenv("TZ=UCT0"); ! 1410: _fmode=O_BINARY; ! 1411: setvbuf(stdout,NULL,_IONBF,0); ! 1412: ! 1413: fprintf(stderr,"\nADDFILES Version %s (%s) - Adds files to Synchronet " ! 1414: "Filebase\n" ! 1415: ,ADDFILES_VER ! 1416: #if defined(__OS2__) ! 1417: ,"OS/2" ! 1418: #elif defined(__NT__) ! 1419: ,"Win32" ! 1420: #elif defined(__DOS4G__) ! 1421: ,"DOS4G" ! 1422: #elif defined(__FLAT__) ! 1423: ,"DOS32" ! 1424: #else ! 1425: ,"DOS16" ! 1426: #endif ! 1427: ); ! 1428: ! 1429: if(argc<2) { ! 1430: printf(usage); ! 1431: return(1); } ! 1432: ! 1433: p=getenv("SBBSNODE"); ! 1434: if(p==NULL) { ! 1435: printf("\nSBBSNODE environment variable not set.\n"); ! 1436: printf("\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n"); ! 1437: exit(1); } ! 1438: ! 1439: putenv("TZ=UCT0"); ! 1440: ! 1441: strcpy(node_dir,p); ! 1442: if(node_dir[strlen(node_dir)-1]!='\\') ! 1443: strcat(node_dir,"\\"); ! 1444: ! 1445: txt.openerr="\7\nError opening %s for read.\n"; ! 1446: txt.reading="\nReading %s..."; ! 1447: txt.readit="\rRead %s "; ! 1448: txt.allocerr="\7\nError allocating %u bytes of memory\n"; ! 1449: txt.error="\7\nERROR: Offset %lu in %s\r\n\n"; ! 1450: ! 1451: read_node_cfg(txt); ! 1452: if(ctrl_dir[0]=='.') { /* Relative path */ ! 1453: strcpy(str,ctrl_dir); ! 1454: sprintf(ctrl_dir,"%s%s",node_dir,str); } ! 1455: read_main_cfg(txt); ! 1456: if(data_dir[0]=='.') { /* Relative path */ ! 1457: strcpy(str,data_dir); ! 1458: sprintf(data_dir,"%s%s",node_dir,str); } ! 1459: if(temp_dir[1]!=':' && temp_dir[0]!='\\') { ! 1460: strcpy(str,temp_dir); ! 1461: sprintf(temp_dir,"%s%s",node_dir,str); } ! 1462: read_file_cfg(txt); ! 1463: printf("\n\n"); ! 1464: ! 1465: if(argv[1][0]=='*') { ! 1466: if(argv[1][1]) ! 1467: sprintf(auto_name,"%.12s",argv[1]+1); ! 1468: mode|=AUTO_ADD; ! 1469: i=0; } ! 1470: else { ! 1471: for(i=0;i<total_dirs;i++) ! 1472: if(!stricmp(dir[i]->code,argv[1])) ! 1473: break; ! 1474: ! 1475: if(i>=total_dirs) { ! 1476: printf("Directory code '%s' not found.\n",argv[1]); ! 1477: exit(1); } } ! 1478: ! 1479: memset(&f,0,sizeof(file_t)); ! 1480: f.dir=i; ! 1481: strcpy(f.uler,"-> ADDFILES <-"); ! 1482: ! 1483: for(j=2;j<argc;j++) { ! 1484: if(argv[j][0]=='*') /* set the uploader name */ ! 1485: sprintf(f.uler,"%.25s",argv[j]+1); ! 1486: else if(argv[j][0]=='/') { /* options */ ! 1487: for(i=1;i<strlen(argv[j]);i++) ! 1488: switch(toupper(argv[j][i])) { ! 1489: case 'A': ! 1490: mode|=ASCII_ONLY; ! 1491: break; ! 1492: case 'B': ! 1493: mode|=(SYNC_LIST|NO_UPDATE); ! 1494: break; ! 1495: case 'C': ! 1496: mode|=KEEP_SPACE; ! 1497: break; ! 1498: case 'D': ! 1499: mode|=DEL_LIST; ! 1500: break; ! 1501: case 'E': ! 1502: mode|=NO_EXTEND; ! 1503: break; ! 1504: case 'I': ! 1505: mode|=UL_STATS; ! 1506: break; ! 1507: case 'Z': ! 1508: mode|=FILE_ID; ! 1509: break; ! 1510: case 'K': ! 1511: mode|=KEEP_DESC; /* Don't use DIZ for short desc */ ! 1512: break; ! 1513: case 'N': ! 1514: mode|=NO_UPDATE; ! 1515: break; ! 1516: case 'O': ! 1517: mode|=ULDATE_ONLY; ! 1518: break; ! 1519: case 'U': ! 1520: mode|=NO_NEWDATE; ! 1521: break; ! 1522: case 'F': ! 1523: mode|=FILE_DATE; ! 1524: break; ! 1525: case 'T': ! 1526: mode|=TODAYS_DATE; ! 1527: break; ! 1528: case 'S': ! 1529: mode|=SEARCH_DIR; ! 1530: break; ! 1531: default: ! 1532: printf(usage); ! 1533: return(1); } } ! 1534: else if(argv[j][0]=='+') { /* filelist - FILES.BBS */ ! 1535: listgiven=1; ! 1536: if(isdigit(argv[j+1][0])) { /* skip x characters before description */ ! 1537: if(isdigit(argv[j+2][0])) { /* skip x characters before size */ ! 1538: addlist(argv[j]+1,f,atoi(argv[j+1]),atoi(argv[j+2])); ! 1539: j+=2; } ! 1540: else { ! 1541: addlist(argv[j]+1,f,atoi(argv[j+1]),0); ! 1542: j++; } } ! 1543: else ! 1544: addlist(argv[j]+1,f,0,0); ! 1545: if(mode&SYNC_LIST) ! 1546: synclist(argv[j]+1,f.dir); } ! 1547: else if(argv[j][0]=='.') { /* alternate file path */ ! 1548: cur_altpath=atoi(argv[j]+1); ! 1549: if(cur_altpath>altpaths) { ! 1550: printf("Invalid alternate path.\n"); ! 1551: exit(1); } } ! 1552: else { ! 1553: namegiven=1; ! 1554: padfname(argv[j],f.name); ! 1555: f.desc[0]=0; ! 1556: strupr(f.name); ! 1557: if(j+1==argc) { ! 1558: printf("%s no description given.\n",f.name); ! 1559: continue; } ! 1560: sprintf(str,"%s%s",cur_altpath ? altpath[cur_altpath-1] ! 1561: : dir[f.dir]->path,argv[j]); ! 1562: if(str[0]=='.') { ! 1563: sprintf(tmp,"%s%s",node_dir,str); ! 1564: strcpy(str,tmp); } ! 1565: if(mode&FILE_DATE) ! 1566: sprintf(f.desc,"%s ",unixtodstr(fdate(str),tmp)); ! 1567: if(mode&TODAYS_DATE) ! 1568: sprintf(f.desc,"%s ",unixtodstr(time(NULL),tmp)); ! 1569: sprintf(tmp,"%.*s",LEN_FDESC-strlen(f.desc),argv[++j]); ! 1570: strcpy(f.desc,tmp); ! 1571: l=flength(str); ! 1572: if(l==-1) { ! 1573: printf("%s not found.\n",str); ! 1574: continue; } ! 1575: exist=findfile(f.dir,f.name); ! 1576: if(exist) { ! 1577: if(mode&NO_UPDATE) ! 1578: continue; ! 1579: getfileixb(&f); ! 1580: if(mode&ULDATE_ONLY) { ! 1581: f.dateuled=time(NULL); ! 1582: update_uldate(f); ! 1583: continue; } } ! 1584: f.cdt=l; ! 1585: f.dateuled=time(NULL); ! 1586: f.altpath=cur_altpath; ! 1587: strip_ctrl(f.desc); ! 1588: if(mode&ASCII_ONLY) ! 1589: strip_exascii(f.desc); ! 1590: printf("%s %7lu %s\n",f.name,f.cdt,f.desc); ! 1591: if(mode&FILE_ID) { ! 1592: for(i=0;i<total_fextrs;i++) ! 1593: if(!stricmp(fextr[i]->ext,f.name+9)) ! 1594: break; ! 1595: if(i<total_fextrs) { ! 1596: sprintf(tmp,"%sFILE_ID.DIZ",temp_dir); ! 1597: remove(tmp); ! 1598: system(cmdstr(fextr[i]->cmd,str,"FILE_ID.DIZ",NULL)); ! 1599: if(!fexist(tmp)) { ! 1600: sprintf(tmp,"%sDESC.SDI",temp_dir); ! 1601: remove(tmp); ! 1602: system(cmdstr(fextr[i]->cmd,str,"DESC.SDI",NULL)); } ! 1603: if((file=nopen(tmp,O_RDONLY))!=-1) { ! 1604: memset(ext,0,513); ! 1605: read(file,ext,512); ! 1606: if(!(mode&KEEP_DESC)) { ! 1607: sprintf(f.desc,"%.*s",LEN_FDESC,ext); ! 1608: for(i=0;f.desc[i]>=SP && i<LEN_FDESC;i++) ! 1609: ; ! 1610: f.desc[i]=0; } ! 1611: close(file); ! 1612: f.misc|=FM_EXTDESC; } } } ! 1613: if(exist) { ! 1614: putfiledat(f); ! 1615: if(!(mode&NO_NEWDATE)) ! 1616: update_uldate(f); } ! 1617: else ! 1618: addfiledat(&f); ! 1619: ! 1620: if(f.misc&FM_EXTDESC) ! 1621: putextdesc(f.dir,f.datoffset,ext); ! 1622: ! 1623: if(mode&UL_STATS) ! 1624: updatestats(l); ! 1625: files++; } } ! 1626: ! 1627: if(mode&AUTO_ADD) { ! 1628: for(i=0;i<total_dirs;i++) { ! 1629: if(dir[i]->misc&DIR_NOAUTO) ! 1630: continue; ! 1631: f.dir=i; ! 1632: if(mode&SEARCH_DIR) { ! 1633: addlist("",f,0,0); ! 1634: continue; } ! 1635: sprintf(str,"%s.LST",dir[f.dir]->code); ! 1636: if(flength(str)>0L) { ! 1637: printf("Auto-adding %s\n",str); ! 1638: addlist(str,f,0,0); ! 1639: if(mode&SYNC_LIST) ! 1640: synclist(str,i); ! 1641: continue; } ! 1642: sprintf(str,"%s%s",dir[f.dir]->path,auto_name); ! 1643: if(str[0]=='.') { ! 1644: sprintf(tmp,"%s%s",node_dir,str); ! 1645: strcpy(str,tmp); } ! 1646: if(flength(str)>0L) { ! 1647: printf("Auto-adding %s\n",str); ! 1648: addlist(str,f,0,0); ! 1649: if(mode&SYNC_LIST) ! 1650: synclist(str,i); ! 1651: continue; } } } ! 1652: ! 1653: else { ! 1654: if(!listgiven && !namegiven) { ! 1655: sprintf(str,"%s.LST",dir[f.dir]->code); ! 1656: if(flength(str)<=0L) ! 1657: strcpy(str,"FILES.BBS"); ! 1658: addlist(str,f,0,0); ! 1659: if(mode&SYNC_LIST) ! 1660: synclist(str,f.dir); } } ! 1661: ! 1662: printf("\n%lu file(s) added.",files); ! 1663: if(removed) ! 1664: printf("\n%lu files(s) removed.",removed); ! 1665: printf("\n"); ! 1666: return(0); ! 1667: } ! 1668:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.