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);
}
* 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);
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)