aboutsummaryrefslogtreecommitdiff
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
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>
-rw-r--r--client/libacron/CMakeLists.txt2
-rw-r--r--client/libacron/README.md6
-rw-r--r--client/libacron/acronc/main.c6
-rw-r--r--client/libacron/include/net.h11
-rw-r--r--client/libacron/net.c73
-rw-r--r--client/libacron/private/connection.h1
6 files changed, 80 insertions, 19 deletions
diff --git a/client/libacron/CMakeLists.txt b/client/libacron/CMakeLists.txt
index d683416..f3d6c27 100644
--- a/client/libacron/CMakeLists.txt
+++ b/client/libacron/CMakeLists.txt
@@ -80,7 +80,7 @@ if(WIN32)
endif()
find_package(json-c CONFIG)
-set(LIBAC_DEPS ${LIBAC_DEPS} json-c::json-c)
+set(LIBAC_DEPS ${LIBAC_DEPS} json-c::json-c m)
target_include_directories(ac PUBLIC ${LIBAC_INCLUDES})
target_link_libraries(ac ${LIBAC_DEPS})
diff --git a/client/libacron/README.md b/client/libacron/README.md
index 240d671..e5ed81b 100644
--- a/client/libacron/README.md
+++ b/client/libacron/README.md
@@ -168,7 +168,11 @@ Every thread can have multiple connections simultaneously.
void *connection = NULL;
int r;
ac_connection_parameters_t args = {
- .url = "ws://localhost:25575/ws?id=1&token=123"
+ .host = "127.0.0.1",
+ .port = 25575,
+ .version = 0,
+ .id = "1",
+ .token = "123"
};
if ((r = ac_connect(args, &connection))) {
return r;
diff --git a/client/libacron/acronc/main.c b/client/libacron/acronc/main.c
index 21958fd..ff19f39 100644
--- a/client/libacron/acronc/main.c
+++ b/client/libacron/acronc/main.c
@@ -148,7 +148,11 @@ int main(int argc, char **argv) {
if ((r = ac_init(&config))) return r;
void *connection;
ac_connection_parameters_t parameters = {
- .url = "ws://localhost:25575/ws?id=1&token=123"
+ .host = "localhost",
+ .port = 25575,
+ .id = "1",
+ .token = "123",
+ .version = 0
};
if ((r = ac_connect(parameters, &connection))) {
ac_free();
diff --git a/client/libacron/include/net.h b/client/libacron/include/net.h
index 6d8d9e7..398450d 100644
--- a/client/libacron/include/net.h
+++ b/client/libacron/include/net.h
@@ -13,12 +13,11 @@
/* Connection */
typedef struct ac_connection_parameters {
- /**
- * ws://host:port/ws?id=id&token=token
- * Currently wss is not supported.
- * Port must be supplied, or libac will connect to port zero.
- */
- char *url;
+ char *host;
+ uint16_t port;
+ unsigned int version;
+ char *id;
+ char *token;
} ac_connection_parameters_t;
/**
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;
}
diff --git a/client/libacron/private/connection.h b/client/libacron/private/connection.h
index 04d7639..a76fada 100644
--- a/client/libacron/private/connection.h
+++ b/client/libacron/private/connection.h
@@ -29,6 +29,7 @@ struct ac_result {
struct ac_connection {
ac_connection_parameters_t parameters;
struct wic_inst inst;
+ char *url;
SOCKET fd;
bool established;
/* Result from message handler.