From: Rusty Russell Date: Tue, 18 Aug 2009 02:31:18 +0000 (+0930) Subject: Don't rely on terrible dup2 trick, use proper infrastructure for external agent. X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=450a9a4c70af36f3be1eb572d513ffebf25c3797 Don't rely on terrible dup2 trick, use proper infrastructure for external agent. --- diff --git a/ccan/tdb/test/external-transaction.c b/ccan/tdb/test/external-transaction.c index c1442c21..c03dbc49 100644 --- a/ccan/tdb/test/external-transaction.c +++ b/ccan/tdb/test/external-transaction.c @@ -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) diff --git a/ccan/tdb/test/external-transaction.h b/ccan/tdb/test/external-transaction.h index 8f28a624..62a4803b 100644 --- a/ccan/tdb/test/external-transaction.h +++ b/ccan/tdb/test/external-transaction.h @@ -3,9 +3,9 @@ #include /* 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 */ diff --git a/ccan/tdb/test/run-nested-traverse.c b/ccan/tdb/test/run-nested-traverse.c index df4c7da1..2d7193ef 100644 --- a/ccan/tdb/test/run-nested-traverse.c +++ b/ccan/tdb/test/run-nested-traverse.c @@ -14,7 +14,7 @@ #include #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, diff --git a/ccan/tdb/test/run-traverse-in-transaction.c b/ccan/tdb/test/run-traverse-in-transaction.c index e8d6819a..0043a98e 100644 --- a/ccan/tdb/test/run-traverse-in-transaction.c +++ b/ccan/tdb/test/run-traverse-in-transaction.c @@ -14,7 +14,7 @@ #include #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,