Annotation of sbbs/src/sbbs3/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: long lputs(char *str)
                     16: {
                     17:     char tmp[256];
                     18:     int i,j,k;
                     19: 
                     20: j=strlen(str);
                     21: for(i=k=0;i<j;i++)      /* remove CRs */
                     22:     if(str[i]==CR && str[i+1]==LF)
                     23:         continue;
                     24:     else
                     25:         tmp[k++]=str[i];
                     26: tmp[k]=0;
                     27: return(fputs(tmp,stderr));
                     28: }
                     29: 
                     30: /****************************************************************************/
                     31: /* Performs printf() through local assembly routines                        */
                     32: /* Called from everywhere                                                   */
                     33: /****************************************************************************/
                     34: int lprintf(char *fmat, ...)
                     35: {
                     36:        va_list argptr;
                     37:        char sbuf[256];
                     38:        int chcount;
                     39: 
                     40: va_start(argptr,fmat);
                     41: chcount=vsprintf(sbuf,fmat,argptr);
                     42: va_end(argptr);
                     43: lputs(sbuf);
                     44: return(chcount);
                     45: }
                     46: 
                     47: char *display_filename(scfg_t *cfg, ushort dir_num,ushort fil_off)
                     48: {
                     49:        static char str[256];
                     50:        char fname[13];
                     51:        int file;
                     52: 
                     53:        sprintf(str,"%s%s.IXB",cfg->dir[dir_num]->data_dir,cfg->dir[dir_num]->code);
                     54:        if((file=nopen(str,O_RDONLY))==-1)
                     55:                return("UNKNOWN");
                     56:        lseek(file,(long)(22*(fil_off-1)),SEEK_SET);
                     57:        read(file,fname,11);
                     58:        close(file);
                     59: 
                     60:        sprintf(str,"%-8.8s.%c%c%c",fname,fname[8],fname[9],fname[10]);
                     61:        return(str);
                     62: }
                     63: 
                     64: int main(int argc,char **argv)
                     65: {
                     66:        char str[256],*ixbbuf,*p;
                     67:        ulong **fcrc,*foundcrc,total_found=0L;
                     68:        ushort i,j,k,h,g,start_lib=0,end_lib=0,found=-1;
                     69:        int file;
                     70:     long l,m;
                     71:        scfg_t cfg;
                     72: 
                     73: putenv("TZ=UCT0");
                     74: setvbuf(stdout,NULL,_IONBF,0);
                     75: 
                     76: fprintf(stderr,"\nDUPEFIND Version %s (%s) - Synchronet Duplicate File "
                     77:        "Finder\n", DUPEFIND_VER, PLATFORM_DESC);
                     78: 
                     79:     p=getenv("SBBSCTRL");
                     80:     if(p==NULL) {
                     81:                fprintf(stderr,"\nSBBSCTRL environment variable must be set.\n");
                     82: #ifdef __unix__
                     83:                fprintf(stderr,"\nExample: export SBBSCTRL=/sbbs/ctrl\n");
                     84: #else
                     85:                fprintf(stderr,"\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n");
                     86: #endif
                     87:         return(1); }
                     88: 
                     89:        if(argc>1 && (!stricmp(argv[1],"/?") || !stricmp(argv[1],"?") || !stricmp(argv[1],"-?"))) {
                     90:                fprintf(stderr,"\n");
                     91:                fprintf(stderr,"usage: DUPEFIND [start] [end]\n");
                     92:                fprintf(stderr,"where: [start] is the starting library number to check\n");
                     93:                fprintf(stderr,"       [end]   is the final library number to check\n");
                     94:                return(0); }
                     95: 
                     96:        memset(&cfg,0,sizeof(cfg));
                     97:        cfg.size=sizeof(cfg);
                     98:        SAFECOPY(cfg.ctrl_dir,p);
                     99: 
                    100:        if(!load_cfg(&cfg,NULL,TRUE,str)) {
                    101:                fprintf(stderr,"!ERROR loading configuration files: %s\n",str);
                    102:                return(1);
                    103:        }
                    104: 
                    105:        chdir(cfg.ctrl_dir);
                    106: 
                    107:        lputs("\n");
                    108: 
                    109:        start_lib=0;
                    110:        end_lib=cfg.total_libs-1;
                    111:        if(argc>1)
                    112:                start_lib=end_lib=atoi(argv[1])-1;
                    113:        if(argc>2)
                    114:         end_lib=atoi(argv[2])-1;
                    115: 
                    116:        if((fcrc=(ulong **)malloc(cfg.total_dirs*sizeof(ulong *)))==NULL) {
                    117:                printf("Not enough memory for CRCs.\r\n");
                    118:                return(1); }
                    119: 
                    120:        for(i=0;i<cfg.total_dirs;i++) {
                    121:                fprintf(stderr,"Reading directory index %u of %u\r",i+1,cfg.total_dirs);
                    122:         sprintf(str,"%s%s.ixb",cfg.dir[i]->data_dir,cfg.dir[i]->code);
                    123:                if((file=nopen(str,O_RDONLY|O_BINARY))==-1) {
                    124:                        fcrc[i]=(ulong *)malloc(1*sizeof(ulong));
                    125:             fcrc[i][0]=0;
                    126:                        continue; }
                    127:         l=filelength(file);
                    128:                if(!l || (cfg.dir[i]->lib<start_lib || cfg.dir[i]->lib>end_lib)) {
                    129:             close(file);
                    130:                        fcrc[i]=(ulong *)malloc(1*sizeof(ulong));
                    131:                        fcrc[i][0]=0;
                    132:             continue; }
                    133:                if((fcrc[i]=(ulong *)malloc((l/22+2)*sizeof(ulong)))==NULL) {
                    134:             printf("Not enough memory for CRCs.\r\n");
                    135:             return(1); }
                    136:                fcrc[i][0]=(ulong)(l/22);
                    137:         if((ixbbuf=(char *)malloc(l))==NULL) {
                    138:             close(file);
                    139:             printf("\7Error allocating memory for index %s.\r\n",str);
                    140:             continue; }
                    141:         if(read(file,ixbbuf,l)!=l) {
                    142:             close(file);
                    143:             printf("\7Error reading %s.\r\n",str);
                    144:                        free(ixbbuf);
                    145:             continue; }
                    146:         close(file);
                    147:                j=1;
                    148:                m=0L;
                    149:                while(m<l) {
                    150:                        sprintf(str,"%-11.11s",(ixbbuf+m));
                    151:                        strupr(str);
                    152:                        fcrc[i][j++]=crc32(str,0);
                    153:                        m+=22; }
                    154:                free(ixbbuf); }
                    155:        lputs("\n");
                    156: 
                    157:        foundcrc=0L;
                    158:        for(i=0;i<cfg.total_dirs;i++) {
                    159:                if(cfg.dir[i]->lib<start_lib || cfg.dir[i]->lib>end_lib)
                    160:                        continue;
                    161:                lprintf("Scanning %s %s\n",cfg.lib[cfg.dir[i]->lib]->sname,cfg.dir[i]->sname);
                    162:                for(k=1;k<fcrc[i][0];k++) {
                    163:                        for(j=i+1;j<cfg.total_dirs;j++) {
                    164:                                if(cfg.dir[j]->lib<start_lib || cfg.dir[j]->lib>end_lib)
                    165:                                        continue;
                    166:                                for(h=1;h<fcrc[j][0];h++) {
                    167:                                        if(fcrc[i][k]==fcrc[j][h]) {
                    168:                                                if(found!=k) {
                    169:                                                        found=k;
                    170:                                                        for(g=0;g<total_found;g++) {
                    171:                                                                if(foundcrc[g]==fcrc[i][k])
                    172:                                                                        g=total_found+1; }
                    173:                                                        if(g==total_found) {
                    174:                                                                ++total_found;
                    175:                                                                if((foundcrc=(ulong *)realloc(foundcrc
                    176:                                                                        ,total_found*sizeof(ulong)))==NULL) {
                    177:                                                                printf("Out of memory reallocating\r\n");
                    178:                                                                return(1); } }
                    179:                                                        else
                    180:                                                                found=0;
                    181:                                                        printf("\n%-12s is located in : %-*s  %s\n"
                    182:                                                                   "%-12s           and : %-*s  %s\n"
                    183:                                                                ,display_filename(&cfg,i,k)
                    184:                                                                ,LEN_GSNAME
                    185:                                                                ,cfg.lib[cfg.dir[i]->lib]->sname
                    186:                                                                ,cfg.dir[i]->sname
                    187:                                                                ,""
                    188:                                                                ,LEN_GSNAME
                    189:                                                                ,cfg.lib[cfg.dir[j]->lib]->sname
                    190:                                                                ,cfg.dir[j]->sname
                    191:                                                                ); }
                    192:                                                else
                    193:                                                        printf("%-12s           and : %-*s  %s\n"
                    194:                                                                ,""
                    195:                                                                ,LEN_GSNAME
                    196:                                                                ,cfg.lib[cfg.dir[j]->lib]->sname
                    197:                                                                ,cfg.dir[j]->sname
                    198:                                                                ); } } } } }
                    199:        return(0);
                    200: }
                    201: 

unix.superglobalmegacorp.com

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