]> git.ozlabs.org Git - ccan/commitdiff
ccan/io: extended errors API so caller can be told if we fail accept()
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 18 Apr 2024 03:55:44 +0000 (13:25 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 24 Jun 2024 02:46:26 +0000 (12:16 +0930)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/io/io.c
ccan/io/io.h
ccan/io/poll.c

index 12df06d82cb6474fed825cd381f7f225fc6213b1..3d00de045f1a54239baa2b54f0177f34f49d1c26 100644 (file)
@@ -15,6 +15,7 @@
 void *io_loop_return;
 
 struct io_plan io_conn_freed;
+static bool io_extended_errors;
 
 struct io_listener *io_new_listener_(const tal_t *ctx, int fd,
                                     struct io_plan *(*init)(struct io_conn *,
@@ -540,7 +541,7 @@ struct io_plan *io_sock_shutdown(struct io_conn *conn)
        /* And leave unset .*/
        return &conn->plan[IO_IN];
 }
-       
+
 bool io_flush_sync(struct io_conn *conn)
 {
        struct io_plan *plan = &conn->plan[IO_OUT];
@@ -576,3 +577,13 @@ again:
        io_fd_block(io_conn_fd(conn), false);
        return ok;
 }
+
+void io_set_extended_errors(bool state)
+{
+       io_extended_errors = state;
+}
+
+bool io_get_extended_errors(void)
+{
+       return io_extended_errors;
+}
index eeb5e36ecdff0bfedd633b734cc2b380b92d8b2b..cc92be2c5497f19e387e085b2568cbbf7238e015 100644 (file)
@@ -113,6 +113,8 @@ void io_set_finish_(struct io_conn *conn,
  * (tal'ocated off @ctx) and pass that to init().  Note that if there is
  * an error on this file descriptor, it will be freed.
  *
+ * Note: if the accept fails (usually due to EMFILE), init() will be called
+ * wth
  * Returns NULL on error (and sets errno).
  *
  * Example:
@@ -823,4 +825,13 @@ int (*io_poll_override(int (*poll)(struct pollfd *fds, nfds_t nfds, int timeout)
  */
 const void *io_have_fd(int fd, bool *listener);
 
+/**
+ * io_set_extended_errors - enable callbacks for errors.
+ * @state: true or false.
+ *
+ * Defaults false for compatibility.  See io_new_conn for what this changes.
+ */
+void io_set_extended_errors(bool state);
+bool io_get_extended_errors(void);
+
 #endif /* CCAN_IO_H */
index 634f83d286a66669c54694daf2fab0de4ce1a416..7fe9e2c5e0bbb4da297c408c742c3e512c244c5d 100644 (file)
@@ -270,10 +270,12 @@ static void accept_conn(struct io_listener *l)
 {
        int fd = accept(l->fd.fd, NULL, NULL);
 
-       /* FIXME: What to do here? */
-       if (fd < 0)
+       if (fd < 0) {
+               /* If they've enabled it, this is how we tell them */
+               if (io_get_extended_errors())
+                       l->init(NULL, l->arg);
                return;
-
+       }
        io_new_conn(l->ctx, fd, l->init, l->arg);
 }