From 6a4145e8e5d2415ae9c47ddeba0fe007d9d37542 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 12 May 2020 14:12:38 +0200
Subject: [PATCH] Cleaner way of creating the server

---
 inc/lektor/net.h  |  5 ++--
 src/main/server.c | 42 ++++++++++++++++++++++++++++-
 src/net/listen.c  | 68 +++++++++--------------------------------------
 3 files changed, 57 insertions(+), 58 deletions(-)

diff --git a/inc/lektor/net.h b/inc/lektor/net.h
index c8bb7fde..325e6d3a 100644
--- a/inc/lektor/net.h
+++ b/inc/lektor/net.h
@@ -70,6 +70,8 @@ struct lkt_state {
     struct lkt_client *clients;
     size_t fds_len;
     size_t fds_max;
+    char host[HOST_NAME_MAX];
+    char port[INI_MAX_LINE_LEN];
 
     volatile sqlite3 *db;
     const char *kara_prefix;
@@ -97,5 +99,4 @@ mpd_idle_flag *lkt_client_get_mask(struct lkt_state *srv, size_t c);
 bool lkt_client_auth(struct lkt_state *srv, size_t c, bool set_auth);
 
 /* The server's listen function. */
-int lkt_listen(void);
-
+void lkt_listen(struct lkt_state *srv);
diff --git a/src/main/server.c b/src/main/server.c
index 86be43bd..d801d4dc 100644
--- a/src/main/server.c
+++ b/src/main/server.c
@@ -67,5 +67,45 @@ normal_launch:
     if (read_self_exe(exe, PATH_MAX))
         LOG_WARN_SCT("GENERAL", "%s", "Failed to read self executable path, restart may not work");
     executable_name = exe;
-    return lkt_listen();
+
+    /* Init the server */
+    char *memory = (char *) safe_malloc((2 * PATH_MAX + HOST_NAME_MAX + 3) * sizeof(char));
+    RETURN_UNLESS(memory, "Out of memory", 5);
+
+    struct lkt_state srv;
+    int autoclear, check_exclusive = 1;
+    char *const db_path = safe_malloc(PATH_MAX * sizeof(char));
+    char *const kara_dir = safe_malloc(PATH_MAX * sizeof(char));
+    char conf_file[PATH_MAX];
+    memset(&srv, 0, sizeof(struct lkt_state));
+
+    /* Initialize the system. */
+    RETURN_UNLESS(database_new(&srv.db),                   "Failed to initialize the memory database", 1);
+    RETURN_IF    (config_detect_file(conf_file, PATH_MAX), "Failed to find a config file",             1);
+    RETURN_IF    (config_new(srv.db, conf_file),           "Failed to read configuration file",        1);
+
+    /* Finish to initialize. */
+    RETURN_UNLESS(database_config_get_text(srv.db, "database", "db_path", db_path, PATH_MAX), "Cfg error",           2);
+    RETURN_UNLESS(database_open(srv.db, db_path, check_exclusive),                            "Can't open database", 1);
+
+    /* Read the configuration. */
+    RETURN_UNLESS(database_config_get_int (srv.db, "player",   "autoclear", &autoclear),                "Cfg error", 2);
+    RETURN_UNLESS(database_config_get_text(srv.db, "database", "kara_dir",  kara_dir, PATH_MAX),        "Cfg error", 2);
+    RETURN_UNLESS(database_config_get_text(srv.db, "server",   "host",      srv.host, HOST_NAME_MAX),   "Cfg error", 2);
+    RETURN_UNLESS(database_config_get_text(srv.db, "server",   "port",      srv.port, 5),               "Cfg error", 2);
+
+    if (kara_dir[strlen(kara_dir) - 1] != '/')
+        strncat(kara_dir, "/", PATH_MAX - 1);
+
+    srv.kara_prefix = kara_dir;
+    database_config_queue_default(srv.db);
+
+    if (autoclear)
+        database_queue_clear(srv.db);
+
+    RETURN_IF(load_module_by_name(&srv, "player", &srv.win),  "Can't load module player", 3);
+    RETURN_IF(load_module_by_name(&srv, "repo",   &srv.repo), "Can't load module repo", 3);
+    lkt_listen(&srv);
+    srv.win.free(&srv.win);
+    return EXIT_FAILURE;
 }
