Parcourir la source

s-s-d: Port process handling to AIX

Guillem Jover il y a 10 ans
Parent
commit
e12ad320d4
3 fichiers modifiés avec 76 ajouts et 3 suppressions
  1. 1 0
      configure.ac
  2. 1 0
      debian/changelog
  3. 74 3
      utils/start-stop-daemon.c

+ 1 - 0
configure.ac

@@ -103,6 +103,7 @@ AC_CHECK_HEADERS([\
   sys/syscall.h \
   sys/user.h \
   sys/proc.h \
+  sys/procfs.h \
   sys/pstat.h \
   linux/fiemap.h \
 ])

+ 1 - 0
debian/changelog

@@ -42,6 +42,7 @@ dpkg (1.18.11) UNRELEASED; urgency=medium
       do_procinit().
     - Port start-stop-daemon process handling to Mac OS X.
       Based on a patch by Mo McRoberts <mo@nevali.net>.
+    - Port start-stop-daemon process handling to AIX.
   * Perl modules:
     - Obsolete Source-Version substvar in Dpkg::Substvars by emitting errors.
     - Rework keyring hooks in Dpkg::Vendor. Deprecate the keyrings hook, and

+ 74 - 3
utils/start-stop-daemon.c

@@ -41,6 +41,8 @@
 #  define OS_Darwin
 #elif defined(__sun)
 #  define OS_Solaris
+#elif defined(_AIX)
+#  define OS_AIX
 #elif defined(__hpux)
 #  define OS_HPUX
 #else
@@ -56,6 +58,9 @@
 #ifdef HAVE_SYS_SYSCTL_H
 #include <sys/sysctl.h>
 #endif
+#ifdef HAVE_SYS_PROCFS_H
+#include <sys/procfs.h>
+#endif
 #ifdef HAVE_SYS_PROC_H
 #include <sys/proc.h>
 #endif
@@ -133,6 +138,9 @@
 #define PROCESS_NAME_SIZE 15
 #elif defined(OS_Darwin)
 #define PROCESS_NAME_SIZE 16
+#elif defined(OS_AIX)
+/* This comes from PRFNSZ defined in AIX's <sys/procfs.h>. */
+#define PROCESS_NAME_SIZE 16
 #elif defined(OS_NetBSD)
 #define PROCESS_NAME_SIZE 16
 #elif defined(OS_OpenBSD)
@@ -1267,9 +1275,25 @@ proc_status_field(pid_t pid, const char *field)
 
 	return value;
 }
-#endif
+#elif defined(OS_AIX)
+static bool
+proc_get_psinfo(pid_t pid, struct psinfo *psinfo)
+{
+	char filename[64];
+	FILE *fp;
 
-#if defined(OS_Hurd)
+	sprintf(filename, "/proc/%d/psinfo", pid);
+	fp = fopen(filename, "r");
+	if (!fp)
+		return false;
+	if (fread(psinfo, sizeof(*psinfo), 1, fp) == 0)
+		return false;
+	if (ferror(fp))
+		return false;
+
+	return true;
+}
+#elif defined(OS_Hurd)
 static void
 init_procset(void)
 {
@@ -1372,6 +1396,20 @@ 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(OS_AIX)
+static bool
+pid_is_exec(pid_t pid, const struct stat *esb)
+{
+	struct stat sb;
+	char filename[64];
+
+	sprintf(filename, "/proc/%d/object/a.out", pid);
+
+	if (stat(filename, &sb) != 0)
+		return false;
+
+	return sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino;
+}
 #elif defined(OS_Hurd)
 static bool
 pid_is_exec(pid_t pid, const struct stat *esb)
@@ -1539,6 +1577,17 @@ pid_is_child(pid_t pid, pid_t ppid)
 
 	return (pid_t)info.pbi_ppid == ppid;
 }
+#elif defined(OS_AIX)
+static bool
+pid_is_child(pid_t pid, pid_t ppid)
+{
+	struct psinfo psi;
+
+	if (!proc_get_psinfo(pid, &psi))
+		return false;
+
+	return (pid_t)psi.pr_ppid == ppid;
+}
 #elif defined(OS_HPUX)
 static bool
 pid_is_child(pid_t pid, pid_t ppid)
@@ -1637,6 +1686,17 @@ pid_is_user(pid_t pid, uid_t uid)
 
 	return info.pbi_ruid == uid;
 }
+#elif defined(OS_AIX)
+static bool
+pid_is_user(pid_t pid, uid_t uid)
+{
+	struct psinfo psi;
+
+	if (!proc_get_psinfo(pid, &psi))
+		return false;
+
+	return psi.pr_uid == uid;
+}
 #elif defined(OS_HPUX)
 static bool
 pid_is_user(pid_t pid, uid_t uid)
@@ -1749,6 +1809,17 @@ pid_is_cmd(pid_t pid, const char *name)
 
 	return false;
 }
+#elif defined(OS_AIX)
+static bool
+pid_is_cmd(pid_t pid, const char *name)
+{
+	struct psinfo psi;
+
+	if (!proc_get_psinfo(pid, &psi))
+		return false;
+
+	return strcmp(psi.pr_fname, name) == 0;
+}
 #elif defined(OS_HPUX)
 static bool
 pid_is_cmd(pid_t pid, const char *name)
@@ -1892,7 +1963,7 @@ do_pidfile(const char *name)
 		fatal("unable to open pidfile %s", name);
 }
 
-#if defined(OS_Linux) || defined(OS_Solaris)
+#if defined(OS_Linux) || defined(OS_Solaris) || defined(OS_AIX)
 static enum status_code
 do_procinit(void)
 {