struct duc_dir *duc_dir_new(struct duc *duc, const struct duc_devino *devino) { size_t vall; char key[32]; size_t keyl = snprintf(key, sizeof(key), "%jx/%jx", (uintmax_t)devino->dev, (uintmax_t)devino->ino); char *val = db_get(duc->db, key, keyl, &vall); if(val == NULL) { duc->err = DUC_E_PATH_NOT_FOUND; return NULL; } struct duc_dir *dir = duc_malloc0(sizeof(struct duc_dir)); dir->duc = duc; dir->devino.dev = devino->dev; dir->devino.ino = devino->ino; dir->path = NULL; dir->ent_pool = 32768; dir->ent_list = duc_malloc(dir->ent_pool); dir->size_type = -1; struct buffer *b = buffer_new(val, vall); /* Read dir header */ buffer_get_dir(b, &dir->devino_parent, &dir->mtime); /* Read all dirents */ while(b->ptr < b->len) { if((dir->ent_count+1) * sizeof(struct duc_dirent) > dir->ent_pool) { dir->ent_pool *= 2; dir->ent_list = duc_realloc(dir->ent_list, dir->ent_pool); } struct duc_dirent *ent = &dir->ent_list[dir->ent_count]; buffer_get_dirent(b, ent); duc_size_accum(&dir->size, &ent->size); dir->ent_count ++; } buffer_free(b); return dir; }
int duc_dir_add_ent(struct duc_dir *dir, const char *name, off_t size_apparent, off_t size_actual, uint8_t type, dev_t dev, ino_t ino) { if((dir->ent_count+1) * sizeof(struct duc_dirent) > dir->ent_pool) { dir->ent_pool *= 2; dir->ent_list = duc_realloc(dir->ent_list, dir->ent_pool); } struct duc_dirent *ent = &dir->ent_list[dir->ent_count]; dir->ent_count ++; ent->name = duc_strdup(name); ent->size_apparent = size_apparent; ent->size_actual = size_actual; ent->type = type; ent->dev = dev; ent->ino = ino; return 0; }