sss_process.c revision 08cd034c8584b6f058cf565ce66f7f9f7120622f
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/*
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen Authors:
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen Pavel Březina <pbrezina@redhat.com>
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen Copyright (C) 2016 Red Hat
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen This program is free software; you can redistribute it and/or modify
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen it under the terms of the GNU General Public License as published by
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen the Free Software Foundation; either version 3 of the License, or
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen (at your option) any later version.
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen This program is distributed in the hope that it will be useful,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen GNU General Public License for more details.
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen You should have received a copy of the GNU General Public License
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
19557f192d37cd54a1a090a8a26d9d47265e4413Aki Tuomi*/
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen#include <stdlib.h>
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen#include <stdio.h>
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen#include "util/util.h"
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen#include "tools/common/sss_process.h"
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainenstatic pid_t parse_pid(const char *strpid)
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen{
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen long value;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen char *endptr;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen errno = 0;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen value = strtol(strpid, &endptr, 10);
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen if ((errno != 0) || (endptr == strpid)
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen || ((*endptr != '\0') && (*endptr != '\n'))) {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen return 0;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen }
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen return value;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen}
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainenstatic errno_t sss_pid(pid_t *out_pid)
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen{
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen int ret;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen size_t fsize;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen FILE *pid_file;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen char pid_str[MAX_PID_LENGTH] = {'\0'};
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen *out_pid = 0;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen errno = 0;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen pid_file = fopen(SSSD_PIDFILE, "r");
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen if (pid_file == NULL) {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen ret = errno;
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen DEBUG(SSSDBG_MINOR_FAILURE, "Unable to open pid file \"%s\": %s\n",
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen SSSD_PIDFILE, strerror(ret));
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen goto done;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen }
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen fsize = fread(pid_str, sizeof(char), MAX_PID_LENGTH * sizeof(char),
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen pid_file);
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen if (!feof(pid_file)) {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen /* eof not reached */
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen ret = ferror(pid_file);
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen if (ret != 0) {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Unable to read from file \"%s\": %s\n",
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen SSSD_PIDFILE, strerror(ret));
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen } else {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "File \"%s\" contains invalid pid.\n",
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen SSSD_PIDFILE);
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen }
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen goto done;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen }
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen if (fsize == 0) {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "File \"%s\" contains no pid.\n",
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen SSSD_PIDFILE);
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen ret = EINVAL;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen goto done;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen }
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen pid_str[MAX_PID_LENGTH-1] = '\0';
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen *out_pid = parse_pid(pid_str);
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen if (*out_pid == 0) {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen "File \"%s\" contains invalid pid.\n", SSSD_PIDFILE);
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen ret = EINVAL;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen goto done;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen }
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen ret = EOK;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainendone:
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen if (pid_file != NULL) {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen fclose(pid_file);
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen }
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen return ret;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen}
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainenbool sss_deamon_running(void)
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen{
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen return sss_signal(0) == EOK;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen}
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainenerrno_t sss_signal(int signum)
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen{
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen int ret;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen pid_t pid;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen ret = sss_pid(&pid);
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen if (ret != EOK) {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen return ret;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen }
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen if (kill(pid, signum) != 0) {
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen ret = errno;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen "Could not send signal %d to process %d: %s\n",
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen signum, pid, strerror(errno));
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen return ret;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen }
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen return EOK;
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen}
5806683c1c3f5b1997e92a023c0fe39912d4df5dTimo Sirainen