tdb2: save openhook, allow tdb_get_attribute() on it.
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 31 Aug 2011 05:36:25 +0000 (15:06 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 31 Aug 2011 05:36:25 +0000 (15:06 +0930)
This makes it easy to call it again after a fork(), such as for
re-establishing the CLEAR_IF_FIRST files locks.

ccan/tdb2/open.c
ccan/tdb2/private.h
ccan/tdb2/tdb2.h
ccan/tdb2/test/failtest_helper.h

index 68f707b920ec8cf72bcf66b9788c1abd25bc26c0..277a95f9e8ba7bb72caed6ac434f7ccb798ebc1c 100644 (file)
@@ -270,11 +270,11 @@ enum TDB_ERROR tdb_get_attribute(struct tdb_context *tdb,
                attr->seed.seed = tdb->hash_seed;
                break;
        case TDB_ATTRIBUTE_OPENHOOK:
                attr->seed.seed = tdb->hash_seed;
                break;
        case TDB_ATTRIBUTE_OPENHOOK:
-               return tdb->last_error
-                       = tdb_logerr(tdb, TDB_ERR_EINVAL,
-                                    TDB_LOG_USE_ERROR,
-                                    "tdb_get_attribute:"
-                                    " cannot get TDB_ATTRIBUTE_OPENHOOK");
+               if (!tdb->openhook)
+                       return tdb->last_error = TDB_ERR_NOEXIST;
+               attr->openhook.fn = tdb->openhook;
+               attr->openhook.data = tdb->openhook_data;
+               break;
        case TDB_ATTRIBUTE_STATS: {
                size_t size = attr->stats.size;
                if (size > tdb->stats.size)
        case TDB_ATTRIBUTE_STATS: {
                size_t size = attr->stats.size;
                if (size > tdb->stats.size)
@@ -306,16 +306,16 @@ void tdb_unset_attribute(struct tdb_context *tdb,
        case TDB_ATTRIBUTE_LOG:
                tdb->log_fn = NULL;
                break;
        case TDB_ATTRIBUTE_LOG:
                tdb->log_fn = NULL;
                break;
+       case TDB_ATTRIBUTE_OPENHOOK:
+               tdb->openhook = NULL;
+               break;
        case TDB_ATTRIBUTE_HASH:
        case TDB_ATTRIBUTE_SEED:
        case TDB_ATTRIBUTE_HASH:
        case TDB_ATTRIBUTE_SEED:
-       case TDB_ATTRIBUTE_OPENHOOK:
                tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
                           "tdb_unset_attribute: cannot unset %s after opening",
                           type == TDB_ATTRIBUTE_HASH
                           ? "TDB_ATTRIBUTE_HASH"
                tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
                           "tdb_unset_attribute: cannot unset %s after opening",
                           type == TDB_ATTRIBUTE_HASH
                           ? "TDB_ATTRIBUTE_HASH"
-                          : type == TDB_ATTRIBUTE_SEED
-                          ? "TDB_ATTRIBUTE_SEED"
-                          : "TDB_ATTRIBUTE_OPENHOOK");
+                          : "TDB_ATTRIBUTE_SEED");
                break;
        case TDB_ATTRIBUTE_STATS:
                tdb_logerr(tdb, TDB_ERR_EINVAL,
                break;
        case TDB_ATTRIBUTE_STATS:
                tdb_logerr(tdb, TDB_ERR_EINVAL,
@@ -347,7 +347,6 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
        ssize_t rlen;
        struct tdb_header hdr;
        struct tdb_attribute_seed *seed = NULL;
        ssize_t rlen;
        struct tdb_header hdr;
        struct tdb_attribute_seed *seed = NULL;
-       struct tdb_attribute_openhook *openhook = NULL;
        tdb_bool_err berr;
        enum TDB_ERROR ecode;
        int openlock;
        tdb_bool_err berr;
        enum TDB_ERROR ecode;
        int openlock;
@@ -372,6 +371,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
        tdb->open_flags = open_flags;
        tdb->last_error = TDB_SUCCESS;
        tdb->file = NULL;
        tdb->open_flags = open_flags;
        tdb->last_error = TDB_SUCCESS;
        tdb->file = NULL;
+       tdb->openhook = NULL;
        tdb->lock_fn = tdb_fcntl_lock;
        tdb->unlock_fn = tdb_fcntl_unlock;
        tdb->hash_fn = jenkins_hash;
        tdb->lock_fn = tdb_fcntl_lock;
        tdb->unlock_fn = tdb_fcntl_unlock;
        tdb->hash_fn = jenkins_hash;
@@ -390,7 +390,8 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
                        seed = &attr->seed;
                        break;
                case TDB_ATTRIBUTE_OPENHOOK:
                        seed = &attr->seed;
                        break;
                case TDB_ATTRIBUTE_OPENHOOK:
-                       openhook = &attr->openhook;
+                       tdb->openhook = attr->openhook.fn;
+                       tdb->openhook_data = attr->openhook.data;
                        break;
                default:
                        /* These are set as normal. */
                        break;
                default:
                        /* These are set as normal. */
@@ -498,8 +499,8 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
        }
 
        /* call their open hook if they gave us one. */
        }
 
        /* call their open hook if they gave us one. */
-       if (openhook) {
-               ecode = openhook->fn(tdb->file->fd, openhook->data);
+       if (tdb->openhook) {
+               ecode = tdb->openhook(tdb->file->fd, tdb->openhook_data);
                if (ecode != TDB_SUCCESS) {
                        tdb_logerr(tdb, ecode, TDB_LOG_ERROR,
                                   "tdb_open: open hook failed");
                if (ecode != TDB_SUCCESS) {
                        tdb_logerr(tdb, ecode, TDB_LOG_ERROR,
                                   "tdb_open: open hook failed");
index efc3a98d8cf34ff67e2709018bc6681ef006182b..4d0dfd775de13f7c2770397fa20ab5bd057f956d 100644 (file)
@@ -362,6 +362,10 @@ struct tdb_context {
        tdb_off_t ftable_off;
        unsigned int ftable;
 
        tdb_off_t ftable_off;
        unsigned int ftable;
 
+       /* Our open hook, if any. */
+       enum TDB_ERROR (*openhook)(int fd, void *data);
+       void *openhook_data;
+
        /* IO methods: changes for transactions. */
        const struct tdb_methods *methods;
 
        /* IO methods: changes for transactions. */
        const struct tdb_methods *methods;
 
index 051d20a411d8e2d2e71675b05f000a33dff749ae..7a7aaca90fbfa7715749c5329fb447b63831b432 100644 (file)
@@ -617,8 +617,6 @@ enum tdb_attribute_type {
  * This gets an attribute from a TDB which has previously been set (or
  * may return the default values).  Set @attr.base.attr to the
  * attribute type you want get.
  * This gets an attribute from a TDB which has previously been set (or
  * may return the default values).  Set @attr.base.attr to the
  * attribute type you want get.
- *
- * Currently this does not work for TDB_ATTRIBUTE_OPENHOOK.
  */
 enum TDB_ERROR tdb_get_attribute(struct tdb_context *tdb,
                                 union tdb_attribute *attr);
  */
 enum TDB_ERROR tdb_get_attribute(struct tdb_context *tdb,
                                 union tdb_attribute *attr);
index 7d3ce7605cba6f9c5f9b3cd38051106e82c04a9c..73cd1aeb1ece516092d1bcfd9cea18040862b51f 100644 (file)
@@ -4,7 +4,7 @@
 #include <stdbool.h>
 
 /* FIXME: Check these! */
 #include <stdbool.h>
 
 /* FIXME: Check these! */
-#define INITIAL_TDB_MALLOC     "open.c", 355, FAILTEST_MALLOC
+#define INITIAL_TDB_MALLOC     "open.c", 354, FAILTEST_MALLOC
 #define URANDOM_OPEN           "open.c", 62, FAILTEST_OPEN
 #define URANDOM_READ           "open.c", 42, FAILTEST_READ
 
 #define URANDOM_OPEN           "open.c", 62, FAILTEST_OPEN
 #define URANDOM_READ           "open.c", 42, FAILTEST_READ