From 138325b91d0d427410a06d477d3506f48798db2b Mon Sep 17 00:00:00 2001 From: Trumeet Date: Fri, 22 Jul 2022 19:15:48 -0700 Subject: feat(libacron): more customized ac_connection_parameters API:CHANGE Signed-off-by: Trumeet --- client/libacron/net.c | 73 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 10 deletions(-) (limited to 'client/libacron/net.c') diff --git a/client/libacron/net.c b/client/libacron/net.c index a0e8659..aeff5e8 100644 --- a/client/libacron/net.c +++ b/client/libacron/net.c @@ -18,6 +18,7 @@ #include #include #include +#include #ifdef WIN32 #include @@ -28,6 +29,14 @@ #include #endif +static void conn_free(struct ac_connection *conn) { + if (conn->url) free(conn->url); + if (conn->parameters.id) free(conn->parameters.id); + if (conn->parameters.host) free(conn->parameters.host); + if (conn->parameters.token) free(conn->parameters.token); + free(conn); +} + static void on_open_handler(struct wic_inst *inst) { struct ac_connection *conn = wic_get_app(inst); conn->established = true; @@ -112,12 +121,56 @@ static bool on_message_handler(struct wic_inst *inst, int ac_connect(ac_connection_parameters_t parameters, void **out) { AC_CHECK_INIT; + + if (!parameters.id || + !parameters.host || + !parameters.token) { + LOGE("Required parameters are missing."); + return AC_E_INVALID_REQUEST; + } + struct ac_connection *conn; int r; if ((r = SALLOC(struct ac_connection, &conn))) { return r; } - memcpy(&conn->parameters, ¶meters, sizeof(ac_connection_parameters_t)); + /* Do not use memcpy() here because we want to keep track of copied and not-copied strings. */ + conn->parameters.port = parameters.port; + if ((r = strdup2(parameters.token, &conn->parameters.token)) || + (r = strdup2(parameters.host, &conn->parameters.host)) || + (r = strdup2(parameters.id, &conn->parameters.id))) { + conn_free(conn); + return r; + } + + if ((r = alloc(NULL, + 5 /* ws:// */ + + strlen(parameters.host) + + 1 /* : */ + + /* Without the () the result seems to be strange. */ + (parameters.port ? ((int) floor(log10(parameters.port)) + 1) : 1) + + 3 /* /ws */ + + 4 /* ?id= */ + + strlen(parameters.id) + + 7 /* &token = */ + + strlen(parameters.token) + + 9 /* &version= */ + + /* Without the () the result seems to be strange. */ + (parameters.version ? ((int) floor(log10(parameters.version)) + 1) : 1) + + 1 /* NULL */, + sizeof(char), + false, + (void **) &conn->url))) { + conn_free(conn); + return r; + } + sprintf(conn->url, "ws://%s:%u/ws?id=%s&token=%s&version=%u", + parameters.host, + parameters.port, + parameters.id, + parameters.token, + parameters.version); + static uint8_t rx[1000]; struct wic_inst *inst = &conn->inst; struct wic_init_arg arg = {0}; @@ -131,12 +184,12 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { arg.on_buffer = on_buffer_handler; arg.app = conn; - arg.url = parameters.url; + arg.url = conn->url; arg.role = WIC_ROLE_CLIENT; if (!wic_init(inst, &arg)) { LOGE("wic_init"); - free(conn); + conn_free(conn); return AC_E_INTERNAL; } @@ -153,11 +206,11 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { break; case WIC_SCHEMA_WSS: LOGE("WSS is not supported yet."); - free(conn); + conn_free(conn); return AC_E_INVALID_REQUEST; default: LOGE("Unsupported protocol. The URL must be ws://"); - free(conn); + conn_free(conn); return AC_E_INVALID_REQUEST; } @@ -169,7 +222,7 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { LOGEV("Resolve host: %s.", gai_strerror(r)); #endif r = AC_E_NET; - free(conn); + conn_free(conn); return r; } @@ -180,7 +233,7 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { strerror2(e), e); freeaddrinfo(res); - free(conn); + conn_free(conn); return AC_E_NET; } if (connect(fd, res->ai_addr, res->ai_addrlen) < 0) { @@ -196,7 +249,7 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { #endif closesocket(fd); freeaddrinfo(res); - free(conn); + conn_free(conn); return AC_E_NET; } freeaddrinfo(res); @@ -205,7 +258,7 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { if (wic_start(inst) != WIC_STATUS_SUCCESS) { LOGE("Cannot start the WIC client."); closesocket(fd); - free(conn); + conn_free(conn); return AC_E_NET; } @@ -236,7 +289,7 @@ int ac_disconnect(void *connection) { LOGD("Disconnecting..."); wic_close(&conn->inst); closesocket(conn->fd); - free(conn); + conn_free(conn); return AC_E_OK; } -- cgit v1.2.3