From cd69e9e88b4f6bae385596562cd599eae34f33d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
Date: Tue, 14 Jun 2016 12:19:46 +0200
Subject: [PATCH 13/25] sss_tools: add test if sssd is running

---
 Makefile.am                                      |   2 +
 src/tools/common/sss_process.c                   | 126 +++++++++++++++++++++++
 src/tools/{sss_signal.c => common/sss_process.h} |  24 ++---
 src/tools/sss_debuglevel.c                       |   3 +-
 src/tools/sss_signal.c                           |   4 +-
 src/tools/tools_mc_util.c                        |   3 +-
 src/tools/tools_util.c                           |  93 -----------------
 src/tools/tools_util.h                           |   2 +-
 8 files changed, 143 insertions(+), 114 deletions(-)
 create mode 100644 src/tools/common/sss_process.c
 copy src/tools/{sss_signal.c => common/sss_process.h} (64%)

diff --git a/Makefile.am b/Makefile.am
index 3728adb81f7fee006c110af03a15438fa69f44bf..3b2ebbb374f72cb6aafb6039aa3832e3ec853b79 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -491,6 +491,7 @@ SSSD_TOOLS_OBJ = \
     src/tools/files.c \
     src/tools/selinux.c \
     src/tools/common/sss_tools.c \
+    src/tools/common/sss_process.c \
     src/util/nscd.c \
     $(NULL)
 
@@ -724,6 +725,7 @@ dist_noinst_HEADERS = \
     src/lib/winbind_idmap_sss/winbind_idmap_sss.h \
     src/tests/cmocka/test_utils.h \
     src/tools/common/sss_tools.h \
+    src/tools/common/sss_process.h \
     src/tools/common/sss_colondb.h \
     src/util/probes.h \
     $(NULL)
diff --git a/src/tools/common/sss_process.c b/src/tools/common/sss_process.c
new file mode 100644
index 0000000000000000000000000000000000000000..d4db4ab6f28fd154b928b77d0c05d4253b6cd9f3
--- /dev/null
+++ b/src/tools/common/sss_process.c
@@ -0,0 +1,126 @@
+/*
+    Authors:
+        Pavel Březina <pbrezina@redhat.com>
+
+    Copyright (C) 2016 Red Hat
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "util/util.h"
+#include "tools/common/sss_process.h"
+
+#define SSSD_PIDFILE ""PID_PATH"/sssd.pid"
+#define MAX_PID_LENGTH 10
+
+static pid_t parse_pid(const char *strpid)
+{
+    long value;
+    char *endptr;
+
+    errno = 0;
+    value = strtol(strpid, &endptr, 10);
+    if ((errno != 0) || (endptr == strpid)
+        || ((*endptr != '\0') && (*endptr != '\n'))) {
+        return 0;
+    }
+
+    return value;
+}
+
+static errno_t sss_pid(pid_t *out_pid)
+{
+    int ret;
+    size_t fsize;
+    FILE *pid_file;
+    char pid_str[MAX_PID_LENGTH] = {'\0'};
+
+    *out_pid = 0;
+
+    errno = 0;
+    pid_file = fopen(SSSD_PIDFILE, "r");
+    if (pid_file == NULL) {
+        ret = errno;
+        DEBUG(SSSDBG_MINOR_FAILURE, "Unable to open pid file \"%s\": %s\n",
+              SSSD_PIDFILE, strerror(ret));
+        goto done;
+    }
+
+    fsize = fread(pid_str, sizeof(char), MAX_PID_LENGTH * sizeof(char),
+                  pid_file);
+    if (!feof(pid_file)) {
+        /* eof not reached */
+        ret = ferror(pid_file);
+        if (ret != 0) {
+            DEBUG(SSSDBG_CRIT_FAILURE, "Unable to read from file \"%s\": %s\n",
+                  SSSD_PIDFILE, strerror(ret));
+        } else {
+            DEBUG(SSSDBG_CRIT_FAILURE, "File \"%s\" contains invalid pid.\n",
+                  SSSD_PIDFILE);
+        }
+        goto done;
+    }
+    if (fsize == 0) {
+        DEBUG(SSSDBG_CRIT_FAILURE, "File \"%s\" contains no pid.\n",
+              SSSD_PIDFILE);
+        ret = EINVAL;
+        goto done;
+    }
+
+    pid_str[MAX_PID_LENGTH-1] = '\0';
+    *out_pid = parse_pid(pid_str);
+    if (*out_pid == 0) {
+        DEBUG(SSSDBG_CRIT_FAILURE,
+              "File \"%s\" contains invalid pid.\n", SSSD_PIDFILE);
+        ret = EINVAL;
+        goto done;
+    }
+
+    ret = EOK;
+
+done:
+    if (pid_file != NULL) {
+        fclose(pid_file);
+    }
+    return ret;
+}
+
+bool sss_deamon_running(void)
+{
+    return sss_signal(0) == EOK;
+}
+
+errno_t sss_signal(int signum)
+{
+    int ret;
+    pid_t pid;
+
+    ret = sss_pid(&pid);
+    if (ret != EOK) {
+        return ret;
+    }
+
+    if (kill(pid, signum) != 0) {
+        ret = errno;
+        DEBUG(SSSDBG_CRIT_FAILURE,
+              "Could not send signal %d to process %d: %s\n",
+              signum, pid, strerror(errno));
+        return ret;
+    }
+
+    return EOK;
+}
diff --git a/src/tools/sss_signal.c b/src/tools/common/sss_process.h
similarity index 64%
copy from src/tools/sss_signal.c
copy to src/tools/common/sss_process.h
index efddcce3d12bbe270f30ea15af8ab899f4b03dca..43408afc7fab3caed3febd1a159dbfc6acbbb3f9 100644
--- a/src/tools/sss_signal.c
+++ b/src/tools/common/sss_process.h
@@ -1,8 +1,8 @@
 /*
     Authors:
-        Jakub Hrozek <jhrozek@redhat.com>
+        Pavel Březina <pbrezina@redhat.com>
 
-    Copyright (C) 2014 Red Hat
+    Copyright (C) 2016 Red Hat
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -18,20 +18,12 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#include <stdlib.h>
+#ifndef _SSS_PROCESS_H_
+#define _SSS_PROCESS_H_
 
-#include "config.h"
-#include "tools/tools_util.h"
+#include "util/util.h"
 
-int main(int argc, const char **argv)
-{
-    int ret;
+bool sss_deamon_running(void);
+errno_t sss_signal(int signum);
 
-    ret = signal_sssd(SIGUSR2);
-    if (ret != EOK) {
-        ERROR("Could not signal SSSD. Is SSSD running?\n");
-        return EXIT_FAILURE;
-    }
-
-    return EXIT_SUCCESS;
-}
+#endif /* _SSS_PROCESS_H_ */
diff --git a/src/tools/sss_debuglevel.c b/src/tools/sss_debuglevel.c
index 1de1d59942b1d939c852a5eb77c763a847d36668..e8b156ea1bac89218f8372c2135b31ad173f4e07 100644
--- a/src/tools/sss_debuglevel.c
+++ b/src/tools/sss_debuglevel.c
@@ -33,6 +33,7 @@
 #include "config.h"
 #include "util/util.h"
 #include "tools/tools_util.h"
