summaryrefslogtreecommitdiffstats
path: root/src/tools/tools_util.c
diff options
context:
space:
mode:
authorMichal Zidek <mzidek@redhat.com>2012-09-10 18:16:26 +0200
committerJakub Hrozek <jhrozek@redhat.com>2012-09-24 13:09:53 +0200
commit7c2e91ac48b20e6699d5c98c9912ea6427453c95 (patch)
treec5a56be85cb085fd97b346bbd3fd590a53937aa6 /src/tools/tools_util.c
parent1241d9f9daa17ef245c39f69dad4fd100367d299 (diff)
downloadsssd-7c2e91ac48b20e6699d5c98c9912ea6427453c95.tar.gz
sssd-7c2e91ac48b20e6699d5c98c9912ea6427453c95.tar.xz
sssd-7c2e91ac48b20e6699d5c98c9912ea6427453c95.zip
tools_util.h provides signal_sssd function.
Diffstat (limited to 'src/tools/tools_util.c')
-rw-r--r--src/tools/tools_util.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/tools/tools_util.c b/src/tools/tools_util.c
index fbb1d81bd..049a4f581 100644
--- a/src/tools/tools_util.c
+++ b/src/tools/tools_util.c
@@ -578,3 +578,96 @@ 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;
+}