aboutsummaryrefslogtreecommitdiff
path: root/client/libacron/apps/acronc/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/libacron/apps/acronc/main.c')
-rw-r--r--client/libacron/apps/acronc/main.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/client/libacron/apps/acronc/main.c b/client/libacron/apps/acronc/main.c
new file mode 100644
index 0000000..6e18ed2
--- /dev/null
+++ b/client/libacron/apps/acronc/main.c
@@ -0,0 +1,105 @@
+/*
+ * Created by yuuta on 7/23/22.
+ */
+
+#include "log.h"
+#include "handler.h"
+#include "config.h"
+#include "helpers.h"
+#include "client.h"
+
+#include <libac.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <uv.h>
+#include <err.h>
+#include <string.h>
+
+static uv_loop_t lop;
+uv_loop_t *loop = &lop;
+
+static void on_close(uv_handle_t *handle);
+
+static ac_connection_parameters_t params = {
+ .sock = NULL,
+ .version = 0,
+ .port = 25575,
+ .host = NULL,
+ .id = NULL,
+ .token = NULL,
+ .on_send = NULL,
+};
+
+static void cleanup(void) {
+ LOGD("cleanup()");
+ /* sock must be closed before cleanup(). */
+ uv_loop_close(loop);
+ ac_free();
+ uv_tty_reset_mode();
+}
+
+static void on_stdin_closed(void) {
+ sock_ext(true);
+}
+
+static void on_sock_closed(void) {
+ uv_stop(loop);
+}
+
+static int on_input(ac_request_t *req) {
+ /* The socket will close itself upon errors. So do the input stream. */
+ return sock_request(req);
+}
+
+static int on_sock_ready(void) {
+ return h_stdin(on_input, on_stdin_closed);
+}
+
+static void on_resolv(int status, const struct addrinfo *ai, void (*on_connected)(bool)) {
+ if (status) {
+ uv_stop(loop);
+ return;
+ }
+
+ if (h_socket(&params,
+ ai,
+ on_connected,
+ on_sock_ready,
+ handle_object,
+ on_sock_closed)) {
+ /* Mark as true to clean up resources and prevent next retry. */
+ on_connected(true);
+ uv_stop(loop);
+ }
+}
+
+int main(int argc, const char **argv) {
+ int r;
+
+ if ((r = config_parse(argc, argv, &params))) return r;
+ atexit(cleanup);
+ libac_config_t config = {
+#ifdef DEBUG
+ .out = NULL,
+#else
+ .out = NULL,
+#endif
+ .tok = NULL
+ };
+ if ((r = ac_init(&config))) errx(r, "Cannot initialize Acron library.");
+
+ if ((r = uv_loop_init(loop))) goto uviniterr;
+ if ((r = h_signal())) goto uviniterr;
+ if ((r = a_dns(params.host, params.port, on_resolv))) goto uviniterr;
+
+ if ((r = uv_run(loop, UV_RUN_DEFAULT))) {
+ if (r == 1) {
+ /* Seems to return 1 if uv_stop is called. */
+ return 0;
+ }
+ errx(-r, "Cannot run: %s", uv_strerror(r));
+ }
+ return 0;
+ uviniterr:
+ errx(-r, "Cannot initialize: %s", uv_strerror(r));
+} \ No newline at end of file