aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-04-23 05:46:11 -0400
committerJeff Garzik <jeff@garzik.org>2006-04-23 05:46:11 -0400
commit9033a9e3501d3d9059b4031551223214e2213fed (patch)
tree2713f560e83bccc543882a71f6afdd2a904a8173
parent17fcfbc42cfca78fad5054a17a44d797470d00ae (diff)
downloaddbfs-9033a9e3501d3d9059b4031551223214e2213fed.tar.gz
dbfs: implement readlink op
-rw-r--r--dbfs.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/dbfs.c b/dbfs.c
index 654ec06..d1e0395 100644
--- a/dbfs.c
+++ b/dbfs.c
@@ -102,6 +102,28 @@ static int dbfs_read_dir(guint64 ino, DBT *val)
return rc;
}
+static int dbfs_read_link(guint64 ino, DBT *val)
+{
+ DBT key;
+ char key_str[32];
+ int rc;
+
+ memset(&key, 0, sizeof(key));
+ memset(val, 0, sizeof(*val));
+
+ sprintf(key_str, "/symlink/%Lu", (unsigned long long) ino);
+
+ key.data = key_str;
+ key.size = strlen(key_str);
+
+ val->flags = DB_DBT_MALLOC;
+
+ rc = db_meta->get(db_meta, NULL, &key, val, 0);
+ if (rc == DB_NOTFOUND)
+ return -EINVAL;
+ return rc;
+}
+
typedef int (*dbfs_dir_actor_t) (struct dbfs_dirent *, void *);
static int dbfs_dir_foreach(void *dir, dbfs_dir_actor_t func, void *userdata)
@@ -229,6 +251,25 @@ static void dbfs_op_getattr(fuse_req_t req, fuse_ino_t ino_n,
g_free(ino);
}
+static void dbfs_op_readlink(fuse_req_t req, fuse_ino_t ino)
+{
+ int rc;
+ DBT val;
+ char *s;
+
+ rc = dbfs_read_link(ino, &val);
+ if (rc) {
+ fuse_reply_err(req, rc);
+ return;
+ }
+
+ s = g_strndup(val.data, val.size);
+ fuse_reply_readlink(req, s);
+ g_free(s);
+
+ free(val.data);
+}
+
static void dbfs_op_lookup(fuse_req_t req, fuse_ino_t parent, const char *name)
{
struct fuse_entry_param e;
@@ -410,6 +451,7 @@ static void hello_ll_read(fuse_req_t req, fuse_ino_t ino, size_t size,
static struct fuse_lowlevel_ops dbfs_ops = {
.lookup = dbfs_op_lookup,
.getattr = dbfs_op_getattr,
+ .readlink = dbfs_op_readlink,
.unlink = dbfs_op_unlink,
.rmdir = dbfs_op_rmdir,
.opendir = dbfs_op_opendir,