aboutsummaryrefslogtreecommitdiff
path: root/client/libacron/net.c
diff options
context:
space:
mode:
authorTrumeet <yuuta@yuuta.moe>2022-07-22 19:15:48 -0700
committerTrumeet <yuuta@yuuta.moe>2022-07-22 19:15:48 -0700
commit138325b91d0d427410a06d477d3506f48798db2b (patch)
treef417c906ba20fa21cce12cb483088304bf2c3b92 /client/libacron/net.c
parent33e76233a9dfa2707ed22effb1814a752d52aca5 (diff)
downloadacron-138325b91d0d427410a06d477d3506f48798db2b.tar
acron-138325b91d0d427410a06d477d3506f48798db2b.tar.gz
acron-138325b91d0d427410a06d477d3506f48798db2b.tar.bz2
acron-138325b91d0d427410a06d477d3506f48798db2b.zip
feat(libacron): more customized ac_connection_parameters
API:CHANGE Signed-off-by: Trumeet <yuuta@yuuta.moe>
Diffstat (limited to 'client/libacron/net.c')
-rw-r--r--client/libacron/net.c73
1 files changed, 63 insertions, 10 deletions
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 <sys/types.h>
#include <stdlib.h>
#include <errno.h>
+#include <math.h>
#ifdef WIN32
#include <winsock2.h>
@@ -28,6 +29,14 @@
#include <unistd.h>
#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, &parameters, 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;
}