struct node *node_lookup(struct fuse *fuse, struct node *parent, const char *name, struct fuse_attr *attr) { int res; struct stat s; char *path, buffer[PATH_BUFFER_SIZE]; struct node *node; path = node_get_path(parent, buffer, name); /* XXX error? */ res = lstat(path, &s); if (res < 0) return 0; node = lookup_child_by_name(parent, name); if (!node) { node = node_create(parent, name, fuse->next_node_id++, fuse->next_generation++); if (!node) return 0; node->nid = ptr_to_id(node); node->all = fuse->all; fuse->all = node; } attr_from_stat(attr, &s); attr->ino = node->nid; return node; }
static int fuse_reply_entry(struct fuse* fuse, __u64 unique, struct node* parent, const char* name, const char* actual_name, const char* path) { struct node* node; struct fuse_entry_out out; struct stat s; if (lstat(path, &s) < 0) { return -errno; } pthread_mutex_lock(&fuse->lock); node = acquire_or_create_child_locked(fuse, parent, name, actual_name); if (!node) { pthread_mutex_unlock(&fuse->lock); return -ENOMEM; } memset(&out, 0, sizeof(out)); attr_from_stat(&out.attr, &s, node->nid); out.attr_valid = 10; out.entry_valid = 10; out.nodeid = node->nid; out.generation = node->gen; pthread_mutex_unlock(&fuse->lock); fuse_reply(fuse, unique, &out, sizeof(out)); return NO_STATUS; }
static int fuse_reply_attr(struct fuse* fuse, __u64 unique, __u64 nid, const char* path) { struct fuse_attr_out out; struct stat s; if (lstat(path, &s) < 0) { return -errno; } memset(&out, 0, sizeof(out)); attr_from_stat(&out.attr, &s, nid); out.attr_valid = 10; fuse_reply(fuse, unique, &out, sizeof(out)); return NO_STATUS; }
int node_get_attr(struct node *node, struct fuse_attr *attr) { int res; struct stat s; char *path, buffer[PATH_BUFFER_SIZE]; path = node_get_path(node, buffer, 0); res = lstat(path, &s); if (res < 0) { ERROR("lstat('%s') errno %d\n", path, errno); return -1; } attr_from_stat(attr, &s); attr->ino = node->nid; return 0; }