summaryrefslogtreecommitdiff
blob: ebc162345a52c91ee3d7dd30cff21b3f33fa6be8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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)