diff options
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | utils/start-stop-daemon.c | 87 |
2 files changed, 89 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog index 82eff792b..27d223c80 100644 --- a/debian/changelog +++ b/debian/changelog @@ -40,6 +40,8 @@ dpkg (1.18.11) UNRELEASED; urgency=medium start-stop-daemon. This affects Mac OS X. - On FreeBSD return STATUS_UNKNOWN instead of false in start-stop-daemon do_procinit(). + - Port start-stop-daemon process handling to Mac OS X. + Based on a patch by Mo McRoberts <mo@nevali.net>. * Perl modules: - Obsolete Source-Version substvar in Dpkg::Substvars by emitting errors. - Rework keyring hooks in Dpkg::Vendor. Deprecate the keyrings hook, and diff --git a/utils/start-stop-daemon.c b/utils/start-stop-daemon.c index 440d17f0f..ed4a50245 100644 --- a/utils/start-stop-daemon.c +++ b/utils/start-stop-daemon.c @@ -41,6 +41,8 @@ # define OSNetBSD #elif defined(__DragonFly__) # define OSDragonFlyBSD +#elif defined(__APPLE__) && defined(__MACH__) +# define OSDarwin #else # error Unknown architecture - cannot build start-stop-daemon #endif @@ -103,6 +105,10 @@ #include <ps.h> #endif +#if defined(OSDarwin) +#include <libproc.h> +#endif + #ifdef HAVE_KVM_H #include <kvm.h> #if defined(OSFreeBSD) @@ -1385,6 +1391,21 @@ pid_is_exec(pid_t pid, const struct stat *esb) return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino); } +#elif defined(OSDarwin) +static bool +pid_is_exec(pid_t pid, const struct stat *esb) +{ + struct stat sb; + char pathname[_POSIX_PATH_MAX]; + + if (proc_pidpath(pid, pathname, sizeof(pathname)) < 0) + return false; + + if (stat(pathname, &sb) != 0) + return false; + + return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino); +} #elif defined(OShpux) static bool pid_is_exec(pid_t pid, const struct stat *esb) @@ -1507,6 +1528,17 @@ pid_is_child(pid_t pid, pid_t ppid) return pi->ppid == ppid; } +#elif defined(OSDarwin) +static bool +pid_is_child(pid_t pid, pid_t ppid) +{ + struct proc_bsdinfo info; + + if (proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &info, sizeof(info)) < 0) + return false; + + return (pid_t)info.pbi_ppid == ppid; +} #elif defined(OShpux) static bool pid_is_child(pid_t pid, pid_t ppid) @@ -1594,6 +1626,17 @@ pid_is_user(pid_t pid, uid_t uid) ps = get_proc_stat(pid, PSTAT_OWNER_UID); return ps && (uid_t)proc_stat_owner_uid(ps) == uid; } +#elif defined(OSDarwin) +static bool +pid_is_user(pid_t pid, uid_t uid) +{ + struct proc_bsdinfo info; + + if (proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &info, sizeof(info)) < 0) + return false; + + return info.pbi_ruid == uid; +} #elif defined(OShpux) static bool pid_is_user(pid_t pid, uid_t uid) @@ -1716,6 +1759,17 @@ pid_is_cmd(pid_t pid, const char *name) return false; return (strcmp(pst.pst_ucomm, name) == 0); } +#elif defined(OSDarwin) +static bool +pid_is_cmd(pid_t pid, const char *name) +{ + char pathname[_POSIX_PATH_MAX]; + + if (proc_pidpath(pid, pathname, sizeof(pathname)) < 0) + return false; + + return strcmp(pathname, name) == 0; +} #elif defined(OSFreeBSD) static bool pid_is_cmd(pid_t pid, const char *name) @@ -1891,6 +1945,39 @@ do_procinit(void) else return STATUS_DEAD; } +#elif defined(OSDarwin) +static enum status_code +do_procinit(void) +{ + pid_t *pid_buf; + int i, npids, pid_bufsize; + enum status_code prog_status = STATUS_DEAD; + + npids = proc_listallpids(NULL, 0); + if (npids == 0) + return STATUS_UNKNOWN; + + /* Try to avoid sudden changes in number of PIDs. */ + npids += 4096; + pid_bufsize = sizeof(pid_t) * npids; + pid_buf = xmalloc(pid_bufsize); + + npids = proc_listallpids(pid_buf, pid_bufsize); + if (npids == 0) + return STATUS_UNKNOWN; + + for (i = 0; i < npids; i++) { + enum status_code pid_status; + + pid_status = pid_check(pid_buf[i]); + if (pid_status < prog_status) + prog_status = pid_status; + } + + free(pid_buf); + + return prog_status; +} #elif defined(OShpux) static enum status_code do_procinit(void) |