Annotation of sbbs/sbbs2/dupefind/dupefind.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.