static int sort_and_write_hooks(struct manio *manio) { int i; int ret=-1; struct fzp *fzp=NULL; char msg[32]=""; char *path=NULL; int hook_count=manio->hook_count; uint64_t *hook_sort=manio->hook_sort; if(!hook_sort) return 0; snprintf(msg, sizeof(msg), "%08"PRIX64, manio->offset->fcount-1); if(!(path=prepend_s(manio->hook_dir, msg)) || build_path_w(path) || !(fzp=fzp_gzopen(path, MANIO_MODE_WRITE))) goto end; qsort(hook_sort, hook_count, sizeof(uint64_t), uint64_t_sort); if(write_hook_header(fzp, manio->rmanifest, msg)) goto end; for(i=0; i<hook_count; i++) { // Do not bother with duplicates. if(i && hook_sort[i]==hook_sort[i-1]) continue; if(to_fzp_fingerprint(fzp, hook_sort[i])) goto end; } if(fzp_close(&fzp)) { logp("Error closing %s in %s: %s\n", path, __func__, strerror(errno)); goto end; } if(manio_write_fcount(manio)) goto end; manio->hook_count=0; ret=0; end: fzp_close(&fzp); free_w(&path); return ret; }
static int sort_and_write_hooks(struct manio *manio) { int i; int ret=-1; struct fzp *fzp=NULL; char comp[32]=""; char *path=NULL; int hook_count=manio->hook_count; char **hook_sort=manio->hook_sort; if(!hook_sort) return 0; snprintf(comp, sizeof(comp), "%08"PRIX64, manio->offset.fcount-1); if(!(path=prepend_s(manio->hook_dir, comp)) || build_path_w(path) || !(fzp=fzp_gzopen(path, manio->mode))) goto end; qsort(hook_sort, hook_count, sizeof(char *), strsort); if(write_hook_header(manio, fzp, comp)) goto end; for(i=0; i<hook_count; i++) { // Do not bother with duplicates. if(i && !strcmp(hook_sort[i], hook_sort[i-1])) continue; fzp_printf(fzp, "%c%04X%s\n", CMD_FINGERPRINT, (unsigned int)strlen(hook_sort[i]), hook_sort[i]); } if(fzp_close(&fzp)) { logp("Error closing %s in %s: %s\n", path, __func__, strerror(errno)); goto end; } if(manio_write_fcount(manio)) goto end; manio->hook_count=0; ret=0; end: fzp_close(&fzp); free_w(&path); return ret; }
static int sort_and_write_hooks(struct manio *manio) { int i; int ret=-1; gzFile zp=NULL; char comp[32]=""; char *path=NULL; int hook_count=manio->hook_count; char **hook_sort=manio->hook_sort; if(!hook_sort) return 0; snprintf(comp, sizeof(comp), "%08lX", manio->fcount-1); if(!(path=prepend_s(manio->hook_dir, comp)) || build_path_w(path) || !(zp=gzopen_file(path, manio->mode))) goto end; qsort(hook_sort, hook_count, sizeof(char *), strsort); if(write_hook_header(manio, zp, comp)) goto end; for(i=0; i<hook_count; i++) { // Do not bother with duplicates. if(i && !strcmp(hook_sort[i], hook_sort[i-1])) continue; gzprintf(zp, "%c%04X%s\n", CMD_FINGERPRINT, (unsigned int)strlen(hook_sort[i]), hook_sort[i]); } if(gzclose_fp(&zp)) { logp("Error closing %s in %s: %s\n", path, __func__, strerror(errno)); goto end; } manio->hook_count=0; ret=0; end: gzclose_fp(&zp); if(path) free(path); return ret; }