]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/test/external-agent.c
check_type: fix incorrect documentation.
[ccan] / ccan / tdb2 / test / external-agent.c
index 081b8500a0fb206ab2ec239e94d9bb333f399516..01c7106fba103892cedf0ec685745d382788c6fc 100644 (file)
 #include <limits.h>
 #include <string.h>
 #include <errno.h>
-#include <ccan/tdb2/private.h>
+#include <ccan/tdb2/tdb1_private.h>
 #include <ccan/tap/tap.h>
 #include <stdio.h>
 #include <stdarg.h>
 
 static struct tdb_context *tdb;
 
+void (*external_agent_free)(void *) = free;
+
 static enum TDB_ERROR clear_if_first(int fd, void *arg)
 {
-/* We hold a lock offset 63 always, so we can tell if anyone is holding it. */
+/* We hold a lock offset 4 always, so we can tell if anyone is holding it.
+ * (This is compatible with tdb1's TDB_CLEAR_IF_FIRST flag).  */
        struct flock fl;
 
        fl.l_type = F_WRLCK;
        fl.l_whence = SEEK_SET;
-       fl.l_start = 63;
+       fl.l_start = 4;
        fl.l_len = 1;
 
        if (fcntl(fd, F_SETLK, &fl) == 0) {
@@ -99,10 +102,10 @@ static enum agent_return do_operation(enum operation op, const char *name)
                        ret = OTHER_FAILURE;
                } else if (!tdb_deq(data, k)) {
                        ret = OTHER_FAILURE;
-                       free(data.dptr);
+                       external_agent_free(data.dptr);
                } else {
                        ret = SUCCESS;
-                       free(data.dptr);
+                       external_agent_free(data.dptr);
                }
                break;
        case STORE:
@@ -115,7 +118,10 @@ static enum agent_return do_operation(enum operation op, const char *name)
                ret = tdb_transaction_commit(tdb)==0 ? SUCCESS : OTHER_FAILURE;
                break;
        case NEEDS_RECOVERY:
-               ret = tdb_needs_recovery(tdb) ? SUCCESS : FAILED;
+               if (tdb->flags & TDB_VERSION1)
+                       ret = tdb1_needs_recovery(tdb) ? SUCCESS : FAILED;
+               else
+                       ret = tdb_needs_recovery(tdb) ? SUCCESS : FAILED;
                break;
        case CHECK:
                ret = tdb_check(tdb, NULL, NULL) == 0 ? SUCCESS : OTHER_FAILURE;
@@ -124,6 +130,10 @@ static enum agent_return do_operation(enum operation op, const char *name)
                ret = tdb_close(tdb) == 0 ? SUCCESS : OTHER_FAILURE;
                tdb = NULL;
                break;
+       case SEND_SIGNAL:
+               /* We do this async */
+               ret = SUCCESS;
+               break;
        default:
                ret = OTHER_FAILURE;
        }
@@ -175,6 +185,13 @@ struct agent *prepare_external_agent(void)
                if (write(response[1], &result, sizeof(result))
                    != sizeof(result))
                        err(1, "Writing response");
+               if (name[0] == SEND_SIGNAL) {
+                       struct timeval ten_ms;
+                       ten_ms.tv_sec = 0;
+                       ten_ms.tv_usec = 10000;
+                       select(0, NULL, NULL, NULL, &ten_ms);
+                       kill(getppid(), SIGUSR1);
+               }
        }
        exit(0);
 }
@@ -225,6 +242,7 @@ const char *operation_name(enum operation op)
        case TRANSACTION_START: return "TRANSACTION_START";
        case TRANSACTION_COMMIT: return "TRANSACTION_COMMIT";
        case NEEDS_RECOVERY: return "NEEDS_RECOVERY";
+       case SEND_SIGNAL: return "SEND_SIGNAL";
        case CLOSE: return "CLOSE";
        }
        return "**INVALID**";