diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/common/sss_process.c | 126 | ||||
-rw-r--r-- | src/tools/common/sss_process.h | 29 | ||||
-rw-r--r-- | src/tools/sss_debuglevel.c | 3 | ||||
-rw-r--r-- | src/tools/sss_signal.c | 4 | ||||
-rw-r--r-- | src/tools/tools_mc_util.c | 3 | ||||
-rw-r--r-- | src/tools/tools_util.c | 93 | ||||
-rw-r--r-- | src/tools/tools_util.h | 2 |
7 files changed, 162 insertions, 98 deletions
diff --git a/src/tools/common/sss_process.c b/src/tools/common/sss_process.c new file mode 100644 index 000000000..d4db4ab6f --- /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/common/sss_process.h b/src/tools/common/sss_process.h new file mode 100644 index 000000000..43408afc7 --- /dev/null +++ b/src/tools/common/sss_process.h @@ -0,0 +1,29 @@ +/* + 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/>. +*/ + +#ifndef _SSS_PROCESS_H_ +#define _SSS_PROCESS_H_ + +#include "util/util.h" + +bool sss_deamon_running(void); +errno_t sss_signal(int signum); + +#endif /* _SSS_PROCESS_H_ */ diff --git a/src/tools/sss_debuglevel.c b/src/tools/sss_debuglevel.c index 1de1d5994..e8b156ea1 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 efddcce3d..3d6aa669e 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 41d8a6558..ce899eb3c 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 ea63f6263..5e51a4089 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 f914e9a73..93bc621fa 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); |