Example #1
0
File: dir.c Project: NethServer/duc
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;
}
Example #2
0
File: dir.c Project: MSU-RCG/duc
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;
}