Annotation of sbbs/src/sbbs3/dupefind.c, revision 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.