aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-08-04 11:07:37 -0400
committerJeff Garzik <jeff@garzik.org>2006-08-04 11:07:37 -0400
commit073e2ad9220f6aef4ecd6512d4800e57e6063b57 (patch)
treeae19f8ffa1808dacf301f49171b8150793f587a9
parent31a6352886789f6fb36190374b10eecf0cfbb14d (diff)
downloaddbfs-073e2ad9220f6aef4ecd6512d4800e57e6063b57.tar.gz
Add filesystem check program 'dbfsck'.
All it does right now is execute Berkeley DB's internal database recovery code. None of the internal data structures are yet checked.
-rw-r--r--.gitignore1
-rw-r--r--Makefile.am5
-rw-r--r--dbfs.c2
-rw-r--r--dbfs.h2
-rw-r--r--dbfsck.c21
-rw-r--r--libdbfs.c4
-rw-r--r--mkdbfs.c2
7 files changed, 31 insertions, 6 deletions
diff --git a/.gitignore b/.gitignore
index 874c5e3..9b2a912 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,6 +22,7 @@ stamp-h1
# app-specific
mkdbfs
dbfs
+dbfsck
dbfs-config.h*
libdbfs.a
diff --git a/Makefile.am b/Makefile.am
index cbc139d..dcf51fc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -6,7 +6,7 @@ INCLUDES = @GLIB_CFLAGS@ @FUSE_CFLAGS@
noinst_LIBRARIES = libdbfs.a
-sbin_PROGRAMS = dbfs mkdbfs
+sbin_PROGRAMS = dbfs mkdbfs dbfsck
libdbfs_a_SOURCES = libdbfs.c
@@ -16,5 +16,8 @@ dbfs_LDADD = @GLIB_LIBS@ @FUSE_LIBS@ @DB_LIBS@ libdbfs.a
mkdbfs_SOURCES = mkdbfs.c
mkdbfs_LDADD = @GLIB_LIBS@ @DB_LIBS@ libdbfs.a
+dbfsck_SOURCES = dbfsck.c
+dbfsck_LDADD = @GLIB_LIBS@ @DB_LIBS@ libdbfs.a
+
EXTRA_DIST = autogen.sh SCHEMA
diff --git a/dbfs.c b/dbfs.c
index 5fb7b41..862724c 100644
--- a/dbfs.c
+++ b/dbfs.c
@@ -42,7 +42,7 @@ static void dbfs_op_init(void *userdata)
fs = dbfs_new();
- rc = dbfs_open(fs, 0, "dbfs");
+ rc = dbfs_open(fs, 0, 0, "dbfs");
if (rc)
abort(); /* TODO: improve */
diff --git a/dbfs.h b/dbfs.h
index 756c1ee..72b3f65 100644
--- a/dbfs.h
+++ b/dbfs.h
@@ -114,7 +114,7 @@ extern int dbfs_xattr_remove(guint64, const char *, gboolean);
extern int dbfs_xattr_list(guint64 ino, void **buf_out, size_t *buflen_out);
/* libdbfs.c */
-extern int dbfs_open(struct dbfs *, unsigned int, const char *);
+extern int dbfs_open(struct dbfs *, unsigned int, unsigned int, const char *);
extern void dbfs_close(struct dbfs *fs);
extern struct dbfs *dbfs_new(void);
extern void dbfs_free(struct dbfs *fs);
diff --git a/dbfsck.c b/dbfsck.c
new file mode 100644
index 0000000..e9f667d
--- /dev/null
+++ b/dbfsck.c
@@ -0,0 +1,21 @@
+
+#include <db.h>
+#include "dbfs.h"
+
+int main (int argc, char *argv[])
+{
+ struct dbfs *fs;
+ int rc;
+
+ fs = dbfs_new();
+
+ rc = dbfs_open(fs, DB_RECOVER, 0, "dbfsck");
+ if (rc) {
+ perror("dbfsck");
+ return 1;
+ }
+
+ dbfs_close(fs);
+ return 0;
+}
+
diff --git a/libdbfs.c b/libdbfs.c
index 8a6bcd0..bcc74c3 100644
--- a/libdbfs.c
+++ b/libdbfs.c
@@ -9,7 +9,7 @@
struct dbfs *gfs;
-int dbfs_open(struct dbfs *fs, unsigned int flags, const char *errpfx)
+int dbfs_open(struct dbfs *fs, unsigned int env_flags, unsigned int flags, const char *errpfx)
{
const char *db_home, *db_password;
int rc;
@@ -53,7 +53,7 @@ int dbfs_open(struct dbfs *fs, unsigned int flags, const char *errpfx)
/* init DB transactional environment, stored in directory db_home */
rc = fs->env->open(fs->env, db_home,
DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL |
- DB_INIT_TXN | DB_RECOVER | flags, 0666);
+ DB_INIT_TXN | env_flags | flags, 0666);
if (rc) {
fs->env->err(fs->env, rc, "fs->env->open");
goto err_out;
diff --git a/mkdbfs.c b/mkdbfs.c
index 74a7051..300519f 100644
--- a/mkdbfs.c
+++ b/mkdbfs.c
@@ -50,7 +50,7 @@ err_die:
int main (int argc, char *argv[])
{
struct dbfs *fs = dbfs_new();
- int rc = dbfs_open(fs, DB_CREATE | DB_TRUNCATE, "mkdbfs");
+ int rc = dbfs_open(fs, 0, DB_CREATE | DB_TRUNCATE, "mkdbfs");
if (rc) {
perror("mkdbfs");
exit(1);