Commit 60e31637 authored by Rusty Russell's avatar Rusty Russell

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

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 4f6d604c
...@@ -12,17 +12,21 @@ static int do_fd_send(int fd, struct io_plan_arg *arg) ...@@ -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);
} }
......
...@@ -7,6 +7,7 @@ ...@@ -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 @@ ...@@ -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. * // Write fd, then close conn.
* return io_send_fd(conn, fd, io_close_cb, NULL); * return io_send_fd(conn, fd, false, io_close_cb, NULL);
* } * }
*/ */
#define io_send_fd(conn, fd, next, arg) \ #define io_send_fd(conn, fd, fdclose, next, arg) \
io_send_fd_((conn), (fd), \ 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);
......
...@@ -28,7 +28,7 @@ static struct io_plan *try_writing(struct io_conn *conn, int *pfd) ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment