Don't rely on terrible dup2 trick, use proper infrastructure for external agent.
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 18 Aug 2009 02:31:18 +0000 (12:01 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 18 Aug 2009 02:31:18 +0000 (12:01 +0930)
ccan/tdb/test/external-transaction.c
ccan/tdb/test/external-transaction.h
ccan/tdb/test/run-nested-traverse.c
ccan/tdb/test/run-traverse-in-transaction.c

index c1442c215d6b0af3da35e4dff499c9b1c72cf6ae..c03dbc49f6320afd386a5e9f89a2bad936034cf8 100644 (file)
@@ -51,9 +51,12 @@ maybe_alarmed:
        return -3;
 }
 
+struct agent {
+       int cmdfd, responsefd;
+};
 
-/* Do this before doing any tdb stuff.  Return handle, or -1. */
-int prepare_external_agent(void)
+/* Do this before doing any tdb stuff.  Return handle, or NULL. */
+struct agent *prepare_external_agent(void)
 {
        int pid;
        int command[2], response[2];
@@ -61,18 +64,20 @@ int prepare_external_agent(void)
        char name[PATH_MAX];
 
        if (pipe(command) != 0 || pipe(response) != 0)
-               return -1;
+               return NULL;
 
        pid = fork();
        if (pid < 0)
-               return -1;
+               return NULL;
 
        if (pid != 0) {
+               struct agent *agent = malloc(sizeof(*agent));
+
                close(command[0]);
                close(response[1]);
-               /* FIXME: Make fds consective. */
-               dup2(command[1]+1, response[1]);
-               return command[1];
+               agent->cmdfd = command[1];
+               agent->responsefd = response[0];
+               return agent;
        }
 
        close(command[1]);
@@ -89,15 +94,15 @@ int prepare_external_agent(void)
 }
 
 /* Ask the external agent to try to do a transaction. */
-bool external_agent_transaction(int handle, const char *tdbname)
+bool external_agent_transaction(struct agent *agent, const char *tdbname)
 {
        int res;
 
-       if (write(handle, tdbname, strlen(tdbname)+1)
+       if (write(agent->cmdfd, tdbname, strlen(tdbname)+1)
            != strlen(tdbname)+1)
                err(1, "Writing to agent");
 
-       if (read(handle+1, &res, sizeof(res)) != sizeof(res))
+       if (read(agent->responsefd, &res, sizeof(res)) != sizeof(res))
                err(1, "Reading from agent");
 
        if (res > 1)
index 8f28a624e4ad5298aad3c35144c169c90dfa55f2..62a4803bc0ebcd4dd905de608bfe3c9b0549a48a 100644 (file)
@@ -3,9 +3,9 @@
 #include <stdbool.h>
 
 /* Do this before doing any tdb stuff.  Return handle, or -1. */
-int prepare_external_agent(void);
+struct agent *prepare_external_agent(void);
 
 /* Ask the external agent to try to do a transaction. */
-bool external_agent_transaction(int handle, const char *tdbname);
+bool external_agent_transaction(struct agent *handle, const char *tdbname);
 
 #endif /* TDB_TEST_EXTERNAL_TRANSACTION_H */
index df4c7da13374d8befdcc37aa1a79590717e9d739..2d7193efcc407027c93dc4d6d5fbb0fc519c9502 100644 (file)
@@ -14,7 +14,7 @@
 #include <err.h>
 #include "external-transaction.h"
 
-static int agent;
+static struct agent *agent;
 
 static bool correct_key(TDB_DATA key)
 {
@@ -56,7 +56,7 @@ int main(int argc, char *argv[])
 
        plan_tests(15);
        agent = prepare_external_agent();
-       if (agent < 0)
+       if (!agent)
                err(1, "preparing agent");
 
        tdb = tdb_open("/tmp/test3.tdb", 1024, TDB_CLEAR_IF_FIRST,
index e8d6819a93be99f3c2c52632e6deac8b488e3859..0043a98eaf3a714b2f99adc9b7bb04cd5423a11e 100644 (file)
@@ -14,7 +14,7 @@
 #include <err.h>
 #include "external-transaction.h"
 
-static int agent;
+static struct agent *agent;
 
 static bool correct_key(TDB_DATA key)
 {
@@ -43,7 +43,7 @@ int main(int argc, char *argv[])
 
        plan_tests(13);
        agent = prepare_external_agent();
-       if (agent < 0)
+       if (!agent)
                err(1, "preparing agent");
 
        tdb = tdb_open("/tmp/test2.tdb", 1024, TDB_CLEAR_IF_FIRST,