man_off_t *manio_tell(struct manio *manio) { static man_off_t offset; memset(&offset, 0, sizeof(man_off_t)); if(!manio->fzp) return 0; if((manio->offset.offset=fzp_tell(manio->fzp))<0) return NULL; man_off_t_memcpy(&offset, &manio->offset); return &offset; }
int manio_truncate(struct manio *manio) { off_t pos=0; if(manio->fzp && (pos=fzp_tell(manio->fzp))<0) { logp("Could not fzp_tell %s in %s(): %s\n", manio->directory, __func__, strerror(errno)); return -1; } if(truncate(manio->directory, pos)) { logp("Could not truncate %s in %s(): %s\n", manio->directory, __func__, strerror(errno)); return -1; } return 0; }
man_off_t *manio_tell(struct manio *manio) { man_off_t *offset=NULL; if(!manio->fzp) { logp("manio_tell called on null fzp\n"); goto error; } if(!(offset=man_off_t_alloc()) || !(offset->fpath=strdup_w(manio->offset->fpath, __func__)) || (offset->offset=fzp_tell(manio->fzp))<0) goto error; offset->fcount=manio->offset->fcount; return offset; error: man_off_t_free(&offset); return NULL; }
// This deals with reading in the sparse index, as well as actual candidate // manifests. enum cand_ret candidate_load(struct candidate *candidate, const char *path, struct scores *scores) { enum cand_ret ret=CAND_RET_PERM; struct fzp *fzp=NULL; struct sbuf *sb=NULL; struct blk *blk=NULL; if(!(sb=sbuf_alloc(PROTO_2)) || !(blk=blk_alloc())) { ret=CAND_RET_PERM; goto error; } if(!(fzp=fzp_gzopen(path, "rb"))) { ret=CAND_RET_TEMP; goto error; } while(fzp) { sbuf_free_content(sb); switch(sbuf_fill_from_file(sb, fzp, blk, NULL)) { case 1: goto end; case -1: logp("Error reading %s in %s, pos %d\n", path, __func__, fzp_tell(fzp)); ret=CAND_RET_TEMP; goto error; } if(blk_fingerprint_is_hook(blk)) { if(sparse_add_candidate(&blk->fingerprint, candidate)) { ret=CAND_RET_PERM; goto error; } } else if(sb->path.cmd==CMD_MANIFEST) { if(!(candidate=candidates_add_new())) { ret=CAND_RET_PERM; goto error; } candidate->path=sb->path.buf; sb->path.buf=NULL; } blk->fingerprint=0; } end: if(scores_grow(scores, candidates_len)) { ret=CAND_RET_PERM; goto error; } candidates_set_score_pointers(candidates, candidates_len, scores); scores_reset(scores); //logp("Now have %d candidates\n", (int)candidates_len); ret=CAND_RET_OK; error: fzp_close(&fzp); sbuf_free(&sb); blk_free(&blk); return ret; }