From c5300c05faadd99640141446e6786fa936dfbc68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Tue, 14 Jun 2016 12:19:46 +0200 Subject: [PATCH 13/27] 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 93c5f09f3e15d38501b16e761477f9bf40d24158..cc23004ec5bdab5cff048a9add1f2893ab7cee8a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -490,6 +490,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) @@ -723,6 +724,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 + + 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 . +*/ + +#include +#include + +#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 + Pavel Březina - 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 . */ -#include +#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 #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.4.11