From 6c49e2e93b23defd51d4b342baad5a9c3f843ea1 Mon Sep 17 00:00:00 2001 From: Trumeet Date: Sat, 23 Jul 2022 11:03:20 -0700 Subject: feat(libacron/acronc): delegate socket IO to the client API:CHANGE Signed-off-by: Trumeet --- client/libacron/acronc/main.c | 142 +++++++++++++++++++++++++++++++----------- 1 file changed, 105 insertions(+), 37 deletions(-) (limited to 'client/libacron/acronc/main.c') diff --git a/client/libacron/acronc/main.c b/client/libacron/acronc/main.c index f76b172..43802ad 100644 --- a/client/libacron/acronc/main.c +++ b/client/libacron/acronc/main.c @@ -3,15 +3,16 @@ */ #include "libac.h" +#include "net.h" #include -#ifdef WIN32 -#include -#include -#else + +#ifndef WIN32 + #include #include #include + #endif static const char *world_name(const enum ac_world world) { @@ -126,11 +127,47 @@ static void handle_response(const ac_response_t *response) { } #ifndef WIN32 + static void intr(int signum) {} + #endif +static int on_send(const void *sock, + const void *buffer, + const size_t len) { + int r; + printf("Writing %lu bytes.\n", len); + if ((r = net_send(sock, buffer, len))) { + fprintf(stderr, "Cannot write %lu bytes to server: %s (%d).\n", + len, + net_strerror(r), + r); + } + return r; +} + +static int say(void *connection) { + int r; + ac_config_t conf = { + .name = "acronc" + }; + ac_request_cmd_t req = { + .type = AC_REQUEST_CMD, + .id = 100, + .config = &conf, + .cmd = "say Hi" + }; + if ((r = ac_request(connection, (ac_request_t *) &req))) { + return r; + } + return 0; +} + int main(int argc, char **argv) { int r; + if ((r = net_init())) { + return r; + } #ifdef WIN32 fprintf(stderr, "Warning: ^C handler on Windows is not yet available.\n"); #else @@ -139,27 +176,13 @@ int main(int argc, char **argv) { sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGINT, &sa, NULL) || - sigaction(SIGTERM, &sa, NULL)) { + sigaction(SIGTERM, &sa, NULL)) { const int e = errno; fprintf(stderr, "Cannot set SIGINT or SIGTERM handlers: %s (%d).\n", strerror(e), e); return e; } -#endif -#ifdef WIN32 - WORD wVersionRequested; - WSADATA wsaData; - wVersionRequested = MAKEWORD(2, 2); - if ((r = WSAStartup(wVersionRequested, &wsaData))) { - fprintf(stderr, "WSAStartup failed with error: %d\n", r); - return r; - } - if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { - fprintf(stderr, "Could not find a usable version of Winsock.dll\n"); - WSACleanup(); - return 1; - } #endif libac_config_t config = { #ifdef DEBUG @@ -171,33 +194,69 @@ int main(int argc, char **argv) { }; if ((r = ac_init(&config))) return r; void *connection; + SOCKET sock; ac_connection_parameters_t parameters = { .host = "localhost", .port = 25575, .id = "1", .token = "123", - .version = 0 + .version = 0, + .sock = NULL, + .on_send = on_send }; - if ((r = ac_connect(parameters, &connection))) { + if ((r = net_connect(parameters.host, parameters.port, &sock))) { + fprintf(stderr, "Cannot connect to server: %s (%d).\n", + net_strerror(r), + r); ac_free(); + net_free(); return r; } - ac_obj_t *obj; - ac_config_t conf = { - .name = "acronc" - }; - ac_request_cmd_t req = { - .type = AC_REQUEST_CMD, - .id = 100, - .config = &conf, - .cmd = "say Hi" - }; - if ((r = ac_request(connection, (ac_request_t *) &req))) { - ac_disconnect(connection); + parameters.sock = &sock; + if ((r = ac_connect(parameters, &connection))) { + net_close(&sock); ac_free(); + net_free(); return r; } - while (!(r = ac_receive(connection, &obj, 10))) { + ac_obj_t *obj; + int nr; + uint8_t buffer[1000U]; + size_t bytes; + enum ac_connection_state state; + printf("Waiting until the connection is established.\n"); + bool ready = false; + while (1) { + if ((nr = net_read(&sock, buffer, sizeof(buffer), &bytes, 10))) { + if (nr == NET_TIMEOUT) { + printf("Receive timeout.\n"); + continue; + } else { + goto end; + } + } + if ((r = ac_receive(connection, buffer, bytes, &obj))) { + goto end; + } + if (!ready) { + /* Wait until ready. */ + if ((r = ac_get_state(connection, &state))) { + goto end; + } + switch (state) { + case AC_STATE_INIT: + continue; + case AC_STATE_READY: + printf("Connection is established.\n"); + ready = true; + say(connection); + continue; + default: + fprintf(stderr, "Unexpected state.\n"); + goto end; + } + } + if (!obj) { continue; } @@ -208,10 +267,19 @@ int main(int argc, char **argv) { } ac_object_free(obj); } + end: + if (nr) { + if (nr == NET_CLOSED) { + fprintf(stderr, "Connection is closed while reading from the server.\n"); + } else { + fprintf(stderr, "Cannot receive from server: %s (%d).\n", + net_strerror(nr), + nr); + } + } ac_disconnect(connection); + net_close(&sock); ac_free(); -#ifdef WIN32 - WSACleanup(); -#endif + net_free(); return r; } \ No newline at end of file -- cgit v1.2.3