int build_xpath(char *xpath, const char *path, int rev) { struct file_record *fr; char sha1_digest[40]; if (!rev) { /* Search on FS */ strcpy(xpath, ROOTENV->fsback); strcat(xpath, path); return 0; } if (!(fr = find_fr(path, rev))) { PHOENIXFS_DBG("build_xpath:: missing: %s@%d", path, rev); /* Might be a directory; copy and give to caller */ strcpy(xpath, path); return -1; } print_sha1(sha1_digest, fr->sha1); sprintf(xpath, "%s/.git/loose/%s", ROOTENV->fsback, sha1_digest); if (access(xpath, F_OK) < 0) { /* Try extracting from packfile */ sprintf(xpath, "%s/.git/loose", ROOTENV->fsback); if (unpack_entry(fr->sha1, xpath) < 0) return -1; else PHOENIXFS_DBG("open:: pack %s", sha1_digest); } else PHOENIXFS_DBG("open:: loose %s", sha1_digest); return 0; }
int main(int argc, char* argv[]) { unsigned char sha1[20]; if (argc < 4) usage(argv[0]); load_packing_info(argv[1], argv[2], true); get_sha1_hex(argv[3], sha1); return unpack_entry(sha1, "."); }
static int phoenixfs_open(const char *path, struct fuse_file_info *fi) { int rev, fd; FILE *infile, *fsfile; char fspath[PATH_MAX]; struct file_record *fr; char sha1_digest[40]; rev = parse_pathspec(xpath, path); build_xpath(fspath, xpath, 0); /* Skip zinflate for entries not in fstree */ if (!(fr = find_fr(xpath, rev))) goto END; /* Build openpath by hand */ print_sha1(sha1_digest, fr->sha1); sprintf(openpath, "%s/.git/loose/%s", ROOTENV->fsback, sha1_digest); if (access(openpath, F_OK) < 0) { /* Try extracting from packfile */ sprintf(xpath, "%s/.git/loose", ROOTENV->fsback); if (unpack_entry(fr->sha1, xpath) < 0) return -ENOENT; else PHOENIXFS_DBG("open:: pack %s", sha1_digest); } else PHOENIXFS_DBG("open:: loose %s", sha1_digest); /* zinflate openpath onto fspath */ PHOENIXFS_DBG("open:: zinflate %s onto %s", sha1_digest, fspath); if (!(infile = fopen(openpath, "rb")) || !(fsfile = fopen(fspath, "wb+"))) return -errno; if (zinflate(infile, fsfile) != Z_OK) PHOENIXFS_DBG("open:: zinflate issue"); fclose(infile); fclose(fsfile); END: if ((fd = open(fspath, fi->flags)) < 0) return -errno; fi->fh = fd; return 0; }
static int rosedb_list(struct cache *cache, MDB_txn *txn, int argc, char *argv[]) { MDB_cursor *cursor = cursor_acquire(txn, cache->dbi); MDB_val key, data; char dname_str[KNOT_DNAME_MAXLEN] = {'\0'}; char type_str[16] = { '\0' }; int ret = mdb_cursor_get(cursor, &key, &data, MDB_FIRST); while (ret == 0) { struct entry entry; unpack_entry(&data, &entry); knot_dname_to_str(dname_str, key.mv_data, sizeof(dname_str)); knot_rrtype_to_string(entry.data.type, type_str, sizeof(type_str)); printf("%s\t%s RDATA=%zuB\t%s\t%s\n", dname_str, type_str, knot_rdataset_size(&entry.data.rrs), entry.threat_code, entry.syslog_ip); ret = mdb_cursor_get(cursor, &key, &data, MDB_NEXT); } cursor_release(cursor); return KNOT_EOK; }
static int cache_iter_val(struct iter *it, struct entry *entry) { return unpack_entry(&it->val, entry); }