diff options
author | Michal Zidek <mzidek@redhat.com> | 2012-09-10 18:16:26 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2012-09-24 13:09:53 +0200 |
commit | 7c2e91ac48b20e6699d5c98c9912ea6427453c95 (patch) | |
tree | c5a56be85cb085fd97b346bbd3fd590a53937aa6 /src/tools/tools_util.c | |
parent | 1241d9f9daa17ef245c39f69dad4fd100367d299 (diff) | |
download | sssd-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.c | 93 |
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; +} |