summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/common/sss_process.c126
-rw-r--r--src/tools/common/sss_process.h29
-rw-r--r--src/tools/sss_debuglevel.c3
-rw-r--r--src/tools/sss_signal.c4
-rw-r--r--src/tools/tools_mc_util.c3
-rw-r--r--src/tools/tools_util.c93
-rw-r--r--src/tools/tools_util.h2
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);