Move to kernel style SPDX license identifiers
[lttng-tools.git] / src / bin / lttng-relayd / health-relayd.c
index b14b8277250f25f910588f12f50c293647e291a1..3ffb9b75968c7586b28666409579a58774f36488 100644 (file)
@@ -1,18 +1,8 @@
 /*
- * Copyright (C) 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright (C) 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2 only,
- * as published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #define _LGPL_SOURCE
@@ -47,6 +37,7 @@
 #include <common/sessiond-comm/sessiond-comm.h>
 #include <common/utils.h>
 #include <common/compat/getenv.h>
+#include <common/fd-tracker/utils.h>
 
 #include "lttng-relayd.h"
 #include "health-relayd.h"
@@ -55,7 +46,7 @@
 static
 char health_unix_sock_path[PATH_MAX];
 
-int health_quit_pipe[2];
+int health_quit_pipe[2] = { -1, -1 };
 
 /*
  * Check if the thread quit pipe was triggered.
@@ -105,8 +96,15 @@ static int create_lttng_rundir_with_perm(const char *rundir)
                int is_root = !getuid();
 
                if (is_root) {
-                       ret = chown(rundir, 0,
-                                       utils_get_group_id(tracing_group_name));
+                       gid_t gid;
+
+                       ret = utils_get_group_id(tracing_group_name, true, &gid);
+                       if (ret) {
+                               /* Default to root group. */
+                               gid = 0;
+                       }
+
+                       ret = chown(rundir, 0, gid);
                        if (ret < 0) {
                                ERR("Unable to set group on %s", rundir);
                                PERROR("chown");
@@ -148,7 +146,8 @@ static
 int setup_health_path(void)
 {
        int is_root, ret = 0;
-       char *home_path = NULL, *rundir = NULL, *relayd_path = NULL;
+       const char *home_path = NULL;
+       char *rundir = NULL, *relayd_path = NULL;
 
        ret = parse_health_env();
        if (ret) {
@@ -224,6 +223,40 @@ end:
        return ret;
 }
 
+static
+int accept_unix_socket(void *data, int *out_fd)
+{
+       int ret;
+       int accepting_sock = *((int *) data);
+
+       ret = lttcomm_accept_unix_sock(accepting_sock);
+       if (ret < 0) {
+               goto end;
+       }
+
+       *out_fd = ret;
+       ret = 0;
+end:
+       return ret;
+}
+
+static
+int open_unix_socket(void *data, int *out_fd)
+{
+       int ret;
+       const char *path = data;
+
+       ret = lttcomm_create_unix_sock(path);
+       if (ret < 0) {
+               goto end;
+       }
+
+       *out_fd = ret;
+       ret = 0;
+end:
+       return ret;
+}
+
 /*
  * Thread managing health check socket.
  */
@@ -235,6 +268,7 @@ void *thread_manage_health(void *data)
        struct health_comm_msg msg;
        struct health_comm_reply reply;
        int is_root;
+       char *sock_name;
 
        DBG("[thread] Manage health check started");
 
@@ -246,22 +280,38 @@ void *thread_manage_health(void *data)
        lttng_poll_init(&events);
 
        /* Create unix socket */
-       sock = lttcomm_create_unix_sock(health_unix_sock_path);
-       if (sock < 0) {
+       ret = asprintf(&sock_name, "Unix socket @ %s", health_unix_sock_path);
+       if (ret == -1) {
+               PERROR("Failed to allocate unix socket name");
+               err = -1;
+               goto error;
+       }
+       ret = fd_tracker_open_unsuspendable_fd(the_fd_tracker, &sock,
+                       (const char **) &sock_name, 1, open_unix_socket,
+                       health_unix_sock_path);
+       free(sock_name);
+       if (ret < 0) {
                ERR("Unable to create health check Unix socket");
-               ret = -1;
+               err = -1;
                goto error;
        }
 
        is_root = !getuid();
        if (is_root) {
                /* lttng health client socket path permissions */
-               ret = chown(health_unix_sock_path, 0,
-                               utils_get_group_id(tracing_group_name));
+               gid_t gid;
+
+               ret = utils_get_group_id(tracing_group_name, true, &gid);
+               if (ret) {
+                       /* Default to root group. */
+                       gid = 0;
+               }
+
+               ret = chown(health_unix_sock_path, 0, gid);
                if (ret < 0) {
                        ERR("Unable to set group on %s", health_unix_sock_path);
                        PERROR("chown");
-                       ret = -1;
+                       err = -1;
                        goto error;
                }
 
@@ -270,7 +320,7 @@ void *thread_manage_health(void *data)
                if (ret < 0) {
                        ERR("Unable to set permissions on %s", health_unix_sock_path);
                        PERROR("chmod");
-                       ret = -1;
+                       err = -1;
                        goto error;
                }
        }
@@ -286,8 +336,10 @@ void *thread_manage_health(void *data)
                goto error;
        }
 
-       /* Size is set to 1 for the consumer_channel pipe */
-       ret = lttng_poll_create(&events, 2, LTTNG_CLOEXEC);
+       /* Size is set to 2 for the unix socket and quit pipe. */
+       ret = fd_tracker_util_poll_create(the_fd_tracker,
+                       "Health management thread epoll", &events, 2,
+                       LTTNG_CLOEXEC);
        if (ret < 0) {
                ERR("Poll set creation failed");
                goto error;
@@ -307,6 +359,8 @@ void *thread_manage_health(void *data)
        lttng_relay_notify_ready();
 
        while (1) {
+               char *accepted_socket_name;
+
                DBG("Health check ready");
 
                /* Inifinite blocking call, waiting for transmission */
@@ -329,11 +383,6 @@ restart:
                        revents = LTTNG_POLL_GETEV(&events, i);
                        pollfd = LTTNG_POLL_GETFD(&events, i);
 
-                       if (!revents) {
-                               /* No activity for this FD (poll implementation). */
-                               continue;
-                       }
-
                        /* Thread quit pipe has been closed. Killing thread. */
                        ret = check_health_quit_pipe(pollfd, revents);
                        if (ret) {
@@ -355,8 +404,18 @@ restart:
                        }
                }
 
-               new_sock = lttcomm_accept_unix_sock(sock);
-               if (new_sock < 0) {
+               ret = asprintf(&accepted_socket_name, "Socket accepted from unix socket @ %s",
+                               health_unix_sock_path);
+               if (ret == -1) {
+                       PERROR("Failed to allocate name of accepted socket from unix socket @ %s",
+                                       health_unix_sock_path);
+                       goto error;
+               }
+               ret = fd_tracker_open_unsuspendable_fd(the_fd_tracker, &new_sock,
+                               (const char **) &accepted_socket_name, 1,
+                               accept_unix_socket, &sock);
+               free(accepted_socket_name);
+               if (ret < 0) {
                        goto error;
                }
 
@@ -370,7 +429,9 @@ restart:
                ret = lttcomm_recv_unix_sock(new_sock, (void *)&msg, sizeof(msg));
                if (ret <= 0) {
                        DBG("Nothing recv() from client... continuing");
-                       ret = close(new_sock);
+                       ret = fd_tracker_close_unsuspendable_fd(the_fd_tracker,
+                                       &new_sock, 1, fd_tracker_util_close_fd,
+                                       NULL);
                        if (ret) {
                                PERROR("close");
                        }
@@ -401,7 +462,9 @@ restart:
                }
 
                /* End of transmission */
-               ret = close(new_sock);
+               ret = fd_tracker_close_unsuspendable_fd(the_fd_tracker,
+                               &new_sock, 1, fd_tracker_util_close_fd,
+                               NULL);
                if (ret) {
                        PERROR("close");
                }
@@ -417,7 +480,8 @@ exit:
        DBG("Health check thread dying");
        unlink(health_unix_sock_path);
        if (sock >= 0) {
-               ret = close(sock);
+               ret = fd_tracker_close_unsuspendable_fd(the_fd_tracker, &sock,
+                               1, fd_tracker_util_close_fd, NULL);
                if (ret) {
                        PERROR("close");
                }
@@ -428,7 +492,7 @@ exit:
         * other processes using them.
         */
 
-       lttng_poll_clean(&events);
+       (void) fd_tracker_util_poll_clean(the_fd_tracker, &events);
 
        rcu_unregister_thread();
        return NULL;
This page took 0.027275 seconds and 5 git commands to generate.