login.so: OpenBSD fixes.
authorBen Kibbey <bjk@luxsci.net>
Sat, 6 Apr 2013 17:02:32 +0000 (6 13:02 -0400)
committerBen Kibbey <bjk@luxsci.net>
Sat, 6 Apr 2013 17:02:32 +0000 (6 13:02 -0400)
src/modules/login.c

index 6909650..4a80394 100644 (file)
@@ -110,7 +110,6 @@ static char *get_pid(uid_t uid, int multi)
     static int firstrun;
     static char line[LINE_MAX];
     int cnt, i;
-    pid_t pid = 0;
     char errbuf[LINE_MAX];
     struct kinfo_proc *kp;
 
@@ -122,9 +121,8 @@ static char *get_pid(uid_t uid, int multi)
     if (!kd) {
        firstrun = 1;
 
-#ifdef __NetBSD__
-       if ((kd = kvm_openfiles(NULL, NULL, NULL,
-                               O_RDONLY, errbuf)) == NULL) {
+#if defined(__NetBSD__) || defined (__OpenBSD__)
+       if ((kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf)) == NULL) {
 #else
        if ((kd = kvm_openfiles(_PATH_DEVNULL, _PATH_DEVNULL, _PATH_DEVNULL,
                                O_RDONLY, errbuf)) == NULL) {
@@ -134,31 +132,46 @@ static char *get_pid(uid_t uid, int multi)
        }
     }
 
+#ifdef __OpenBSD__
+    if ((kp = kvm_getprocs(kd, KERN_PROC_UID, uid, sizeof(struct kinfo_proc),
+        &cnt)) == NULL) {
+       warnx("kvm_getprocs(): %s", kvm_geterr(kd));
+       return "!";
+    }
+#else
     if ((kp = kvm_getprocs(kd, KERN_PROC_UID, uid, &cnt)) == NULL) {
        warnx("kvm_getprocs(): %s", kvm_geterr(kd));
        return "!";
     }
+#endif
 
     for (i = 0; i < cnt; i++) {
        char buf[32];
+       pid_t pid = 0;
 
+#ifdef __OpenBSD__
+       if ((kp[i].p_eflag & EPROC_SLEADER) && kp[i].p_tdev != -1)
+           pid = kp[i].p_pid;
+#else
 #if __FreeBSD_version < 500000
-       if (kp[i].kp_eproc.e_flag & EPROC_SLEADER && kp[i].kp_eproc.e_tdev !=
-           -1) {
+       if (kp[i].kp_eproc.e_flag & EPROC_SLEADER && kp[i].kp_eproc.e_tdev
+           != -1) {
            pid = kp[i].kp_eproc.e_ppid;
            /*
             * pid = kp[i].kp_proc.p_pid;
             */
-
-           if (pid == 1)
-               continue;
+       }
 #else
        if (kp[i].ki_kiflag & KI_SLEADER && kp[i].ki_tdev != -1) {
            pid = kp[i].ki_pid;
-#endif
-           snprintf(buf, sizeof(buf), "%i%c", pid, multi);
-           safe_strncat(line, buf, sizeof(line));
        }
+#endif
+#endif
+       if (!pid || pid == 1)
+           continue;
+
+        snprintf(buf, sizeof(buf), "%i%c", pid, multi);
+       safe_strncat(line, buf, sizeof(line));
     }
 
     if (line[0] == '\0')