$OpenBSD: patch-procinfo_c,v 1.3 2011/07/06 13:15:40 jasper Exp $ --- procinfo.c.orig Tue Jun 6 20:36:47 2000 +++ procinfo.c Wed Jul 6 15:14:42 2011 @@ -64,9 +64,9 @@ void get_info(int pid, struct procinfo *p) #else int fill_kinfo(struct kinfo_proc *info, int pid) { - int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid }; - int len = sizeof *info; - if(sysctl(mib, 4, info, &len, 0, 0) == -1) + int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid, sizeof (struct kinfo_proc), 1 }; + size_t len = sizeof *info; + if(sysctl(mib, 6, info, &len, 0, 0) == -1) return -1; return len?0:-1; } @@ -83,12 +83,12 @@ void get_info(int pid, struct procinfo *p) if(fill_kinfo(&info, pid) == -1) return; - 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; + p->ppid = info.p_ppid; + p->tpgid = info.p_tpgid; + p->euid = info.p_uid; + p->stat = info.p_stat; + strncpy(p->exec_file, info.p_comm, EXEC_FILE); + p->cterm = info.p_tdev; p->exec_file[EXEC_FILE] = '\0'; } #endif @@ -123,8 +123,9 @@ 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; + int mib[6] = {CTL_KERN, KERN_PROC, KERN_PROC_TTY, 0, sizeof(struct kinfo_proc), 0}; + int t, el, i, pid, cndt = -1, l; + size_t len; struct kinfo_proc *info; struct procinfo p; @@ -134,26 +135,27 @@ int get_login_pid(char *tty) if((t = get_term(tty)) == -1) return -1; mib[3] = t; - if(sysctl(mib, 4, 0, &len, 0, 0) == -1) + if(sysctl(mib, 6, NULL, &len, NULL, 0) == -1) return -1; info = calloc(1, len); if(!info) return -1; el = len/sizeof(struct kinfo_proc); - if(sysctl(mib, 4, info, &len, 0, 0) == -1) + mib[5] = el; + if(sysctl(mib, 6, info, &len, NULL, 0) == -1) return -1; for(i = 0; i < el; i++) { - if(!(pid = info[i].kp_proc.p_pid)) continue; + if(!(pid = info[i].p_pid)) continue; get_info(get_ppid(pid), &p); if(p.cterm == -1 || p.cterm != t) { cndt = pid; - l = strlen(info[i].kp_proc.p_comm); + l = strlen(info[i].p_comm); /* * This is our best match: parent of the process * doesn't have controlling terminal and process' * name ends with "sh" * */ - if(l > 1 && !strncmp("sh",info[i].kp_proc.p_comm+l-2,2)) { + if(l > 1 && !strncmp("sh",info[i].p_comm+l-2,2)) { free(info); return pid; } @@ -168,15 +170,16 @@ 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; + int mib[6] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc), 0 }; + int el; + size_t len; - if(sysctl(mib, 3, 0, &len, 0, 0) == -1) + if(sysctl(mib, 6, NULL, &len, 0, 0) == -1) return 0; *info = calloc(1, len); if(!*info) return 0; - el = len/sizeof(struct kinfo_proc); - if(sysctl(mib, 3, *info, &len, 0, 0) == -1) + mib[5] = el = len/sizeof(struct kinfo_proc); + if(sysctl(mib, 6, *info, &len, 0, 0) == -1) return 0; return el; } @@ -239,7 +242,7 @@ char *get_cmdline(int pid) bzero(buf, sizeof buf); if(fill_kinfo(&info, pid) == -1) return "-"; - memcpy(buf, info.kp_proc.p_comm, sizeof buf - 1); + memcpy(buf, info.p_comm, sizeof buf - 1); if(!full_cmd) return buf; #ifdef HAVE_LIBKVM if(!can_use_kvm) return buf;