Kaynağa Gözat

s-s-d: Switch kFreeBSD to use sysctl(3)

Avoid libkvm-dev to make sure we always use the low-level sysctl(3)
interface.
Guillem Jover 11 yıl önce
ebeveyn
işleme
a8dece2602
3 değiştirilmiş dosya ile 104 ekleme ve 1 silme
  1. 2 0
      debian/changelog
  2. 0 1
      debian/control
  3. 102 0
      utils/start-stop-daemon.c

+ 2 - 0
debian/changelog

@@ -48,6 +48,8 @@ dpkg (1.18.5) UNRELEASED; urgency=medium
       code, to make life easier for non-dpkg-based systems.
     - Move alternatives temporary extension out from update-alternatives code,
       to make life easier for non-dpkg-based systems.
+    - Switch start-stop-daemon on */kFreeBSD to use the low-level sysctl(3)
+      interface instead of libkvm-dev.
   * Perl modules:
     - Add new CTRL_REPO_RELEASE control block type to Dpkg::Control.
     - Add new CTRL_COPYRIGHT_HEADER, CTRL_COPYRIGHT_FILES and

+ 0 - 1
debian/control

@@ -14,7 +14,6 @@ Build-Depends: dpkg-dev (>= 1.17.14), debhelper (>= 9.20141010),
  gettext (>= 0.19), po4a (>= 0.41),
  zlib1g-dev, libbz2-dev, liblzma-dev,
  libselinux1-dev (>= 1.28-4) [linux-any],
- libkvm-dev [kfreebsd-any],
  libncursesw5-dev,
  libio-string-perl <!nocheck>
 

+ 102 - 0
utils/start-stop-daemon.c

@@ -1518,6 +1518,27 @@ pid_is_child(pid_t pid, pid_t ppid)
 
 	return pst.pst_ppid == ppid;
 }
+#elif defined(OSFreeBSD)
+static bool
+pid_is_child(pid_t pid, pid_t ppid)
+{
+	struct kinfo_proc kp;
+	int rc, name[4];
+	size_t len = 0;
+
+	name[0] = CTL_KERN;
+	name[1] = KERN_PROC;
+	name[2] = KERN_PROC_PID;
+	name[3] = pid;
+
+	rc = sysctl(name, 4, &kp, &len, NULL, 0);
+	if (rc != 0 && errno != ESRCH)
+		return false;
+	if (len == 0 || len != sizeof(kp))
+		return false;
+
+	return kp.ki_ppid == ppid;
+}
 #elif defined(HAVE_KVM_H)
 static bool
 pid_is_child(pid_t pid, pid_t ppid)
@@ -1582,6 +1603,27 @@ pid_is_user(pid_t pid, uid_t uid)
 		return false;
 	return ((uid_t)pst.pst_uid == uid);
 }
+#elif defined(OSFreeBSD)
+static bool
+pid_is_user(pid_t pid, uid_t uid)
+{
+	struct kinfo_proc kp;
+	int rc, name[4];
+	size_t len = 0;
+
+	name[0] = CTL_KERN;
+	name[1] = KERN_PROC;
+	name[2] = KERN_PROC_PID;
+	name[3] = pid;
+
+	rc = sysctl(name, 4, &kp, &len, NULL, 0);
+	if (rc != 0 && errno != ESRCH)
+		return false;
+	if (len == 0 || len != sizeof(kp))
+		return false;
+
+	return kp.ki_ruid == uid;
+}
 #elif defined(HAVE_KVM_H)
 static bool
 pid_is_user(pid_t pid, uid_t uid)
@@ -1672,6 +1714,27 @@ pid_is_cmd(pid_t pid, const char *name)
 		return false;
 	return (strcmp(pst.pst_ucomm, name) == 0);
 }
+#elif defined(OSFreeBSD)
+static bool
+pid_is_cmd(pid_t pid, const char *name)
+{
+	struct kinfo_proc kp;
+	int rc, name[4];
+	size_t len = 0;
+
+	name[0] = CTL_KERN;
+	name[1] = KERN_PROC;
+	name[2] = KERN_PROC_PID;
+	name[3] = pid;
+
+	rc = sysctl(name, 4, &kp, &len, NULL, 0);
+	if (rc != 0 && errno != ESRCH)
+		return false;
+	if (len == 0 || len != sizeof(kp))
+		return false;
+
+	return strcmp(kp.ki_comm, name) == 0;
+}
 #elif defined(HAVE_KVM_H)
 static bool
 pid_is_cmd(pid_t pid, const char *name)
@@ -1847,6 +1910,45 @@ do_procinit(void)
 
 	return prog_status;
 }
+#elif defined(OSFreeBSD)
+static enum status_code
+do_procinit(void)
+{
+	struct kinfo_proc *kp;
+	int rc, name[3];
+	size_t len = 0;
+	int nentries, i;
+	enum status_code prog_status = STATUS_DEAD;
+
+	name[0] = CTL_KERN;
+	name[1] = KERN_PROC;
+	name[2] = KERN_PROC_PROC;
+
+	rc = sysctl(name, 3, NULL, &len, NULL, 0);
+	if (rc != 0 && errno != ESRCH)
+		return false;
+	if (len == 0)
+		return false;
+
+	kp = xmalloc(len);
+	rc = sysctl(name, 3, kp, &len, NULL, 0);
+	if (rc != 0 && errno != ESRCH)
+		return false;
+	if (len == 0)
+		return false;
+
+	for (i = 0; i < nentries; i++) {
+		enum status_code pid_status;
+
+		pid_status = pid_check(kp[i].ki_pid);
+		if (pid_status < prog_status)
+			prog_status = pid_status;
+	}
+
+	free(kp);
+
+	return prog_status;
+}
 #elif defined(HAVE_KVM_H)
 static enum status_code
 do_procinit(void)