|
|
1.1 ! root 1: /* DUPEFIND.C */ ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: #include "sbbs.h" ! 6: #include "crc32.h" ! 7: ! 8: #define DUPEFIND_VER "1.01" ! 9: ! 10: void bail(int code) ! 11: { ! 12: exit(code); ! 13: } ! 14: /****************************************************************************/ ! 15: /* Returns 32-crc of string (not counting terminating NULL) */ ! 16: /****************************************************************************/ ! 17: ulong crc32(char *str) ! 18: { ! 19: int i=0; ! 20: ulong crc=0xffffffffUL; ! 21: ! 22: while(str[i]) ! 23: crc=ucrc32(str[i++],crc); ! 24: crc=~crc; ! 25: return(crc); ! 26: } ! 27: long lputs(char FAR16 *str) ! 28: { ! 29: char tmp[256]; ! 30: int i,j,k; ! 31: ! 32: j=strlen(str); ! 33: for(i=k=0;i<j;i++) /* remove CRs */ ! 34: if(str[i]==CR && str[i+1]==LF) ! 35: continue; ! 36: else ! 37: tmp[k++]=str[i]; ! 38: tmp[k]=0; ! 39: return(fputs(tmp,stderr)); ! 40: } ! 41: ! 42: /****************************************************************************/ ! 43: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ ! 44: /* number of times if the attempted file is already open or denying access */ ! 45: /* for some other reason. All files are opened in BINARY mode. */ ! 46: /****************************************************************************/ ! 47: int nopen(char *str, int access) ! 48: { ! 49: char logstr[256]; ! 50: int file,share,count=0; ! 51: ! 52: if(access==O_RDONLY) share=SH_DENYWR; ! 53: else share=SH_DENYRW; ! 54: while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) ! 55: && errno==EACCES && count++<LOOP_NOPEN); ! 56: if(file==-1 && errno==EACCES) ! 57: lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); ! 58: return(file); ! 59: } ! 60: ! 61: /****************************************************************************/ ! 62: /* Performs printf() through local assembly routines */ ! 63: /* Called from everywhere */ ! 64: /****************************************************************************/ ! 65: int lprintf(char *fmat, ...) ! 66: { ! 67: va_list argptr; ! 68: char sbuf[256]; ! 69: int chcount; ! 70: ! 71: va_start(argptr,fmat); ! 72: chcount=vsprintf(sbuf,fmat,argptr); ! 73: va_end(argptr); ! 74: lputs(sbuf); ! 75: return(chcount); ! 76: } ! 77: ! 78: /****************************************************************************/ ! 79: /* This function performs an nopen, but returns a file stream with a buffer */ ! 80: /* allocated. */ ! 81: /****************************************************************************/ ! 82: FILE *fnopen(int *file, char *str, int access) ! 83: { ! 84: char mode[128]; ! 85: FILE *stream; ! 86: ! 87: if(access&O_WRONLY) access|=O_RDWR; /* fdopen can't open WRONLY */ ! 88: ! 89: if(((*file)=nopen(str,access))==-1) ! 90: return(NULL); ! 91: ! 92: if(access&O_APPEND) { ! 93: if(access&(O_RDONLY|O_RDWR)) ! 94: strcpy(mode,"a+"); ! 95: else ! 96: strcpy(mode,"a"); } ! 97: else { ! 98: if(access&(O_WRONLY|O_RDWR)) ! 99: strcpy(mode,"r+"); ! 100: else ! 101: strcpy(mode,"r"); } ! 102: stream=fdopen((*file),mode); ! 103: if(stream==NULL) { ! 104: close(*file); ! 105: return(NULL); } ! 106: setvbuf(stream,NULL,_IOFBF,16*1024); ! 107: return(stream); ! 108: } ! 109: ! 110: /****************************************************************************/ ! 111: /* Puts a backslash on path strings */ ! 112: /****************************************************************************/ ! 113: void backslash(char *str) ! 114: { ! 115: int i; ! 116: ! 117: i=strlen(str); ! 118: if(i && str[i-1]!='\\') { ! 119: str[i]='\\'; str[i+1]=0; } ! 120: } ! 121: /****************************************************************************/ ! 122: /* Truncates white-space chars off end of 'str' and terminates at first tab */ ! 123: /****************************************************************************/ ! 124: void truncsp(char *str) ! 125: { ! 126: int c; ! 127: ! 128: str[strcspn(str,"\t")]=0; ! 129: c=strlen(str); ! 130: while(c && (uchar)str[c-1]<=SP) c--; ! 131: str[c]=0; ! 132: } ! 133: char *display_filename(ushort dir_num,ushort fil_off) ! 134: { ! 135: static char str[256]; ! 136: char fname[13]; ! 137: int file; ! 138: ! 139: sprintf(str,"%s%s.IXB",dir[dir_num]->data_dir,dir[dir_num]->code); ! 140: if((file=nopen(str,O_RDONLY))==-1) ! 141: return("UNKNOWN"); ! 142: lseek(file,(long)(22*(fil_off-1)),SEEK_SET); ! 143: read(file,fname,11); ! 144: close(file); ! 145: ! 146: sprintf(str,"%-8.8s.%c%c%c",fname,fname[8],fname[9],fname[10]); ! 147: return(str); ! 148: } ! 149: ! 150: void main(int argc,char **argv) ! 151: { ! 152: char str[256],*ixbbuf,*p; ! 153: ulong **fcrc,*foundcrc,total_found=0L; ! 154: ushort i,j,k,h,g,start_lib=0,end_lib=0,found=-1; ! 155: int file; ! 156: long l,m; ! 157: read_cfg_text_t txt; ! 158: ! 159: putenv("TZ=UCT0"); ! 160: _fmode=O_BINARY; ! 161: setvbuf(stdout,NULL,_IONBF,0); ! 162: ! 163: fprintf(stderr,"\nDUPEFIND Version %s (%s) - Synchronet Duplicate File " ! 164: "Finder\n" ! 165: ,DUPEFIND_VER ! 166: #if defined(__OS2__) ! 167: ,"OS/2" ! 168: #elif defined(__NT__) ! 169: ,"Win32" ! 170: #elif defined(__DOS4G__) ! 171: ,"DOS4G" ! 172: #elif defined(__FLAT__) ! 173: ,"DOS32" ! 174: #else ! 175: ,"DOS16" ! 176: #endif ! 177: ); ! 178: ! 179: p=getenv("SBBSNODE"); ! 180: if(p==NULL) { ! 181: fprintf(stderr,"\nSBBSNODE environment variable must be set.\n"); ! 182: fprintf(stderr,"\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n"); ! 183: exit(1); } ! 184: ! 185: if(!stricmp(argv[1],"/?") || !stricmp(argv[1],"?")) { ! 186: fprintf(stderr,"\n"); ! 187: fprintf(stderr,"usage: DUPEFIND [start] [end]\n"); ! 188: fprintf(stderr,"where: [start] is the starting library number to check\n"); ! 189: fprintf(stderr," [end] is the final library number to check\n"); ! 190: return; } ! 191: ! 192: ! 193: strcpy(node_dir,p); ! 194: if(node_dir[strlen(node_dir)-1]!='\\') ! 195: strcat(node_dir,"\\"); ! 196: ! 197: txt.openerr="\7\nError opening %s for read.\n"; ! 198: txt.reading="\nReading %s..."; ! 199: txt.readit="\rRead %s "; ! 200: txt.allocerr="\7\nError allocating %u bytes of memory\n"; ! 201: txt.error="\7\nERROR: Offset %lu in %s\r\n\n"; ! 202: ! 203: read_node_cfg(txt); ! 204: if(ctrl_dir[0]=='.') { ! 205: strcpy(str,ctrl_dir); ! 206: sprintf(ctrl_dir,"%s%s",node_dir,str); ! 207: if(_fullpath(str,ctrl_dir,40)) ! 208: strcpy(ctrl_dir,str); } ! 209: backslash(ctrl_dir); ! 210: read_main_cfg(txt); ! 211: if(data_dir[0]=='.') { ! 212: strcpy(str,data_dir); ! 213: sprintf(data_dir,"%s%s",node_dir,str); ! 214: if(_fullpath(str,data_dir,40)) ! 215: strcpy(data_dir,str); } ! 216: backslash(data_dir); ! 217: read_file_cfg(txt); ! 218: lputs("\n"); ! 219: ! 220: start_lib=0; ! 221: end_lib=total_libs-1; ! 222: if(argc>1) ! 223: start_lib=end_lib=atoi(argv[1])-1; ! 224: if(argc>2) ! 225: end_lib=atoi(argv[2])-1; ! 226: ! 227: if((fcrc=(ulong **)MALLOC(total_dirs*sizeof(ulong *)))==NULL) { ! 228: printf("Not enough memory for CRCs.\r\n"); ! 229: exit(1); } ! 230: ! 231: for(i=0;i<total_dirs;i++) { ! 232: fprintf(stderr,"Reading directory index %u of %u\r",i+1,total_dirs); ! 233: sprintf(str,"%s%s.IXB",dir[i]->data_dir,dir[i]->code); ! 234: if((file=nopen(str,O_RDONLY))==-1) { ! 235: fcrc[i]=(ulong *)MALLOC(1*sizeof(ulong)); ! 236: fcrc[i][0]=0; ! 237: continue; } ! 238: l=filelength(file); ! 239: if(!l || (dir[i]->lib<start_lib || dir[i]->lib>end_lib)) { ! 240: close(file); ! 241: fcrc[i]=(ulong *)MALLOC(1*sizeof(ulong)); ! 242: fcrc[i][0]=0; ! 243: continue; } ! 244: if((fcrc[i]=(ulong *)MALLOC((l/22+2)*sizeof(ulong)))==NULL) { ! 245: printf("Not enough memory for CRCs.\r\n"); ! 246: exit(1); } ! 247: fcrc[i][0]=(ulong)(l/22); ! 248: if((ixbbuf=(char *)MALLOC(l))==NULL) { ! 249: close(file); ! 250: printf("\7Error allocating memory for index %s.\r\n",str); ! 251: continue; } ! 252: if(read(file,ixbbuf,l)!=l) { ! 253: close(file); ! 254: printf("\7Error reading %s.\r\n",str); ! 255: FREE(ixbbuf); ! 256: continue; } ! 257: close(file); ! 258: j=1; ! 259: m=0L; ! 260: while(m<l) { ! 261: sprintf(str,"%-11.11s",(ixbbuf+m)); ! 262: strupr(str); ! 263: fcrc[i][j++]=crc32(str); ! 264: m+=22; } ! 265: FREE(ixbbuf); } ! 266: lputs("\n"); ! 267: ! 268: foundcrc=0L; ! 269: for(i=0;i<total_dirs;i++) { ! 270: if(dir[i]->lib<start_lib || dir[i]->lib>end_lib) ! 271: continue; ! 272: lprintf("Scanning %s %s\n",lib[dir[i]->lib]->sname,dir[i]->sname); ! 273: for(k=1;k<fcrc[i][0];k++) { ! 274: for(j=i+1;j<total_dirs;j++) { ! 275: if(dir[j]->lib<start_lib || dir[j]->lib>end_lib) ! 276: continue; ! 277: for(h=1;h<fcrc[j][0];h++) { ! 278: if(fcrc[i][k]==fcrc[j][h]) { ! 279: if(found!=k) { ! 280: found=k; ! 281: for(g=0;g<total_found;g++) { ! 282: if(foundcrc[g]==fcrc[i][k]) ! 283: g=total_found+1; } ! 284: if(g==total_found) { ! 285: ++total_found; ! 286: if((foundcrc=(ulong *)REALLOC(foundcrc ! 287: ,total_found*sizeof(ulong)))==NULL) { ! 288: printf("Out of memory reallocating\r\n"); ! 289: exit(1); } } ! 290: else ! 291: found=0; ! 292: printf("\n%-12s is located in : %-*s %s\n" ! 293: "%-12s and : %-*s %s\n" ! 294: ,display_filename(i,k) ! 295: ,LEN_GSNAME ! 296: ,lib[dir[i]->lib]->sname ! 297: ,dir[i]->sname ! 298: ,"" ! 299: ,LEN_GSNAME ! 300: ,lib[dir[j]->lib]->sname ! 301: ,dir[j]->sname ! 302: ); } ! 303: else ! 304: printf("%-12s and : %-*s %s\n" ! 305: ,"" ! 306: ,LEN_GSNAME ! 307: ,lib[dir[j]->lib]->sname ! 308: ,dir[j]->sname ! 309: ); } } } } } ! 310: } ! 311:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.