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
|
--- utils/start-stop-daemon.c.orig Mon May 14 07:01:28 2001
+++ utils/start-stop-daemon.c Fri Apr 4 21:02:53 2003
@@ -30,6 +30,8 @@
# define OSsunos
#elif defined(OPENBSD)
# define OSOpenBSD
+#elif defined(__FreeBSD__)
+# define OSFreeBSD
#else
# error Unknown architecture - cannot build start-stop-daemon
#endif
@@ -41,7 +43,8 @@
# include <ps.h>
#endif
-#if defined(OSOpenBSD)
+#if defined(OSOpenBSD) || defined(OSFreeBSD)
+#define _WANT_UCRED
#include <sys/param.h>
#include <sys/user.h>
#include <sys/proc.h>
@@ -744,7 +747,7 @@
#endif /* OSHURD */
-#if defined(OSOpenBSD)
+#if defined(OSOpenBSD) || defined(OSFreeBSD)
int
pid_is_cmd(pid_t pid, const char *name)
{
@@ -787,7 +790,7 @@
}
int
-pid_is_user(pid_t pid, int uid)
+pid_is_user(pid_t pid, uid_t uid)
{
kvm_t *kd;
int nentries; /* Value not used */
@@ -801,9 +804,15 @@
errx(1, "%s", errbuf);
if ((kp = kvm_getprocs(kd, KERN_PROC_PID, pid, &nentries)) == 0)
errx(1, "%s", kvm_geterr(kd));
+#if defined(OSOpenBSD) || (defined(OSFreeBSD) && __FreeBSD_version < 500014)
if ( kp->kp_proc.p_cred )
kvm_read(kd, (u_long)&(kp->kp_proc.p_cred->p_ruid),
&proc_uid, sizeof(uid_t));
+#elif defined(OSFreeBSD)
+ if ( kp->ki_paddr->p_ucred )
+ kvm_read(kd, (u_long)&(kp->ki_paddr->p_ucred->cr_ruid),
+ &proc_uid, sizeof(uid_t));
+#endif
else
return 0;
return (proc_uid == (uid_t)uid);
@@ -822,7 +831,11 @@
errx(1, "%s", errbuf);
if ((kp = kvm_getprocs(kd, KERN_PROC_PID, pid, &nentries)) == 0)
errx(1, "%s", kvm_geterr(kd));
+#if defined(OSOpenBSD) || (defined(OSFreeBSD) && __FreeBSD_version < 500014)
pidexec = (&kp->kp_proc)->p_comm;
+#elif defined(OSFreeBSD)
+ pidexec = kp->ki_paddr->p_comm;
+#endif
if (strlen(name) != strlen(pidexec))
return 0;
return (strcmp(name, pidexec) == 0) ? 1 : 0;
@@ -835,7 +848,7 @@
/* Nothing to do */
}
-#endif /* OSOpenBSD */
+#endif /* OSOpenBSD || OSFreeBSD */
static void
|