static int check_files(struct mystruct *find, struct file *newfile, struct stat *info, const char *ext, unsigned int maxlinks) { int found=0; FILE *nfp=NULL; FILE *ofp=NULL; struct file *f=NULL; //printf(" same size: %s, %s\n", find->files->path, newfile->path); for(f=find->files; f; f=f->next) { if(!f->path) { // If the full_match() function fails to open oldfile // (which could happen if burp deleted some old // directories), it will free path and set it to NULL. // Skip entries like this. continue; } if(newfile->dev!=f->dev) { // Different device. continue; } if(newfile->ino==f->ino) { // Same device, same inode, therefore these two files // are hardlinked to each other already. found++; break; } if((!newfile->part_cksum && get_part_cksum(newfile, &nfp)) || (!f->part_cksum && get_part_cksum(f, &ofp))) { // Some error with md5sums Give up. return -1; } if(newfile->part_cksum!=f->part_cksum) { close_fp(&ofp); continue; } //printf(" %s, %s\n", find->files->path, newfile->path); //printf(" part cksum matched\n"); if((!newfile->full_cksum && get_full_cksum(newfile, &nfp)) || (!f->full_cksum && get_full_cksum(f, &ofp))) { // Some error with md5sums Give up. return -1; } if(newfile->full_cksum!=f->full_cksum) { close_fp(&ofp); continue; } //printf(" full cksum matched\n"); if(!full_match(newfile, f, &nfp, &ofp)) { close_fp(&ofp); continue; } //printf(" full match\n"); //printf("%s, %s\n", find->files->path, newfile->path); // If there are already enough links to this file, replace // our memory of it with the new file so that files later on // can link to the new one. if(f->nlink>=maxlinks) { // Just need to reset the path name and the number // of links, and pretend that it was found otherwise // NULL newfile will get added to the memory. reset_old_file(f, newfile, info); found++; break; } found++; count++; if(verbose) printf("%s\n", newfile->path); // Now hardlink it. if(makelinks) { switch(do_hardlink(newfile, f, ext)) { case 0: f->nlink++; // Only count bytes as saved if we // removed the last link. if(newfile->nlink==1) savedbytes+=info->st_size; break; case -1: // On error, replace the memory of the // old file with the one that we just // found. It might work better when // someone later tries to link to the // new one instead of the old one. reset_old_file(f, newfile, info); count--; break; default: // Abandon all hope. // This could happen if renaming the // hardlink failed in such a way that // the target file was unlinked without // being replaced - ie, if the max // number of hardlinks is being hit. return -1; } } else if(deletedups) { if(unlink(newfile->path)) { logp("Could not delete %s: %s\n", newfile->path, strerror(errno)); } else { // Only count bytes as saved if we removed the // last link. if(newfile->nlink==1) savedbytes+=info->st_size; } } else { // To be able to tell how many bytes // are saveable. savedbytes+=info->st_size; } break; } close_fp(&nfp); close_fp(&ofp); if(found) { free_w(&newfile->path); return 0; } if(add_file(find, newfile)) return -1; return 0; }
static int check_files(struct mystruct *find, struct file *newfile, struct stat *info, const char *ext, unsigned int maxlinks) { int found=0; FILE *nfp=NULL; FILE *ofp=NULL; struct file *f=NULL; //printf(" same size: %s, %s\n", find->files->path, newfile->path); for(f=find->files; f; f=f->next) { if(!f->path) { // If the full_match() function fails to open oldfile // (which could happen if burp deleted some old // directories), it will free path and set it to NULL. // Skip entries like this. continue; } if(newfile->dev!=f->dev) { // Different device. continue; } if(newfile->ino==f->ino) { // Same device, same inode, therefore these two files // are hardlinked to each other already. found++; break; } if((!newfile->part_cksum && get_part_cksum(newfile, &nfp)) || (!f->part_cksum && get_part_cksum(f, &ofp))) { // Some error with md5sums Give up. return -1; } if(newfile->part_cksum!=f->part_cksum) { if(ofp) { fclose(ofp); ofp=NULL; } continue; } //printf(" %s, %s\n", find->files->path, newfile->path); //printf(" part cksum matched\n"); if((!newfile->full_cksum && get_full_cksum(newfile, &nfp)) || (!f->full_cksum && get_full_cksum(f, &ofp))) { // Some error with md5sums Give up. return -1; } if(newfile->full_cksum!=f->full_cksum) { if(ofp) { fclose(ofp); ofp=NULL; } continue; } //printf(" full cksum matched\n"); if(!full_match(newfile, f, &nfp, &ofp)) { if(ofp) { fclose(ofp); ofp=NULL; } continue; } //printf(" full match\n"); //printf("%s, %s\n", find->files->path, newfile->path); // If there are already enough links to this file, replace // our memory of it with the new file so that files later on // can link to the new one. if(f->nlink>=maxlinks) { // Just need to reset the path name and the number // of links, and pretend that it was found otherwise // NULL newfile will get added to the memory. reset_old_file(f, newfile, info); found++; break; } found++; count++; // Now hardlink it. if(makelinks) { if(!do_hardlink(newfile, f, ext)) { f->nlink++; // Only count bytes as saved if we removed the // last link. if(newfile->nlink==1) savedbytes+=info->st_size; } else { // On error, replace the memory of the old file // with the one that we just found. It might // work better when someone later tries to // link to the new one instead of the old one. reset_old_file(f, newfile, info); count--; } } else { // To be able to tell how many bytes // are saveable. savedbytes+=info->st_size; } break; } if(nfp) { fclose(nfp); nfp=NULL; } if(ofp) { fclose(ofp); ofp=NULL; } if(found) { if(newfile->path) free(newfile->path); return 0; } if(add_file(find, newfile)) return -1; return 0; }