10daf62d9SStanislav Sedov /*- 20daf62d9SStanislav Sedov * Copyright (c) 2007 Robert N. M. Watson 30daf62d9SStanislav Sedov * Copyright (c) 2009 Ulf Lilleengen 40daf62d9SStanislav Sedov * All rights reserved. 50daf62d9SStanislav Sedov * 60daf62d9SStanislav Sedov * Redistribution and use in source and binary forms, with or without 70daf62d9SStanislav Sedov * modification, are permitted provided that the following conditions 80daf62d9SStanislav Sedov * are met: 90daf62d9SStanislav Sedov * 1. Redistributions of source code must retain the above copyright 100daf62d9SStanislav Sedov * notice, this list of conditions and the following disclaimer. 110daf62d9SStanislav Sedov * 2. Redistributions in binary form must reproduce the above copyright 120daf62d9SStanislav Sedov * notice, this list of conditions and the following disclaimer in the 130daf62d9SStanislav Sedov * documentation and/or other materials provided with the distribution. 140daf62d9SStanislav Sedov * 150daf62d9SStanislav Sedov * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 160daf62d9SStanislav Sedov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 170daf62d9SStanislav Sedov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 180daf62d9SStanislav Sedov * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 190daf62d9SStanislav Sedov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 200daf62d9SStanislav Sedov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 210daf62d9SStanislav Sedov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 220daf62d9SStanislav Sedov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 230daf62d9SStanislav Sedov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 240daf62d9SStanislav Sedov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 250daf62d9SStanislav Sedov * SUCH DAMAGE. 260daf62d9SStanislav Sedov * 270daf62d9SStanislav Sedov * $FreeBSD$ 280daf62d9SStanislav Sedov */ 290daf62d9SStanislav Sedov 300daf62d9SStanislav Sedov #include <sys/cdefs.h> 310daf62d9SStanislav Sedov __FBSDID("$FreeBSD$"); 320daf62d9SStanislav Sedov 330daf62d9SStanislav Sedov #include <sys/param.h> 340daf62d9SStanislav Sedov #include <sys/sysctl.h> 35*7adf46f0SEnji Cooper #include <sys/user.h> 360daf62d9SStanislav Sedov #include <stdlib.h> 370daf62d9SStanislav Sedov #include <string.h> 380daf62d9SStanislav Sedov 390daf62d9SStanislav Sedov #include "libutil.h" 400daf62d9SStanislav Sedov 410daf62d9SStanislav Sedov 420daf62d9SStanislav Sedov /* 430daf62d9SStanislav Sedov * Sort processes first by pid and then tid. 440daf62d9SStanislav Sedov */ 450daf62d9SStanislav Sedov static int 460daf62d9SStanislav Sedov kinfo_proc_compare(const void *a, const void *b) 470daf62d9SStanislav Sedov { 480daf62d9SStanislav Sedov int i; 490daf62d9SStanislav Sedov 500daf62d9SStanislav Sedov i = ((const struct kinfo_proc *)a)->ki_pid - 510daf62d9SStanislav Sedov ((const struct kinfo_proc *)b)->ki_pid; 520daf62d9SStanislav Sedov if (i != 0) 530daf62d9SStanislav Sedov return (i); 540daf62d9SStanislav Sedov i = ((const struct kinfo_proc *)a)->ki_tid - 550daf62d9SStanislav Sedov ((const struct kinfo_proc *)b)->ki_tid; 560daf62d9SStanislav Sedov return (i); 570daf62d9SStanislav Sedov } 580daf62d9SStanislav Sedov 590daf62d9SStanislav Sedov static void 600daf62d9SStanislav Sedov kinfo_proc_sort(struct kinfo_proc *kipp, int count) 610daf62d9SStanislav Sedov { 620daf62d9SStanislav Sedov 630daf62d9SStanislav Sedov qsort(kipp, count, sizeof(*kipp), kinfo_proc_compare); 640daf62d9SStanislav Sedov } 650daf62d9SStanislav Sedov 660daf62d9SStanislav Sedov struct kinfo_proc * 670daf62d9SStanislav Sedov kinfo_getallproc(int *cntp) 680daf62d9SStanislav Sedov { 690daf62d9SStanislav Sedov struct kinfo_proc *kipp; 700daf62d9SStanislav Sedov size_t len; 710daf62d9SStanislav Sedov int mib[3]; 720daf62d9SStanislav Sedov 730daf62d9SStanislav Sedov mib[0] = CTL_KERN; 740daf62d9SStanislav Sedov mib[1] = KERN_PROC; 750daf62d9SStanislav Sedov mib[2] = KERN_PROC_PROC; 760daf62d9SStanislav Sedov 770daf62d9SStanislav Sedov len = 0; 78*7adf46f0SEnji Cooper if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) < 0) 790daf62d9SStanislav Sedov return (NULL); 800daf62d9SStanislav Sedov 810daf62d9SStanislav Sedov kipp = malloc(len); 820daf62d9SStanislav Sedov if (kipp == NULL) 830daf62d9SStanislav Sedov return (NULL); 840daf62d9SStanislav Sedov 85*7adf46f0SEnji Cooper if (sysctl(mib, nitems(mib), kipp, &len, NULL, 0) < 0) 860daf62d9SStanislav Sedov goto bad; 870daf62d9SStanislav Sedov if (len % sizeof(*kipp) != 0) 880daf62d9SStanislav Sedov goto bad; 890daf62d9SStanislav Sedov if (kipp->ki_structsize != sizeof(*kipp)) 900daf62d9SStanislav Sedov goto bad; 910daf62d9SStanislav Sedov *cntp = len / sizeof(*kipp); 920daf62d9SStanislav Sedov kinfo_proc_sort(kipp, len / sizeof(*kipp)); 930daf62d9SStanislav Sedov return (kipp); 940daf62d9SStanislav Sedov bad: 950daf62d9SStanislav Sedov *cntp = 0; 960daf62d9SStanislav Sedov free(kipp); 970daf62d9SStanislav Sedov return (NULL); 980daf62d9SStanislav Sedov } 99