From 2b4e544867c11c40540b59e4cd4ef183a9afb7c9 Mon Sep 17 00:00:00 2001 From: Deomid Ryabkov <rojer@cesanta.com> Date: Mon, 19 Oct 2015 14:55:01 +0100 Subject: [PATCH] Move "connect done" logic from mg_read_from_socket PUBLISHED_FROM=318cc110d8b012cf75cb02dfc68a8215faa93fe7 --- mongoose.c | 63 ++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/mongoose.c b/mongoose.c index 119d03ec2..743a4099e 100644 --- a/mongoose.c +++ b/mongoose.c @@ -2458,42 +2458,25 @@ static void mg_ssl_begin(struct mg_connection *nc) { } #endif /* MG_ENABLE_SSL */ -static void mg_read_from_socket(struct mg_connection *conn) { - char buf[MG_READ_BUFFER_SIZE]; - int n = 0; - - if (conn->flags & MG_F_CONNECTING) { - int ok = 1, ret; -#if !defined(MG_CC3200) && !defined(MG_ESP8266) - socklen_t len = sizeof(ok); -#endif - - (void) ret; -#if defined(MG_CC3200) || defined(MG_ESP8266) - /* On CC3200 and ESP8266 we use blocking connect. If we got as far as this, - * this means connect() was successful. - * TODO(rojer): Figure out why it fails where blocking succeeds. - */ - mg_set_non_blocking_mode(conn->sock); - ret = ok = 0; -#else - ret = getsockopt(conn->sock, SOL_SOCKET, SO_ERROR, (char *) &ok, &len); -#endif +static void mg_connect_done(struct mg_connection *conn, int err) { #ifdef MG_ENABLE_SSL - if (ret == 0 && ok == 0 && conn->ssl != NULL) { - mg_ssl_begin(conn); - } + if (err == 0 && conn->ssl != NULL) { + mg_ssl_begin(conn); + } #endif - DBG(("%p connect ok=%d", conn, ok)); - if (ok != 0) { - conn->flags |= MG_F_CLOSE_IMMEDIATELY; - } else { - conn->flags &= ~MG_F_CONNECTING; - } - mg_call(conn, MG_EV_CONNECT, &ok); - return; + DBG(("%p connect, err=%d", conn, err)); + if (err != 0) { + conn->flags |= MG_F_CLOSE_IMMEDIATELY; + } else { + conn->flags &= ~MG_F_CONNECTING; } + mg_call(conn, MG_EV_CONNECT, &err); + return; +} +static void mg_read_from_socket(struct mg_connection *conn) { + int n = 0; + char buf[MG_READ_BUFFER_SIZE]; #ifdef MG_ENABLE_SSL if (conn->ssl != NULL) { if (conn->flags & MG_F_SSL_HANDSHAKE_DONE) { @@ -2630,7 +2613,21 @@ static void mg_mgr_handle_connection(struct mg_connection *nc, int fd_flags, if (nc->flags & MG_F_CONNECTING) { if (fd_flags != 0) { - mg_read_from_socket(nc); + int err = 1; +#if !defined(MG_CC3200) && !defined(MG_ESP8266) + socklen_t len = sizeof(err); + int ret = getsockopt(nc->sock, SOL_SOCKET, SO_ERROR, (char *) &err, &len); + if (ret != 0) err = 1; +#else + /* On CC3200 and ESP8266 we use blocking connect. If we got as far as + * this, + * this means connect() was successful. + * TODO(rojer): Figure out why it fails where blocking succeeds. + */ + mg_set_non_blocking_mode(nc->sock); + err = 0; +#endif + mg_connect_done(nc, err); } return; } -- GitLab