summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-apps/baselayout-prefix/files/baselayout-1.12.5-aix.patch')
-rw-r--r--sys-apps/baselayout-prefix/files/baselayout-1.12.5-aix.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/sys-apps/baselayout-prefix/files/baselayout-1.12.5-aix.patch b/sys-apps/baselayout-prefix/files/baselayout-1.12.5-aix.patch
new file mode 100644
index 000000000000..ebc162345a52
--- /dev/null
+++ b/sys-apps/baselayout-prefix/files/baselayout-1.12.5-aix.patch
@@ -0,0 +1,110 @@
+W00T, AIX does have /proc filesystem - even with slightly different layout.
+
+--- src/start-stop-daemon.c
++++ src/start-stop-daemon.c
+@@ -56,6 +56,8 @@
+ # define OSNetBSD
+ #elif defined(__APPLE__)
+ # define OSDarwin
++#elif defined(_AIX)
++# define OSaix
+ #else
+ # error Unknown architecture - cannot build start-stop-daemon
+ #endif
+@@ -85,6 +87,10 @@
+ #include <sys/pstat.h>
+ #endif
+
++#if defined(OSaix)
++#include <sys/procfs.h>
++#endif
++
+ #include <errno.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+@@ -178,7 +184,7 @@
+ static void do_pidfile(const char *name);
+ static void do_stop(int signal_nr, int quietmode,
+ int *n_killed, int *n_notkilled, int retry_nr);
+-#if defined(OSLinux) || defined(OShpux)
++#if defined(OSLinux) || defined(OShpux) || defined(OSaix)
+ static int pid_is_exec(pid_t pid, const struct stat *esb);
+ #endif
+
+@@ -755,7 +761,7 @@
+ static void
+ check(pid_t pid)
+ {
+-#if defined(OSLinux) || defined(OShpux)
++#if defined(OSLinux) || defined(OShpux) || defined(OSaix)
+ if (execname && !pid_is_exec(pid, &exec_stat))
+ return;
+ #elif defined(OSHURD) || defined(OSFreeBSD) || defined(OSNetBSD) || defined(OSDarwin)
+@@ -791,7 +797,7 @@
+ /* WTA: this needs to be an autoconf check for /proc/pid existance.
+ */
+
+-#if defined(OSLinux) || defined (OSsunos) || defined(OSfreebsd)
++#if defined(OSLinux) || defined (OSsunos) || defined(OSfreebsd) || defined(OSaix)
+ static void
+ do_procinit(void)
+ {
+@@ -1059,6 +1065,58 @@
+ }
+ #endif /* OShpux */
+
++#if defined(OSaix)
++/* max possible pid (signed long) in theory:
++ * 32bit: 2147483647 (10 digits)
++ * 64bit: 9223372036854775807 (19 digits)
++ */
++static int
++pid_is_exec(pid_t pid, const struct stat *esb)
++{
++ struct stat sb;
++ char buf[40];
++
++ sprintf(buf, "/proc/%ld/object/a.out", pid);
++ if (stat(buf, &sb) != 0)
++ return 0;
++ return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino);
++}
++
++
++static int
++pid_is_user(pid_t pid, uid_t uid)
++{
++ struct stat sb;
++ char buf[32];
++
++ sprintf(buf, "/proc/%ld", pid);
++ if (stat(buf, &sb) != 0)
++ return 0;
++ return (sb.st_uid == uid);
++}
++
++
++static int
++pid_is_cmd(pid_t pid, const char *name)
++{
++ char buf[40];
++ FILE *f;
++ struct psinfo psi;
++ int r;
++
++ sprintf(buf, "/proc/%ld/psinfo", pid);
++ f = fopen(buf, "r");
++ if (!f)
++ return 0;
++ r = fread(&psi, sizeof(psi), 1, f);
++ fclose(f);
++ if (r != 1) {
++ return 0;
++ }
++ return strcmp(name, psi.pr_fname) == 0;
++}
++#endif /* OSaix */
++
+
+ static void
+ do_findprocs(void)