Я прочитал код levelfs - файловой системы fuse, использующей хранилище ключей-значений leveldb. В файле levelfs.c я не понимаю, почему они реализуют функцию levelfs_getattr (), как показано ниже:
static int
levelfs_getattr(const char *path, struct stat *stbuf)
{
int res;
db_iter_t *it;
const char *key, *val;
char *base_key;
size_t base_key_len, klen, vlen;
struct fuse_context *fuse_ctx = fuse_get_context();
memset(stbuf, sizeof(struct stat), 0);
stbuf->st_uid = fuse_ctx->uid;
stbuf->st_gid = fuse_ctx->gid;
/* root directory */
if (strcmp(path, "/") == 0) {
stbuf->st_mode = S_IFDIR | 0755;
stbuf->st_nlink = 2;
return 0;
}
/* empty dir */
if (newdirs_exists(path)) {
stbuf->st_mode = S_IFDIR | 0755;
stbuf->st_nlink = 2;
return 0;
}
res = -ENOENT;
base_key = path_to_key(path, &base_key_len, 0);
it = db_iter_seek(CTX_DB, base_key, base_key_len);
while ((key = db_iter_next(it, &klen)) != NULL) {
if (base_key_len == klen) {
/* exact match = file */
stbuf->st_mode = S_IFREG | 0666;
stbuf->st_nlink = 1;
val = db_iter_value(it, &vlen);
stbuf->st_size = vlen;
res = 0;
break;
} else if (sepcmp(key+base_key_len, klen - base_key_len) == 0) {
/* sublevel = directory */
stbuf->st_mode = S_IFDIR | 0755;
stbuf->st_nlink = 2;
res = 0;
break;
}
}
db_iter_close(it);
free(base_key);
return res;
}
Почему они используют итератор для получения размера файла вместо использования db_get () для получения размера файла?