io/fdpass: add flag to close fd after sending.
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 14 Mar 2017 02:47:15 +0000 (13:17 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 14 Mar 2017 02:47:15 +0000 (13:17 +1030)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/io/fdpass/fdpass.c
ccan/io/fdpass/fdpass.h
ccan/io/fdpass/test/run.c

index 11208a9b652fa41d7c325db753ba5e5ba06cbe0c..63c46223691311f7db2eade98c961face21d4b34 100644 (file)
@@ -12,17 +12,21 @@ static int do_fd_send(int fd, struct io_plan_arg *arg)
                        return 0;
                return -1;
        }
+       if (arg->u2.s)
+               close(arg->u1.s);
        return 1;
 }
 
 struct io_plan *io_send_fd_(struct io_conn *conn,
                            int fd,
+                           bool fdclose,
                            struct io_plan *(*next)(struct io_conn *, void *),
                            void *next_arg)
 {
        struct io_plan_arg *arg = io_plan_arg(conn, IO_OUT);
 
        arg->u1.s = fd;
+       arg->u2.s = fdclose;
 
        return io_set_plan(conn, IO_OUT, do_fd_send, next, next_arg);
 }
index 366ff3521606e23e182ed5073b4378d12fdc98dd..533bc840f7ba5fbb03af6979032c9674b906d701 100644 (file)
@@ -7,6 +7,7 @@
  * io_send_fd - output plan to send a file descriptor
  * @conn: the connection that plan is for.
  * @fd: the file descriptor to pass.
+ * @fdclose: true to close fd after successful sending.
  * @next: function to call output is done.
  * @arg: @next argument
  *
  * Example:
  * 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 *,       \
                                        (next), (arg), struct io_conn *), \
                    (arg))
 struct io_plan *io_send_fd_(struct io_conn *conn,
-                           int fd,
+                           int fd, bool fdclose,
                            struct io_plan *(*next)(struct io_conn *, void *),
                            void *arg);
 
index d2021e8279a6f665f7e0180a856beeb6cf66587a..642db08449ee62c2c1bf9a68a4c51ef9b164eff1 100644 (file)
@@ -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)
 {
-       return io_send_fd(conn, pfd[0], try_writing, pfd);
+       return io_send_fd(conn, pfd[0], true, try_writing, pfd);
 }
 
 int main(void)