Browse Source

io/fdpass: add flag to close fd after sending.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 9 years ago
parent
commit
60e31637d7
3 changed files with 11 additions and 6 deletions
  1. 4 0
      ccan/io/fdpass/fdpass.c
  2. 6 5
      ccan/io/fdpass/fdpass.h
  3. 1 1
      ccan/io/fdpass/test/run.c

+ 4 - 0
ccan/io/fdpass/fdpass.c

@@ -12,17 +12,21 @@ static int do_fd_send(int fd, struct io_plan_arg *arg)
 			return 0;
 			return 0;
 		return -1;
 		return -1;
 	}
 	}
+	if (arg->u2.s)
+		close(arg->u1.s);
 	return 1;
 	return 1;
 }
 }
 
 
 struct io_plan *io_send_fd_(struct io_conn *conn,
 struct io_plan *io_send_fd_(struct io_conn *conn,
 			    int fd,
 			    int fd,
+			    bool fdclose,
 			    struct io_plan *(*next)(struct io_conn *, void *),
 			    struct io_plan *(*next)(struct io_conn *, void *),
 			    void *next_arg)
 			    void *next_arg)
 {
 {
 	struct io_plan_arg *arg = io_plan_arg(conn, IO_OUT);
 	struct io_plan_arg *arg = io_plan_arg(conn, IO_OUT);
 
 
 	arg->u1.s = fd;
 	arg->u1.s = fd;
+	arg->u2.s = fdclose;
 
 
 	return io_set_plan(conn, IO_OUT, do_fd_send, next, next_arg);
 	return io_set_plan(conn, IO_OUT, do_fd_send, next, next_arg);
 }
 }

+ 6 - 5
ccan/io/fdpass/fdpass.h

@@ -7,6 +7,7 @@
  * io_send_fd - output plan to send a file descriptor
  * io_send_fd - output plan to send a file descriptor
  * @conn: the connection that plan is for.
  * @conn: the connection that plan is for.
  * @fd: the file descriptor to pass.
  * @fd: the file descriptor to pass.
+ * @fdclose: true to close fd after successful sending.
  * @next: function to call output is done.
  * @next: function to call output is done.
  * @arg: @next argument
  * @arg: @next argument
  *
  *
@@ -22,17 +23,17 @@
  * Example:
  * Example:
  * static struct io_plan *fd_to_conn(struct io_conn *conn, int fd)
  * static struct io_plan *fd_to_conn(struct io_conn *conn, int fd)
  * {
  * {
- *	// Write fd, then close.
- *	return io_send_fd(conn, fd, io_close_cb, NULL);
+ *	// Write fd, then close conn.
+ *	return io_send_fd(conn, fd, false, io_close_cb, NULL);
  * }
  * }
  */
  */
-#define io_send_fd(conn, fd, next, arg)					\
-	io_send_fd_((conn), (fd),					\
+#define io_send_fd(conn, fd, fdclose, next, arg)			\
+	io_send_fd_((conn), (fd), (fdclose),				\
 		    typesafe_cb_preargs(struct io_plan *, void *,	\
 		    typesafe_cb_preargs(struct io_plan *, void *,	\
 					(next), (arg), struct io_conn *), \
 					(next), (arg), struct io_conn *), \
 		    (arg))
 		    (arg))
 struct io_plan *io_send_fd_(struct io_conn *conn,
 struct io_plan *io_send_fd_(struct io_conn *conn,
-			    int fd,
+			    int fd, bool fdclose,
 			    struct io_plan *(*next)(struct io_conn *, void *),
 			    struct io_plan *(*next)(struct io_conn *, void *),
 			    void *arg);
 			    void *arg);
 
 

+ 1 - 1
ccan/io/fdpass/test/run.c

@@ -28,7 +28,7 @@ static struct io_plan *try_writing(struct io_conn *conn, int *pfd)
 
 
 static struct io_plan *send_fd(struct io_conn *conn, int *pfd)
 static struct io_plan *send_fd(struct io_conn *conn, int *pfd)
 {
 {
-	return io_send_fd(conn, pfd[0], try_writing, pfd);
+	return io_send_fd(conn, pfd[0], true, try_writing, pfd);
 }
 }
 
 
 int main(void)
 int main(void)