diff --git a/include/ircd/server/link.h b/include/ircd/server/link.h index cd1577235..af82f161d 100644 --- a/include/ircd/server/link.h +++ b/include/ircd/server/link.h @@ -25,6 +25,7 @@ struct ircd::server::link std::list queue; ///< link's work queue bool op_init {false}; ///< link is connecting bool op_fini {false}; ///< link is disconnecting + bool op_open {false}; bool op_write {false}; ///< async operation state bool op_read {false}; ///< async operation state bool exclude {false}; ///< link is excluded diff --git a/ircd/server.cc b/ircd/server.cc index cd1e1a9dc..122092e8e 100644 --- a/ircd/server.cc +++ b/ircd/server.cc @@ -1723,12 +1723,23 @@ ircd::server::link::open(const net::open_opts &open_opts) }; op_init = true; + op_open = true; const unwind::exceptional unhandled{[this] { op_init = false; + op_open = false; }}; socket = net::open(open_opts, std::move(handler)); + op_open = false; + + if(finished()) + { + assert(peer); + peer->handle_finished(*this); + return false; + } + return true; } @@ -2351,7 +2362,7 @@ const if(!bool(socket)) return true; - return !opened() && op_fini && !op_init && !op_write && !op_read; + return !opened() && op_fini && !op_init && !op_open && !op_write && !op_read; } size_t