Browse Source

Don't rely on terrible dup2 trick, use proper infrastructure for external agent.

Rusty Russell 16 years ago
parent
commit
450a9a4c70

+ 15 - 10
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)

+ 2 - 2
ccan/tdb/test/external-transaction.h

@@ -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 */

+ 2 - 2
ccan/tdb/test/run-nested-traverse.c

@@ -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,

+ 2 - 2
ccan/tdb/test/run-traverse-in-transaction.c

@@ -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,