$NetBSD: patch-ad,v 1.2 2012/08/08 18:37:07 marino Exp $

Fix LP64 support on FreeBSD/DragonFly (size_t instead of int)
Add DragonFly support -- kinfo structure is unique on DragonFly

--- procinfo.c.orig	2000-06-06 18:36:47.000000000 +0000
+++ procinfo.c
@@ -65,7 +65,7 @@ void get_info(int pid, struct procinfo *
 int fill_kinfo(struct kinfo_proc *info, int pid)
 {
 	int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid };
-	int len = sizeof *info;
+	size_t len = sizeof *info;
 	if(sysctl(mib, 4, info, &len, 0, 0) == -1) 
 		return -1;
 	return len?0:-1;
@@ -83,12 +83,21 @@ void get_info(int pid, struct procinfo *
 	
 	if(fill_kinfo(&info, pid) == -1) return;
 	
+#ifdef __DragonFly__
+    	p->ppid = info.kp_ppid;
+    	p->tpgid = info.kp_tpgid;
+    	p->euid = info.kp_svuid;
+    	p->stat = info.kp_stat;
+    	strncpy(p->exec_file, info.kp_comm, EXEC_FILE);
+    	p->cterm = info.kp_tdev;
+#else
     	p->ppid = info.kp_eproc.e_ppid;
     	p->tpgid = info.kp_eproc.e_tpgid;
     	p->euid = info.kp_eproc.e_pcred.p_svuid;
     	p->stat = info.kp_proc.p_stat;
     	strncpy(p->exec_file, info.kp_proc.p_comm, EXEC_FILE);
     	p->cterm = info.kp_eproc.e_tdev;
+#endif
 	p->exec_file[EXEC_FILE] = '\0';
 }
 #endif
@@ -124,7 +133,8 @@ int get_term(char *tty)
 int get_login_pid(char *tty)
 {
 	int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_TTY, 0};
-	int len, t, el, i, pid, cndt = -1, l;
+	size_t len;
+	int t, el, i, pid, cndt = -1, l;
 	struct kinfo_proc *info;
 	struct procinfo p;
 	
@@ -142,6 +152,17 @@ int get_login_pid(char *tty)
 	if(sysctl(mib, 4, info, &len, 0, 0) == -1)
 		return -1;
 	for(i = 0; i < el; i++) {
+#ifdef __DragonFly__
+		if(!(pid = info[i].kp_pid)) continue;
+		get_info(get_ppid(pid), &p);
+		if(p.cterm == -1 || p.cterm != t) {
+			cndt = pid;
+			l = strlen(info[i].kp_comm);
+			if(l > 1 && !strncmp("sh",info[i].kp_comm+l-2,2)) {
+				free(info);
+				return pid;
+			}
+#else
 		if(!(pid = info[i].kp_proc.p_pid)) continue;
 		get_info(get_ppid(pid), &p);
 		if(p.cterm == -1 || p.cterm != t) {
@@ -157,6 +178,7 @@ int get_login_pid(char *tty)
 				free(info);
 				return pid;
 			}
+#endif
 		}
 	}
 	free(info);
@@ -169,7 +191,8 @@ int get_login_pid(char *tty)
 int get_all_info(struct kinfo_proc **info)
 {
 	int mib[3] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL };
-	int len, el;
+	size_t len;
+	int el;
 
 	if(sysctl(mib, 3, 0, &len, 0, 0) == -1)
 		return 0;
@@ -239,7 +262,11 @@ char *get_cmdline(int pid)
 	bzero(buf, sizeof buf);
 	if(fill_kinfo(&info, pid) == -1)
 		return "-";
+#ifdef __DragonFly__
+	memcpy(buf, info.kp_comm, sizeof buf - 1);
+#else
 	memcpy(buf, info.kp_proc.p_comm, sizeof buf - 1);
+#endif
 	if(!full_cmd) return buf;
 #ifdef HAVE_LIBKVM
 	if(!can_use_kvm) return buf;
