|
|
@@ -0,0 +1,68 @@
|
|
|
+/* GNU LGPL version 2 (or later) - see LICENSE file for details */
|
|
|
+#ifndef CCAN_IO_FDPASS_H
|
|
|
+#define CCAN_IO_FDPASS_H
|
|
|
+#include <ccan/io/io.h>
|
|
|
+
|
|
|
+/**
|
|
|
+ * io_send_fd - output plan to send a file descriptor
|
|
|
+ * @conn: the connection that plan is for.
|
|
|
+ * @fd: the file descriptor to pass.
|
|
|
+ * @next: function to call output is done.
|
|
|
+ * @arg: @next argument
|
|
|
+ *
|
|
|
+ * This updates the output plan, to write out a file descriptor. This
|
|
|
+ * usually only works over an AF_LOCAL (ie. Unix domain) socket. Once
|
|
|
+ * that's sent, the @next function will be called: on an error, the
|
|
|
+ * finish function is called instead.
|
|
|
+ *
|
|
|
+ * Note that the I/O may actually be done immediately, and the other end
|
|
|
+ * of the socket must use io_recv_fd: if it does a normal read, the file
|
|
|
+ * descriptor will be lost.
|
|
|
+ *
|
|
|
+ * 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);
|
|
|
+ * }
|
|
|
+ */
|
|
|
+#define io_send_fd(conn, fd, next, arg) \
|
|
|
+ io_send_fd_((conn), (fd), \
|
|
|
+ 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,
|
|
|
+ struct io_plan *(*next)(struct io_conn *, void *),
|
|
|
+ void *arg);
|
|
|
+
|
|
|
+/**
|
|
|
+ * io_recv_fd - input plan to receive a file descriptor
|
|
|
+ * @conn: the connection that plan is for.
|
|
|
+ * @fd: a pointer to where to place to file descriptor
|
|
|
+ * @next: function to call once input is done.
|
|
|
+ * @arg: @next argument
|
|
|
+ *
|
|
|
+ * This creates a plan to receive a file descriptor, as sent by
|
|
|
+ * io_send_fd. Once it's all read, the @next function will be called:
|
|
|
+ * on an error, the finish function is called instead.
|
|
|
+ *
|
|
|
+ * Note that the I/O may actually be done immediately.
|
|
|
+ *
|
|
|
+ * Example:
|
|
|
+ * static struct io_plan *read_from_conn(struct io_conn *conn, int *fdp)
|
|
|
+ * {
|
|
|
+ * // Read message, then close.
|
|
|
+ * return io_recv_fd(conn, fdp, io_close_cb, NULL);
|
|
|
+ * }
|
|
|
+ */
|
|
|
+#define io_recv_fd(conn, fd, next, arg) \
|
|
|
+ io_recv_fd_((conn), (fd), \
|
|
|
+ typesafe_cb_preargs(struct io_plan *, void *, \
|
|
|
+ (next), (arg), struct io_conn *), \
|
|
|
+ (arg))
|
|
|
+struct io_plan *io_recv_fd_(struct io_conn *conn,
|
|
|
+ int *fd,
|
|
|
+ struct io_plan *(*next)(struct io_conn *, void *),
|
|
|
+ void *arg);
|
|
|
+#endif /* CCAN_IO_FDPASS_H */
|