diff --git a/mongoose.c b/mongoose.c index 2459661475e3db02dca5cf67441a19c54b8543c5..ae753c94a6952e754bdc664829ed255225d68d84 100644 --- a/mongoose.c +++ b/mongoose.c @@ -3504,6 +3504,45 @@ static void read_from_client(struct connection *conn) { } } +int mg_connect(struct mg_server *server, const char *host, + int port, mg_handler_t handler, void *param) { + sock_t sock = INVALID_SOCKET; + struct sockaddr_in sin; + struct hostent *he = NULL; + struct connection *conn = NULL; + int connect_ret_val; + + if (host == NULL || (he = gethostbyname(host)) == NULL || + (sock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) return 0; + + sin.sin_family = AF_INET; + sin.sin_port = htons((uint16_t) port); + sin.sin_addr = * (struct in_addr *) he->h_addr_list[0]; + set_non_blocking_mode(sock); + + connect_ret_val = connect(sock, (struct sockaddr *) &sin, sizeof(sin)); + if (connect_ret_val != 0 && errno != EINPROGRESS) { + return 0; + } else if ((conn = (struct connection *) calloc(1, sizeof(*conn))) == NULL) { + closesocket(sock); + return 0; + } + + conn->client_sock = sock; + conn->endpoint_type = EP_CLIENT; + conn->handler = handler; + conn->mg_conn.server_param = server->server_data; + conn->mg_conn.connection_param = param; + LINKED_LIST_ADD_TO_FRONT(&server->active_connections, &conn->link); + + if (connect_ret_val == 0) { + conn->flags = CONN_CONNECTED; + handler(&conn->mg_conn); + } + + return 1; +} + static void read_from_server(struct connection *conn) { sock_t ok, sock = conn->client_sock; socklen_t len = sizeof(ok); @@ -3614,40 +3653,6 @@ static void transfer_file_data(struct connection *conn) { } } -struct mg_connection *mg_connect(struct mg_server *server, const char *host, - int port, mg_handler_t handler) { - sock_t sock = INVALID_SOCKET; - struct sockaddr_in sin; - struct hostent *he = NULL; - struct connection *conn = NULL; - int connected; - - if (host == NULL || (he = gethostbyname(host)) == NULL || - (sock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) return NULL; - - sin.sin_family = AF_INET; - sin.sin_port = htons((uint16_t) port); - sin.sin_addr = * (struct in_addr *) he->h_addr_list[0]; - set_non_blocking_mode(sock); - - connected = connect(sock, (struct sockaddr *) &sin, sizeof(sin)); - if (connected != 0 && errno != EINPROGRESS) { - return NULL; - } else if ((conn = (struct connection *) calloc(1, sizeof(*conn))) == NULL) { - closesocket(sock); - return NULL; - } - - conn->client_sock = sock; - conn->endpoint_type = EP_CLIENT; - conn->handler = handler; - conn->mg_conn.server_param = server->server_data; - conn->flags = connected == 0 ? CONN_CONNECTED : 0; - LINKED_LIST_ADD_TO_FRONT(&server->active_connections, &conn->link); - - return &conn->mg_conn; -} - static void execute_iteration(struct mg_server *server) { struct ll *lp, *tmp; struct connection *conn;