diff --git a/src/net/listen.c b/src/net/listen.c
index 522a65b7..09b9f4da 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -690,67 +690,25 @@ lkt_client_auth(struct lkt_state *srv, size_t c, bool set)
     return srv->clients[c - 1].authentificated |= set;
 }
 
-int
-lkt_listen(void)
+void
+lkt_listen(struct lkt_state *srv)
 {
-    char *memory = (char *) safe_malloc((2 * PATH_MAX + HOST_NAME_MAX + 3) * sizeof(char));
-    RETURN_UNLESS(memory, "Out of memory", 5);
-
-    struct lkt_state srv;
-    int autoclear, check_exclusive = 1;
-    char *const db_path  = memory;                  /* Size is PATH_MAX.        */
-    char *const kara_dir = memory + PATH_MAX + 1;   /* Size is PATH_MAX.        */
-    char *const host     = kara_dir + PATH_MAX + 1; /* Size is HOST_NAME_MAX.   */
-    char port[7];   /* Maximal port number is 65535, +2 for '\n' and '\0' */
-    char conf_file[PATH_MAX];
-    memset(&srv, 0, sizeof(struct lkt_state));
-
-    /* Initialize the system. */
-    RETURN_UNLESS(database_new(&srv.db),                   "Failed to initialize the memory database", 1);
-    RETURN_IF    (config_detect_file(conf_file, PATH_MAX), "Failed to find a config file",             1);
-    RETURN_IF    (config_new(srv.db, conf_file),           "Failed to read configuration file",        1);
-
-    /* Finish to initialize. */
-    RETURN_UNLESS(database_config_get_text(srv.db, "database", "db_path", db_path, PATH_MAX), "Cfg error",           2);
-    RETURN_UNLESS(database_open(srv.db, db_path, check_exclusive),                            "Can't open database", 1);
-
-    /* Read the configuration. */
-    RETURN_UNLESS(database_config_get_int (srv.db, "player",   "autoclear", &autoclear),            "Cfg error", 2);
-    RETURN_UNLESS(database_config_get_text(srv.db, "database", "kara_dir",  kara_dir, PATH_MAX),    "Cfg error", 2);
-    RETURN_UNLESS(database_config_get_text(srv.db, "server",   "host",      host, HOST_NAME_MAX),   "Cfg error", 2);
-    RETURN_UNLESS(database_config_get_text(srv.db, "server",   "port",      port, 5),               "Cfg error", 2);
-
-    if (kara_dir[strlen(kara_dir) - 1] != '/')
-        strncat(kara_dir, "/", PATH_MAX - 1);
-
-    srv.kara_prefix = kara_dir;
-    database_config_queue_default(srv.db);
-
-    srv.fds_max = 16;
-    srv.fds     = calloc(srv.fds_max, sizeof(struct pollfd));
-    srv.clients = calloc(srv.fds_max, sizeof(struct lkt_client));
-    memset(srv.clients, 0, srv.fds_max * sizeof(struct lkt_client));
-
-    if ((srv.fds[0].fd = init_listening_socket(host, port)) < 0)
-        return -1;
-
-    srv.fds[0].events = POLLIN;
-    srv.fds_len = 1;
+    srv->fds_max = 16;
+    srv->fds     = calloc(srv->fds_max, sizeof(struct pollfd));
+    srv->clients = calloc(srv->fds_max, sizeof(struct lkt_client));
+    memset(srv->clients, 0, srv->fds_max * sizeof(struct lkt_client));
 
-    if (autoclear)
-        database_queue_clear(srv.db);
+    if ((srv->fds[0].fd = init_listening_socket(srv->host, srv->port)) < 0)
+        return;
 
-    RETURN_IF(load_module_by_name(&srv, "player", &srv.win),  "Can't load module player", 3);
-    RETURN_IF(load_module_by_name(&srv, "repo",   &srv.repo), "Can't load module repo", 3);
+    srv->fds[0].events = POLLIN;
+    srv->fds_len = 1;
 
     for (;;) {
-        if (handle_network_events(&srv) < 0)
+        if (handle_network_events(srv) < 0)
             break;
-        if (handle_idle_events(&srv) < 0)
+        if (handle_idle_events(srv) < 0)
             break;
-        srv.win.handle_events(&srv.win, srv.db, &srv.mpd_idle_events);
+        srv->win.handle_events(&srv->win, srv->db, &srv->mpd_idle_events);
     }
-
-    srv.win.free(&srv.win);
-    return -1;
 }
-- 
GitLab