aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-04-23 05:56:45 -0400
committerJeff Garzik <jeff@garzik.org>2006-04-23 05:56:45 -0400
commit978ac6066b71c723142ed154237d1ddced9f1e11 (patch)
tree6077cfe985657d7034c9b4240d268eb256bc0f7d
parent9033a9e3501d3d9059b4031551223214e2213fed (diff)
downloaddbfs-978ac6066b71c723142ed154237d1ddced9f1e11.tar.gz
dbfs: Move DB-related stuff to new file dbfs-backend.c.
-rw-r--r--Makefile.am2
-rw-r--r--dbfs-backend.c219
-rw-r--r--dbfs.c208
-rw-r--r--dbfs.h15
4 files changed, 235 insertions, 209 deletions
diff --git a/Makefile.am b/Makefile.am
index e2d1d36..afbdb04 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,7 +9,7 @@ sbin_PROGRAMS = ndbfs dbfs
ndbfs_SOURCES = ndbfs.c
ndbfs_LDADD = @GNET_LIBS@ @FUSE_LIBS@
-dbfs_SOURCES = dbfs.c dbfs.h
+dbfs_SOURCES = dbfs.c dbfs.h dbfs-backend.c
dbfs_LDADD = @GNET_LIBS@ @FUSE_LIBS@ @DB_LIBS@
EXTRA_DIST = autogen.sh
diff --git a/dbfs-backend.c b/dbfs-backend.c
new file mode 100644
index 0000000..11ee423
--- /dev/null
+++ b/dbfs-backend.c
@@ -0,0 +1,219 @@
+
+#define FUSE_USE_VERSION 25
+
+#include <fuse_lowlevel.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <assert.h>
+#include <glib.h>
+#include <db.h>
+#include "dbfs.h"
+
+struct dbfs_lookup_info {
+ const char *name;
+ size_t namelen;
+ guint64 *ino;
+};
+
+static DB_ENV *env;
+static DB *db_data;
+static DB *db_meta;
+
+void dbfs_dummy1(void)
+{
+ (void) env;
+ (void) db_data;
+}
+
+int dbfs_read_inode(guint64 ino_n, struct dbfs_inode **ino_out)
+{
+ int rc;
+ DBT key, val;
+ char key_str[32];
+ struct dbfs_raw_inode *raw_ino;
+ struct dbfs_inode *ino;
+ size_t ex_sz, i;
+
+ memset(&key, 0, sizeof(key));
+ memset(&val, 0, sizeof(val));
+
+ sprintf(key_str, "/inode/%Lu", (unsigned long long) ino_n);
+
+ 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 -ENOENT;
+ if (rc)
+ return rc;
+
+ raw_ino = val.data;
+ raw_ino->ino = GUINT64_FROM_LE(raw_ino->ino);
+ raw_ino->generation = GUINT64_FROM_LE(raw_ino->generation);
+ raw_ino->mode = GUINT32_FROM_LE(raw_ino->mode);
+ raw_ino->nlink = GUINT32_FROM_LE(raw_ino->nlink);
+ raw_ino->uid = GUINT32_FROM_LE(raw_ino->uid);
+ raw_ino->gid = GUINT32_FROM_LE(raw_ino->gid);
+ raw_ino->rdev = GUINT64_FROM_LE(raw_ino->rdev);
+ raw_ino->size = GUINT64_FROM_LE(raw_ino->size);
+ raw_ino->ctime = GUINT64_FROM_LE(raw_ino->ctime);
+ raw_ino->atime = GUINT64_FROM_LE(raw_ino->atime);
+ raw_ino->mtime = GUINT64_FROM_LE(raw_ino->mtime);
+
+ ex_sz = val.size - sizeof(struct dbfs_raw_inode);
+ i = sizeof(struct dbfs_inode) - sizeof(struct dbfs_raw_inode);
+
+ ino = g_malloc(i + ex_sz + sizeof(struct dbfs_raw_inode));
+ memcpy(&ino->raw_inode, raw_ino, val.size);
+ ino->n_extents = ex_sz / sizeof(struct dbfs_extent);
+
+ *ino_out = ino;
+
+ free(val.data);
+
+ return 0;
+}
+
+int dbfs_read_dir(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, "/dir/%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 -ENOTDIR;
+ return rc;
+}
+
+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;
+}
+
+int dbfs_dir_foreach(void *dir, dbfs_dir_actor_t func, void *userdata)
+{
+ struct dbfs_dirent *de;
+ void *p;
+ int rc = 0;
+
+ p = dir;
+ while (1) {
+ de = p;
+ de->magic = GUINT32_FROM_LE(de->magic);
+ de->namelen = GUINT16_FROM_LE(de->namelen);
+ de->ino = GUINT64_FROM_LE(de->ino);
+
+ g_assert (de->magic == DBFS_DE_MAGIC);
+ if (!de->namelen)
+ break;
+
+ rc = func(de, userdata);
+ if (rc)
+ break;
+
+ p += sizeof(struct dbfs_dirent) + de->namelen +
+ (4 - (de->namelen & 0x3));
+ }
+
+ return rc;
+}
+
+static int dbfs_dir_cmp(struct dbfs_dirent *de, void *userdata)
+{
+ struct dbfs_lookup_info *li = userdata;
+
+ if ((li->namelen == de->namelen) &&
+ (!memcmp(li->name, de->name, li->namelen))) {
+ *li->ino = de->ino;
+ return 1;
+ }
+
+ return 0;
+}
+
+int dbfs_lookup(guint64 parent, const char *name, guint64 *ino)
+{
+ struct dbfs_lookup_info li;
+ size_t namelen = strlen(name);
+ DBT val;
+ int rc;
+
+ *ino = 0;
+
+ rc = dbfs_read_dir(parent, &val);
+ if (rc)
+ return rc;
+
+ li.name = name;
+ li.namelen = namelen;
+ li.ino = ino;
+ rc = dbfs_dir_foreach(val.data, dbfs_dir_cmp, &li);
+ if (rc)
+ rc = 0;
+ else
+ rc = -ENOENT;
+
+ free(val.data);
+ return rc;
+}
+
+int dbfs_unlink(guint64 parent, const char *name)
+{
+ struct dbfs_inode *ino;
+ guint64 ino_n;
+ int rc;
+
+ rc = dbfs_lookup(parent, name, &ino_n);
+ if (rc)
+ goto err_out;
+
+ rc = dbfs_read_inode(ino_n, &ino);
+ if (rc)
+ goto err_out;
+
+ /* FIXME stopped working here...
+
+ * delete dir entry
+ * decrement n_links
+ * if n_links==0, delete inode
+ */
+
+err_out:
+ return 0; /* FIXME */
+}
+
diff --git a/dbfs.c b/dbfs.c
index d1e0395..70f2e83 100644
--- a/dbfs.c
+++ b/dbfs.c
@@ -13,211 +13,6 @@
#include <db.h>
#include "dbfs.h"
-struct dbfs_inode {
- unsigned int n_extents;
- struct dbfs_raw_inode raw_inode;
-};
-
-struct dbfs_lookup_info {
- const char *name;
- size_t namelen;
- guint64 *ino;
-};
-
-static DB_ENV *env;
-static DB *db_data;
-static DB *db_meta;
-
-static int dbfs_read_inode(guint64 ino_n, struct dbfs_inode **ino_out)
-{
- int rc;
- DBT key, val;
- char key_str[32];
- struct dbfs_raw_inode *raw_ino;
- struct dbfs_inode *ino;
- size_t ex_sz, i;
-
- memset(&key, 0, sizeof(key));
- memset(&val, 0, sizeof(val));
-
- sprintf(key_str, "/inode/%Lu", (unsigned long long) ino_n);
-
- 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 -ENOENT;
- if (rc)
- return rc;
-
- raw_ino = val.data;
- raw_ino->ino = GUINT64_FROM_LE(raw_ino->ino);
- raw_ino->generation = GUINT64_FROM_LE(raw_ino->generation);
- raw_ino->mode = GUINT32_FROM_LE(raw_ino->mode);
- raw_ino->nlink = GUINT32_FROM_LE(raw_ino->nlink);
- raw_ino->uid = GUINT32_FROM_LE(raw_ino->uid);
- raw_ino->gid = GUINT32_FROM_LE(raw_ino->gid);
- raw_ino->rdev = GUINT64_FROM_LE(raw_ino->rdev);
- raw_ino->size = GUINT64_FROM_LE(raw_ino->size);
- raw_ino->ctime = GUINT64_FROM_LE(raw_ino->ctime);
- raw_ino->atime = GUINT64_FROM_LE(raw_ino->atime);
- raw_ino->mtime = GUINT64_FROM_LE(raw_ino->mtime);
-
- ex_sz = val.size - sizeof(struct dbfs_raw_inode);
- i = sizeof(struct dbfs_inode) - sizeof(struct dbfs_raw_inode);
-
- ino = g_malloc(i + ex_sz + sizeof(struct dbfs_raw_inode));
- memcpy(&ino->raw_inode, raw_ino, val.size);
- ino->n_extents = ex_sz / sizeof(struct dbfs_extent);
-
- *ino_out = ino;
-
- free(val.data);
-
- return 0;
-}
-
-static int dbfs_read_dir(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, "/dir/%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 -ENOTDIR;
- 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)
-{
- struct dbfs_dirent *de;
- void *p;
- int rc = 0;
-
- p = dir;
- while (1) {
- de = p;
- de->magic = GUINT32_FROM_LE(de->magic);
- de->namelen = GUINT16_FROM_LE(de->namelen);
- de->ino = GUINT64_FROM_LE(de->ino);
-
- g_assert (de->magic == DBFS_DE_MAGIC);
- if (!de->namelen)
- break;
-
- rc = func(de, userdata);
- if (rc)
- break;
-
- p += sizeof(struct dbfs_dirent) + de->namelen +
- (4 - (de->namelen & 0x3));
- }
-
- return rc;
-}
-
-static int dbfs_dir_cmp(struct dbfs_dirent *de, void *userdata)
-{
- struct dbfs_lookup_info *li = userdata;
-
- if ((li->namelen == de->namelen) &&
- (!memcmp(li->name, de->name, li->namelen))) {
- *li->ino = de->ino;
- return 1;
- }
-
- return 0;
-}
-
-static int dbfs_lookup(guint64 parent, const char *name, guint64 *ino)
-{
- struct dbfs_lookup_info li;
- size_t namelen = strlen(name);
- DBT val;
- int rc;
-
- *ino = 0;
-
- rc = dbfs_read_dir(parent, &val);
- if (rc)
- return rc;
-
- li.name = name;
- li.namelen = namelen;
- li.ino = ino;
- rc = dbfs_dir_foreach(val.data, dbfs_dir_cmp, &li);
- if (rc)
- rc = 0;
- else
- rc = -ENOENT;
-
- free(val.data);
- return rc;
-}
-
-static int dbfs_unlink(guint64 parent, const char *name)
-{
- struct dbfs_inode *ino;
- guint64 ino_n;
- int rc;
-
- rc = dbfs_lookup(parent, name, &ino_n);
- if (rc)
- goto err_out;
-
- rc = dbfs_read_inode(ino_n, &ino);
- if (rc)
- goto err_out;
-
- /* FIXME stopped working here...
-
- * delete dir entry
- * decrement n_links
- * if n_links==0, delete inode
- */
-
-err_out:
- return 0; /* FIXME */
-}
-
static void dbfs_op_getattr(fuse_req_t req, fuse_ino_t ino_n,
struct fuse_file_info *fi)
{
@@ -466,9 +261,6 @@ int main(int argc, char *argv[])
int err = -1;
int fd;
- (void) env;
- (void) db_data;
-
if (fuse_parse_cmdline(&args, &mountpoint, NULL, NULL) != -1 &&
(fd = fuse_mount(mountpoint, &args)) != -1) {
struct fuse_session *se;
diff --git a/dbfs.h b/dbfs.h
index 5a4f539..a34ccd2 100644
--- a/dbfs.h
+++ b/dbfs.h
@@ -41,4 +41,19 @@ struct dbfs_raw_inode {
struct dbfs_extent blocks[0];
};
+struct dbfs_inode {
+ unsigned int n_extents;
+ struct dbfs_raw_inode raw_inode;
+};
+
+
+typedef int (*dbfs_dir_actor_t) (struct dbfs_dirent *, void *);
+
+extern int dbfs_read_inode(guint64 ino_n, struct dbfs_inode **ino_out);
+extern int dbfs_read_dir(guint64 ino, DBT *val);
+extern int dbfs_read_link(guint64 ino, DBT *val);
+extern int dbfs_dir_foreach(void *dir, dbfs_dir_actor_t func, void *userdata);
+extern int dbfs_lookup(guint64 parent, const char *name, guint64 *ino);
+extern int dbfs_unlink(guint64 parent, const char *name);
+
#endif /* __DBFS_H__ */