+#include "tools/common/sss_process.h"
 #include "confdb/confdb.h"
 
 #define CHECK(expr, done, msg) do { \
@@ -142,7 +143,7 @@ int main(int argc, const char **argv)
     ret = set_debug_level(ctx, debug_to_set, config_file);
     CHECK(ret != EOK, fini, "Could not set debug level.");
 
-    ret = signal_sssd(SIGHUP);
+    ret = sss_signal(SIGHUP);
     CHECK(ret != EOK, fini,
           "Could not force sssd processes to reload configuration. "
           "Is sssd running?");
diff --git a/src/tools/sss_signal.c b/src/tools/sss_signal.c
index efddcce3d12bbe270f30ea15af8ab899f4b03dca..3d6aa669e3a2e5598b40f8640689d861df222f8c 100644
--- a/src/tools/sss_signal.c
+++ b/src/tools/sss_signal.c
@@ -21,13 +21,13 @@
 #include <stdlib.h>
 
 #include "config.h"
-#include "tools/tools_util.h"
+#include "tools/common/sss_process.h"
 
 int main(int argc, const char **argv)
 {
     int ret;
 
-    ret = signal_sssd(SIGUSR2);
+    ret = sss_signal(SIGUSR2);
     if (ret != EOK) {
         ERROR("Could not signal SSSD. Is SSSD running?\n");
         return EXIT_FAILURE;
diff --git a/src/tools/tools_mc_util.c b/src/tools/tools_mc_util.c
index 41d8a6558a06b03787e0ff37f37b31f223a9da34..ce899eb3c674afe8271be526dc83aa909cbecf89 100644
--- a/src/tools/tools_mc_util.c
+++ b/src/tools/tools_mc_util.c
@@ -29,6 +29,7 @@
 #include "util/mmap_cache.h"
 #include "util/sss_cli_cmd.h"
 #include "sss_client/sss_cli.h"
+#include "tools/common/sss_process.h"
 
 /* This is a copy of sss_mc_set_recycled present in
  * src/responder/nss/nsssrv_mmap_cache.c. If you modify this function,
@@ -219,7 +220,7 @@ errno_t sss_memcache_clear_all(void)
             return EIO;
         }
         DEBUG(SSSDBG_TRACE_FUNC, "Sending SIGHUP to monitor.\n");
-        ret = signal_sssd(SIGHUP);
+        ret = sss_signal(SIGHUP);
         if (ret != EOK) {
             DEBUG(SSSDBG_CRIT_FAILURE,
                   "Failed to send SIGHUP to monitor.\n");
diff --git a/src/tools/tools_util.c b/src/tools/tools_util.c
index ea63f626328a83299a0fdb7a10ad6b968f0cea5a..5e51a4089e48d44347d87ba1beec6fff9ca30748 100644
--- a/src/tools/tools_util.c
+++ b/src/tools/tools_util.c
@@ -592,96 +592,3 @@ done:
     talloc_free(conf_path);
     return ret;
 }
-
-static pid_t parse_pid(const char *strpid)
-{
-    long value;
-    char *endptr;
-
-    errno = 0;
-    value = strtol(strpid, &endptr, 10);
-    if ((errno != 0) || (endptr == strpid)
-        || ((*endptr != '\0') && (*endptr != '\n'))) {
-        return 0;
-    }
-
-    return value;
-}
-
-static errno_t get_sssd_pid(pid_t *out_pid)
-{
-    int ret;
-    size_t fsize;
-    FILE *pid_file = NULL;
-    char pid_str[MAX_PID_LENGTH] = {'\0'};
-
-    *out_pid = 0;
-
-    errno = 0;
-    pid_file = fopen(SSSD_PIDFILE, "r");
-    if (pid_file == NULL) {
-        ret = errno;
-        DEBUG(SSSDBG_MINOR_FAILURE, "Unable to open pid file \"%s\": %s\n",
-              SSSD_PIDFILE, strerror(ret));
-        goto done;
-    }
-
-    fsize = fread(pid_str, sizeof(char), MAX_PID_LENGTH * sizeof(char),
-                  pid_file);
-    if (!feof(pid_file)) {
-        /* eof not reached */
-        ret = ferror(pid_file);
-        if (ret != 0) {
-            DEBUG(SSSDBG_CRIT_FAILURE, "Unable to read from file \"%s\": %s\n",
-                  SSSD_PIDFILE, strerror(ret));
-        } else {
-            DEBUG(SSSDBG_CRIT_FAILURE, "File \"%s\" contains invalid pid.\n",
-                  SSSD_PIDFILE);
-        }
-        goto done;
-    }
-    if (fsize == 0) {
-        DEBUG(SSSDBG_CRIT_FAILURE, "File \"%s\" contains no pid.\n",
-              SSSD_PIDFILE);
-        ret = EINVAL;
-        goto done;
-    }
-
-    pid_str[MAX_PID_LENGTH-1] = '\0';
-    *out_pid = parse_pid(pid_str);
-    if (*out_pid == 0) {
-        DEBUG(SSSDBG_CRIT_FAILURE,
-              "File \"%s\" contains invalid pid.\n", SSSD_PIDFILE);
-        ret = EINVAL;
-        goto done;
-    }
-
-    ret = EOK;
-
-done:
-    if (pid_file != NULL) {
-        fclose(pid_file);
-    }
-    return ret;
-}
-
-errno_t signal_sssd(int signum)
-{
-    int ret;
-    pid_t pid;
-
-    ret = get_sssd_pid(&pid);
-    if (ret != EOK) {
-        return ret;
-    }
-
-    if (kill(pid, signum) != 0) {
-        ret = errno;
-        DEBUG(SSSDBG_CRIT_FAILURE,
-              "Could not send signal %d to process %d: %s\n",
-              signum, pid, strerror(errno));
-        return ret;
-    }
-
-    return EOK;
-}
diff --git a/src/tools/tools_util.h b/src/tools/tools_util.h
index f914e9a73b817873f18cd2c2ea70e830460e4539..93bc621fa2c98384b22ccd1066f02e9f4db10468 100644
--- a/src/tools/tools_util.h
+++ b/src/tools/tools_util.h
@@ -102,7 +102,7 @@ int remove_homedir(TALLOC_CTX *mem_ctx,
 
 int run_userdel_cmd(struct tools_ctx *tctx);
 
-errno_t signal_sssd(int signum);
+errno_t sss_signal(int signum);
 
 /* tools_mc_util.c */
 errno_t sss_memcache_invalidate(const char *mc_filename);
-- 
2.1.0

