aboutsummaryrefslogtreecommitdiff
path: root/src/librc-daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/librc-daemon.c')
-rw-r--r--src/librc-daemon.c974
1 files changed, 462 insertions, 512 deletions
diff --git a/src/librc-daemon.c b/src/librc-daemon.c
index 3add7e4c..240ca6ed 100644
--- a/src/librc-daemon.c
+++ b/src/librc-daemon.c
@@ -9,7 +9,7 @@
#include <sys/stat.h>
#if defined(__DragonFly__) || defined(__FreeBSD__) || \
- defined(__NetBSD__) || defined (__OpenBSD__)
+ defined(__NetBSD__) || defined (__OpenBSD__)
#include <sys/param.h>
#include <sys/user.h>
#include <sys/sysctl.h>
@@ -37,150 +37,143 @@
#if defined(__linux__)
static bool pid_is_cmd (pid_t pid, const char *cmd)
{
- char buffer[32];
- FILE *fp;
- int c;
+ char buffer[32];
+ FILE *fp;
+ int c;
- snprintf(buffer, sizeof (buffer), "/proc/%d/stat", pid);
- if ((fp = fopen (buffer, "r")) == NULL)
- return (false);
+ snprintf(buffer, sizeof (buffer), "/proc/%d/stat", pid);
+ if ((fp = fopen (buffer, "r")) == NULL)
+ return (false);
- while ((c = getc (fp)) != EOF && c != '(')
- ;
+ while ((c = getc (fp)) != EOF && c != '(')
+ ;
- if (c != '(')
- {
- fclose(fp);
- return (false);
- }
+ if (c != '(') {
+ fclose(fp);
+ return (false);
+ }
- while ((c = getc (fp)) != EOF && c == *cmd)
- cmd++;
+ while ((c = getc (fp)) != EOF && c == *cmd)
+ cmd++;
- fclose (fp);
+ fclose (fp);
- return ((c == ')' && *cmd == '\0') ? true : false);
+ return ((c == ')' && *cmd == '\0') ? true : false);
}
static bool pid_is_exec (pid_t pid, const char *exec)
{
- char cmdline[32];
- char buffer[PATH_MAX];
- char *p;
- int fd = -1;
- int r;
-
- snprintf (cmdline, sizeof (cmdline), "/proc/%u/exe", pid);
- memset (buffer, 0, sizeof (buffer));
- if (readlink (cmdline, buffer, sizeof (buffer)) != -1)
- {
- if (strcmp (exec, buffer) == 0)
- return (true);
-
- /* We should cater for deleted binaries too */
- if (strlen (buffer) > 10)
- {
- p = buffer + (strlen (buffer) - 10);
- if (strcmp (p, " (deleted)") == 0)
- {
- *p = 0;
- if (strcmp (buffer, exec) == 0)
- return (true);
- }
- }
- }
-
- snprintf (cmdline, sizeof (cmdline), "/proc/%u/cmdline", pid);
- if ((fd = open (cmdline, O_RDONLY)) < 0)
- return (false);
-
- r = read(fd, buffer, sizeof (buffer));
- close (fd);
-
- if (r == -1)
- return 0;
-
- buffer[r] = 0;
- return (strcmp (exec, buffer) == 0 ? true : false);
+ char cmdline[32];
+ char buffer[PATH_MAX];
+ char *p;
+ int fd = -1;
+ int r;
+
+ snprintf (cmdline, sizeof (cmdline), "/proc/%u/exe", pid);
+ memset (buffer, 0, sizeof (buffer));
+ if (readlink (cmdline, buffer, sizeof (buffer)) != -1) {
+ if (strcmp (exec, buffer) == 0)
+ return (true);
+
+ /* We should cater for deleted binaries too */
+ if (strlen (buffer) > 10) {
+ p = buffer + (strlen (buffer) - 10);
+ if (strcmp (p, " (deleted)") == 0) {
+ *p = 0;
+ if (strcmp (buffer, exec) == 0)
+ return (true);
+ }
+ }
+ }
+
+ snprintf (cmdline, sizeof (cmdline), "/proc/%u/cmdline", pid);
+ if ((fd = open (cmdline, O_RDONLY)) < 0)
+ return (false);
+
+ r = read(fd, buffer, sizeof (buffer));
+ close (fd);
+
+ if (r == -1)
+ return 0;
+
+ buffer[r] = 0;
+ return (strcmp (exec, buffer) == 0 ? true : false);
}
pid_t *rc_find_pids (const char *exec, const char *cmd,
- uid_t uid, pid_t pid)
+ uid_t uid, pid_t pid)
{
- DIR *procdir;
- struct dirent *entry;
- int npids = 0;
- int foundany = false;
- pid_t p;
- pid_t *pids = NULL;
- char buffer[PATH_MAX];
- struct stat sb;
- pid_t runscript_pid = 0;
- char *pp;
-
- if ((procdir = opendir ("/proc")) == NULL)
- eerrorx ("opendir `/proc': %s", strerror (errno));
-
- /*
- We never match RC_RUNSCRIPT_PID if present so we avoid the below
- scenario
-
- /etc/init.d/ntpd stop does
- start-stop-daemon --stop --name ntpd
- catching /etc/init.d/ntpd stop
-
- nasty
- */
-
- if ((pp = getenv ("RC_RUNSCRIPT_PID")))
- {
- if (sscanf (pp, "%d", &runscript_pid) != 1)
- runscript_pid = 0;
- }
-
- while ((entry = readdir (procdir)) != NULL)
- {
- if (sscanf (entry->d_name, "%d", &p) != 1)
- continue;
- foundany = true;
-
- if (runscript_pid != 0 && runscript_pid == p)
- continue;
-
- if (pid != 0 && pid != p)
- continue;
-
- if (uid)
- {
- snprintf (buffer, sizeof (buffer), "/proc/%d", pid);
- if (stat (buffer, &sb) != 0 || sb.st_uid != uid)
- continue;
- }
-
- if (cmd && ! pid_is_cmd (p, cmd))
- continue;
-
- if (exec && ! cmd && ! pid_is_exec (p, exec))
- continue;
-
- pids = realloc (pids, sizeof (pid_t) * (npids + 2));
- if (! pids)
- eerrorx ("memory exhausted");
-
- pids[npids] = p;
- pids[npids + 1] = 0;
- npids++;
- }
- closedir (procdir);
-
- if (! foundany)
- eerrorx ("nothing in /proc");
-
- return (pids);
+ DIR *procdir;
+ struct dirent *entry;
+ int npids = 0;
+ int foundany = false;
+ pid_t p;
+ pid_t *pids = NULL;
+ char buffer[PATH_MAX];
+ struct stat sb;
+ pid_t runscript_pid = 0;
+ char *pp;
+
+ if ((procdir = opendir ("/proc")) == NULL)
+ eerrorx ("opendir `/proc': %s", strerror (errno));
+
+ /*
+ We never match RC_RUNSCRIPT_PID if present so we avoid the below
+ scenario
+
+ /etc/init.d/ntpd stop does
+ start-stop-daemon --stop --name ntpd
+ catching /etc/init.d/ntpd stop
+
+ nasty
+ */
+
+ if ((pp = getenv ("RC_RUNSCRIPT_PID"))) {
+ if (sscanf (pp, "%d", &runscript_pid) != 1)
+ runscript_pid = 0;
+ }
+
+ while ((entry = readdir (procdir)) != NULL) {
+ if (sscanf (entry->d_name, "%d", &p) != 1)
+ continue;
+ foundany = true;
+
+ if (runscript_pid != 0 && runscript_pid == p)
+ continue;
+
+ if (pid != 0 && pid != p)
+ continue;
+
+ if (uid) {
+ snprintf (buffer, sizeof (buffer), "/proc/%d", pid);
+ if (stat (buffer, &sb) != 0 || sb.st_uid != uid)
+ continue;
+ }
+
+ if (cmd && ! pid_is_cmd (p, cmd))
+ continue;
+
+ if (exec && ! cmd && ! pid_is_exec (p, exec))
+ continue;
+
+ pids = realloc (pids, sizeof (pid_t) * (npids + 2));
+ if (! pids)
+ eerrorx ("memory exhausted");
+
+ pids[npids] = p;
+ pids[npids + 1] = 0;
+ npids++;
+ }
+ closedir (procdir);
+
+ if (! foundany)
+ eerrorx ("nothing in /proc");
+
+ return (pids);
}
#elif defined(__DragonFly__) || defined(__FreeBSD__) || \
- defined(__NetBSD__) || defined(__OpenBSD__)
+ defined(__NetBSD__) || defined(__OpenBSD__)
# if defined(__DragonFly__) || defined(__FreeBSD__)
# ifndef KERN_PROC_PROC
@@ -200,63 +193,60 @@ pid_t *rc_find_pids (const char *exec, const char *cmd,
# endif
pid_t *rc_find_pids (const char *exec, const char *cmd,
- uid_t uid, pid_t pid)
+ uid_t uid, pid_t pid)
{
- static kvm_t *kd = NULL;
- char errbuf[_POSIX2_LINE_MAX];
- struct _KINFO_PROC *kp;
- int i;
- int processes = 0;
- int argc = 0;
- char **argv;
- pid_t *pids = NULL;
- int npids = 0;
-
- if ((kd = kvm_openfiles (NULL, NULL, NULL, O_RDONLY, errbuf)) == NULL)
- eerrorx ("kvm_open: %s", errbuf);
+ static kvm_t *kd = NULL;
+ char errbuf[_POSIX2_LINE_MAX];
+ struct _KINFO_PROC *kp;
+ int i;
+ int processes = 0;
+ int argc = 0;
+ char **argv;
+ pid_t *pids = NULL;
+ int npids = 0;
+
+ if ((kd = kvm_openfiles (NULL, NULL, NULL, O_RDONLY, errbuf)) == NULL)
+ eerrorx ("kvm_open: %s", errbuf);
#if defined(__DragonFly__) || defined( __FreeBSD__)
- kp = kvm_getprocs (kd, KERN_PROC_PROC, 0, &processes);
+ kp = kvm_getprocs (kd, KERN_PROC_PROC, 0, &processes);
#else
- kp = kvm_getproc2 (kd, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc2),
- &processes);
+ kp = kvm_getproc2 (kd, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc2),
+ &processes);
#endif
- for (i = 0; i < processes; i++)
- {
- pid_t p = _GET_KINFO_PID (kp[i]);
- if (pid != 0 && pid != p)
- continue;
-
- if (uid != 0 && uid != _GET_KINFO_UID (kp[i]))
- continue;
-
- if (cmd)
- {
- if (! _GET_KINFO_COMM (kp[i]) ||
- strcmp (cmd, _GET_KINFO_COMM (kp[i])) != 0)
- continue;
- }
-
- if (exec && ! cmd)
- {
- if ((argv = _KVM_GETARGV (kd, &kp[i], argc)) == NULL || ! *argv)
- continue;
-
- if (strcmp (*argv, exec) != 0)
- continue;
- }
-
- pids = realloc (pids, sizeof (pid_t) * (npids + 2));
- if (! pids)
- eerrorx ("memory exhausted");
-
- pids[npids] = p;
- pids[npids + 1] = 0;
- npids++;
- }
- kvm_close(kd);
-
- return (pids);
+ for (i = 0; i < processes; i++) {
+ pid_t p = _GET_KINFO_PID (kp[i]);
+ if (pid != 0 && pid != p)
+ continue;
+
+ if (uid != 0 && uid != _GET_KINFO_UID (kp[i]))
+ continue;
+
+ if (cmd) {
+ if (! _GET_KINFO_COMM (kp[i]) ||
+ strcmp (cmd, _GET_KINFO_COMM (kp[i])) != 0)
+ continue;
+ }
+
+ if (exec && ! cmd) {
+ if ((argv = _KVM_GETARGV (kd, &kp[i], argc)) == NULL || ! *argv)
+ continue;
+
+ if (strcmp (*argv, exec) != 0)
+ continue;
+ }
+
+ pids = realloc (pids, sizeof (pid_t) * (npids + 2));
+ if (! pids)
+ eerrorx ("memory exhausted");
+
+ pids[npids] = p;
+ pids[npids + 1] = 0;
+ npids++;
+ }
+ kvm_close(kd);
+
+ return (pids);
}
#else
@@ -264,349 +254,309 @@ pid_t *rc_find_pids (const char *exec, const char *cmd,
#endif
static bool _match_daemon (const char *path, const char *file,
- const char *mexec, const char *mname,
- const char *mpidfile)
+ const char *mexec, const char *mname,
+ const char *mpidfile)
{
- char buffer[RC_LINEBUFFER];
- char *ffile = rc_strcatpaths (path, file, (char *) NULL);
- FILE *fp;
- int lc = 0;
- int m = 0;
-
- if (! rc_exists (ffile))
- {
- free (ffile);
- return (false);
- }
-
- if ((fp = fopen (ffile, "r")) == NULL)
- {
- eerror ("fopen `%s': %s", ffile, strerror (errno));
- free (ffile);
- return (false);
- }
-
- if (! mname)
- m += 10;
- if (! mpidfile)
- m += 100;
-
- memset (buffer, 0, sizeof (buffer));
- while ((fgets (buffer, RC_LINEBUFFER, fp)))
- {
- int lb = strlen (buffer) - 1;
- if (buffer[lb] == '\n')
- buffer[lb] = 0;
-
- if (strcmp (buffer, mexec) == 0)
- m += 1;
- else if (mname && strcmp (buffer, mname) == 0)
- m += 10;
- else if (mpidfile && strcmp (buffer, mpidfile) == 0)
- m += 100;
-
- if (m == 111)
- break;
-
- lc++;
- if (lc > 5)
- break;
- }
- fclose (fp);
- free (ffile);
-
- return (m == 111 ? true : false);
+ char buffer[RC_LINEBUFFER];
+ char *ffile = rc_strcatpaths (path, file, (char *) NULL);
+ FILE *fp;
+ int lc = 0;
+ int m = 0;
+
+ if (! rc_exists (ffile)) {
+ free (ffile);
+ return (false);
+ }
+
+ if ((fp = fopen (ffile, "r")) == NULL) {
+ eerror ("fopen `%s': %s", ffile, strerror (errno));
+ free (ffile);
+ return (false);
+ }
+
+ if (! mname)
+ m += 10;
+ if (! mpidfile)
+ m += 100;
+
+ memset (buffer, 0, sizeof (buffer));
+ while ((fgets (buffer, RC_LINEBUFFER, fp))) {
+ int lb = strlen (buffer) - 1;
+ if (buffer[lb] == '\n')
+ buffer[lb] = 0;
+
+ if (strcmp (buffer, mexec) == 0)
+ m += 1;
+ else if (mname && strcmp (buffer, mname) == 0)
+ m += 10;
+ else if (mpidfile && strcmp (buffer, mpidfile) == 0)
+ m += 100;
+
+ if (m == 111)
+ break;
+
+ lc++;
+ if (lc > 5)
+ break;
+ }
+ fclose (fp);
+ free (ffile);
+
+ return (m == 111 ? true : false);
}
void rc_set_service_daemon (const char *service, const char *exec,
- const char *name, const char *pidfile,
- bool started)
+ const char *name, const char *pidfile,
+ bool started)
{
- char *dirpath = rc_strcatpaths (RC_SVCDIR, "daemons", basename (service),
- (char *) NULL);
- char **files = NULL;
- char *file;
- char *ffile = NULL;
- int i;
- char *mexec;
- char *mname;
- char *mpidfile;
- int nfiles = 0;
-
- if (! exec && ! name && ! pidfile)
- return;
-
- if (exec)
- {
- i = strlen (exec) + 6;
- mexec = rc_xmalloc (sizeof (char *) * i);
- snprintf (mexec, i, "exec=%s", exec);
- }
- else
- mexec = strdup ("exec=");
-
- if (name)
- {
- i = strlen (name) + 6;
- mname = rc_xmalloc (sizeof (char *) * i);
- snprintf (mname, i, "name=%s", name);
- }
- else
- mname = strdup ("name=");
-
- if (pidfile)
- {
- i = strlen (pidfile) + 9;
- mpidfile = rc_xmalloc (sizeof (char *) * i);
- snprintf (mpidfile, i, "pidfile=%s", pidfile);
- }
- else
- mpidfile = strdup ("pidfile=");
-
- /* Regardless, erase any existing daemon info */
- if (rc_is_dir (dirpath))
- {
- char *oldfile = NULL;
- files = rc_ls_dir (NULL, dirpath, 0);
- STRLIST_FOREACH (files, file, i)
- {
- ffile = rc_strcatpaths (dirpath, file, (char *) NULL);
- nfiles++;
-
- if (! oldfile)
- {
- if (_match_daemon (dirpath, file, mexec, mname, mpidfile))
- {
- unlink (ffile);
- oldfile = ffile;
- nfiles--;
- }
- }
- else
- {
- rename (ffile, oldfile);
- free (oldfile);
- oldfile = ffile;
- }
- }
- if (ffile)
- free (ffile);
- free (files);
- }
-
- /* Now store our daemon info */
- if (started)
- {
- char buffer[10];
- FILE *fp;
-
- if (! rc_is_dir (dirpath))
- if (mkdir (dirpath, 0755) != 0)
- eerror ("mkdir `%s': %s", dirpath, strerror (errno));
-
- snprintf (buffer, sizeof (buffer), "%03d", nfiles + 1);
- file = rc_strcatpaths (dirpath, buffer, (char *) NULL);
- if ((fp = fopen (file, "w")) == NULL)
- eerror ("fopen `%s': %s", file, strerror (errno));
- else
- {
- fprintf (fp, "%s\n%s\n%s\n", mexec, mname, mpidfile);
- fclose (fp);
- }
- free (file);
- }
-
- free (mexec);
- free (mname);
- free (mpidfile);
- free (dirpath);
+ char *dirpath = rc_strcatpaths (RC_SVCDIR, "daemons", basename (service),
+ (char *) NULL);
+ char **files = NULL;
+ char *file;
+ char *ffile = NULL;
+ int i;
+ char *mexec;
+ char *mname;
+ char *mpidfile;
+ int nfiles = 0;
+
+ if (! exec && ! name && ! pidfile)
+ return;
+
+ if (exec) {
+ i = strlen (exec) + 6;
+ mexec = rc_xmalloc (sizeof (char *) * i);
+ snprintf (mexec, i, "exec=%s", exec);
+ } else
+ mexec = strdup ("exec=");
+
+ if (name) {
+ i = strlen (name) + 6;
+ mname = rc_xmalloc (sizeof (char *) * i);
+ snprintf (mname, i, "name=%s", name);
+ } else
+ mname = strdup ("name=");
+
+ if (pidfile) {
+ i = strlen (pidfile) + 9;
+ mpidfile = rc_xmalloc (sizeof (char *) * i);
+ snprintf (mpidfile, i, "pidfile=%s", pidfile);
+ } else
+ mpidfile = strdup ("pidfile=");
+
+ /* Regardless, erase any existing daemon info */
+ if (rc_is_dir (dirpath)) {
+ char *oldfile = NULL;
+ files = rc_ls_dir (NULL, dirpath, 0);
+ STRLIST_FOREACH (files, file, i) {
+ ffile = rc_strcatpaths (dirpath, file, (char *) NULL);
+ nfiles++;
+
+ if (! oldfile) {
+ if (_match_daemon (dirpath, file, mexec, mname, mpidfile)) {
+ unlink (ffile);
+ oldfile = ffile;
+ nfiles--;
+ }
+ } else {
+ rename (ffile, oldfile);
+ free (oldfile);
+ oldfile = ffile;
+ }
+ }
+ if (ffile)
+ free (ffile);
+ free (files);
+ }
+
+ /* Now store our daemon info */
+ if (started) {
+ char buffer[10];
+ FILE *fp;
+
+ if (! rc_is_dir (dirpath))
+ if (mkdir (dirpath, 0755) != 0)
+ eerror ("mkdir `%s': %s", dirpath, strerror (errno));
+
+ snprintf (buffer, sizeof (buffer), "%03d", nfiles + 1);
+ file = rc_strcatpaths (dirpath, buffer, (char *) NULL);
+ if ((fp = fopen (file, "w")) == NULL)
+ eerror ("fopen `%s': %s", file, strerror (errno));
+ else {
+ fprintf (fp, "%s\n%s\n%s\n", mexec, mname, mpidfile);
+ fclose (fp);
+ }
+ free (file);
+ }
+
+ free (mexec);
+ free (mname);
+ free (mpidfile);
+ free (dirpath);
}
bool rc_service_started_daemon (const char *service, const char *exec,
- int indx)
+ int indx)
{
- char *dirpath;
- char *file;
- int i;
- char *mexec;
- bool retval = false;
-
- if (! service || ! exec)
- return (false);
-
- dirpath = rc_strcatpaths (RC_SVCDIR, "daemons", basename (service),
- (char *) NULL);
- if (! rc_is_dir (dirpath))
- {
- free (dirpath);
- return (false);
- }
-
- i = strlen (exec) + 6;
- mexec = rc_xmalloc (sizeof (char *) * i);
- snprintf (mexec, i, "exec=%s", exec);
-
- if (indx > 0)
- {
- int len = sizeof (char *) * 10;
- file = rc_xmalloc (len);
- snprintf (file, len, "%03d", indx);
- retval = _match_daemon (dirpath, file, mexec, NULL, NULL);
- free (file);
- }
- else
- {
- char **files = rc_ls_dir (NULL, dirpath, 0);
- STRLIST_FOREACH (files, file, i)
- {
- retval = _match_daemon (dirpath, file, mexec, NULL, NULL);
- if (retval)
- break;
- }
- free (files);
- }
-
- free (mexec);
- return (retval);
+ char *dirpath;
+ char *file;
+ int i;
+ char *mexec;
+ bool retval = false;
+
+ if (! service || ! exec)
+ return (false);
+
+ dirpath = rc_strcatpaths (RC_SVCDIR, "daemons", basename (service),
+ (char *) NULL);
+ if (! rc_is_dir (dirpath)) {
+ free (dirpath);
+ return (false);
+ }
+
+ i = strlen (exec) + 6;
+ mexec = rc_xmalloc (sizeof (char *) * i);
+ snprintf (mexec, i, "exec=%s", exec);
+
+ if (indx > 0) {
+ int len = sizeof (char *) * 10;
+ file = rc_xmalloc (len);
+ snprintf (file, len, "%03d", indx);
+ retval = _match_daemon (dirpath, file, mexec, NULL, NULL);
+ free (file);
+ } else {
+ char **files = rc_ls_dir (NULL, dirpath, 0);
+ STRLIST_FOREACH (files, file, i) {
+ retval = _match_daemon (dirpath, file, mexec, NULL, NULL);
+ if (retval)
+ break;
+ }
+ free (files);
+ }
+
+ free (mexec);
+ return (retval);
}
bool rc_service_daemons_crashed (const char *service)
{
- char *dirpath;
- char **files;
- char *file;
- char *path;
- int i;
- FILE *fp;
- char buffer[RC_LINEBUFFER];
- char *exec = NULL;
- char *name = NULL;
- char *pidfile = NULL;
- pid_t pid = 0;
- pid_t *pids = NULL;
- char *p;
- char *token;
- bool retval = false;
-
- if (! service)
- return (false);
-
- dirpath = rc_strcatpaths (RC_SVCDIR, "daemons", basename (service),
- (char *) NULL);
- if (! rc_is_dir (dirpath))
- {
- free (dirpath);
- return (false);
- }
-
- memset (buffer, 0, sizeof (buffer));
- files = rc_ls_dir (NULL, dirpath, 0);
- STRLIST_FOREACH (files, file, i)
- {
- path = rc_strcatpaths (dirpath, file, (char *) NULL);
- fp = fopen (path, "r");
- free (path);
- if (! fp)
- {
- eerror ("fopen `%s': %s", file, strerror (errno));
- continue;
- }
-
- while ((fgets (buffer, RC_LINEBUFFER, fp)))
- {
- int lb = strlen (buffer) - 1;
- if (buffer[lb] == '\n')
- buffer[lb] = 0;
-
- p = buffer;
- if ((token = strsep (&p, "=")) == NULL || ! p)
- continue;
-
- if (strlen (p) == 0)
- continue;
-
- if (strcmp (token, "exec") == 0)
- {
- if (exec)
- free (exec);
- exec = strdup (p);
- }
- else if (strcmp (token, "name") == 0)
- {
- if (name)
- free (name);
- name = strdup (p);
- }
- else if (strcmp (token, "pidfile") == 0)
- {
- if (pidfile)
- free (pidfile);
- pidfile = strdup (p);
- }
- }
- fclose (fp);
-
- pid = 0;
- if (pidfile)
- {
- if (! rc_exists (pidfile))
- {
- retval = true;
- break;
- }
-
- if ((fp = fopen (pidfile, "r")) == NULL)
- {
- eerror ("fopen `%s': %s", pidfile, strerror (errno));
- retval = true;
- break;
- }
-
- if (fscanf (fp, "%d", &pid) != 1)
- {
- eerror ("no pid found in `%s'", pidfile);
- fclose (fp);
- retval = true;
- break;
- }
-
- fclose (fp);
- free (pidfile);
- pidfile = NULL;
- }
-
- if ((pids = rc_find_pids (exec, name, 0, pid)) == NULL)
- {
- retval = true;
- break;
- }
- free (pids);
-
- if (exec)
- {
- free (exec);
- exec = NULL;
- }
- if (name)
- {
- free (name);
- name = NULL;
- }
- }
-
- if (exec)
- {
- free (exec);
- exec = NULL;
- }
- if (name)
- {
- free (name);
- name = NULL;
- }
-
- free (dirpath);
- rc_strlist_free (files);
-
- return (retval);
+ char *dirpath;
+ char **files;
+ char *file;
+ char *path;
+ int i;
+ FILE *fp;
+ char buffer[RC_LINEBUFFER];
+ char *exec = NULL;
+ char *name = NULL;
+ char *pidfile = NULL;
+ pid_t pid = 0;
+ pid_t *pids = NULL;
+ char *p;
+ char *token;
+ bool retval = false;
+
+ if (! service)
+ return (false);
+
+ dirpath = rc_strcatpaths (RC_SVCDIR, "daemons", basename (service),
+ (char *) NULL);
+ if (! rc_is_dir (dirpath)) {
+ free (dirpath);
+ return (false);
+ }
+
+ memset (buffer, 0, sizeof (buffer));
+ files = rc_ls_dir (NULL, dirpath, 0);
+ STRLIST_FOREACH (files, file, i) {
+ path = rc_strcatpaths (dirpath, file, (char *) NULL);
+ fp = fopen (path, "r");
+ free (path);
+ if (! fp) {
+ eerror ("fopen `%s': %s", file, strerror (errno));
+ continue;
+ }
+
+ while ((fgets (buffer, RC_LINEBUFFER, fp))) {
+ int lb = strlen (buffer) - 1;
+ if (buffer[lb] == '\n')
+ buffer[lb] = 0;
+
+ p = buffer;
+ if ((token = strsep (&p, "=")) == NULL || ! p)
+ continue;
+
+ if (strlen (p) == 0)
+ continue;
+
+ if (strcmp (token, "exec") == 0) {
+ if (exec)
+ free (exec);
+ exec = strdup (p);
+ } else if (strcmp (token, "name") == 0) {
+ if (name)
+ free (name);
+ name = strdup (p);
+ } else if (strcmp (token, "pidfile") == 0) {
+ if (pidfile)
+ free (pidfile);
+ pidfile = strdup (p);
+ }
+ }
+ fclose (fp);
+
+ pid = 0;
+ if (pidfile) {
+ if (! rc_exists (pidfile)) {
+ retval = true;
+ break;
+ }
+
+ if ((fp = fopen (pidfile, "r")) == NULL) {
+ eerror ("fopen `%s': %s", pidfile, strerror (errno));
+ retval = true;
+ break;
+ }
+
+ if (fscanf (fp, "%d", &pid) != 1) {
+ eerror ("no pid found in `%s'", pidfile);
+ fclose (fp);
+ retval = true;
+ break;
+ }
+
+ fclose (fp);
+ free (pidfile);
+ pidfile = NULL;
+ }
+
+ if ((pids = rc_find_pids (exec, name, 0, pid)) == NULL) {
+ retval = true;
+ break;
+ }
+ free (pids);
+
+ if (exec) {
+ free (exec);
+ exec = NULL;
+ }
+ if (name) {
+ free (name);
+ name = NULL;
+ }
+ }
+
+ if (exec) {
+ free (exec);
+ exec = NULL;
+ }
+ if (name) {
+ free (name);
+ name = NULL;
+ }
+
+ free (dirpath);
+ rc_strlist_free (files);
+
+ return (retval);
}