138589Sabial/*- 238589Sabial * Copyright (c) 1998 Andrzej Bialecki 338589Sabial * All rights reserved. 438589Sabial * 538589Sabial * Redistribution and use in source and binary forms, with or without 638589Sabial * modification, are permitted provided that the following conditions 738589Sabial * are met: 838589Sabial * 1. Redistributions of source code must retain the above copyright 938589Sabial * notice, this list of conditions and the following disclaimer. 1038589Sabial * 2. Redistributions in binary form must reproduce the above copyright 1138589Sabial * notice, this list of conditions and the following disclaimer in the 1238589Sabial * documentation and/or other materials provided with the distribution. 1338589Sabial * 1438589Sabial * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1538589Sabial * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1638589Sabial * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1738589Sabial * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1838589Sabial * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1938589Sabial * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2038589Sabial * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2138589Sabial * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2238589Sabial * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2338589Sabial * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2438589Sabial * SUCH DAMAGE. 2538589Sabial * 2650479Speter * $FreeBSD$ 2738589Sabial */ 2838589Sabial 2938589Sabial/* 3038589Sabial * Small replacement for ps(1) - uses only sysctl(3) to retrieve info 3138589Sabial */ 3238589Sabial 3338589Sabial#include <stdio.h> 3438589Sabial#include <stdlib.h> 3538589Sabial#include <string.h> 3638589Sabial#include <sys/param.h> 3738589Sabial#include <sys/sysctl.h> 3838589Sabial#include <sys/stat.h> 3938589Sabial#include <sys/user.h> 4038589Sabial 4170907Sabialchar p_stat[] = "?iRSTZWM"; 4238589Sabial 4338589Sabialint 4438589Sabialmain(int argc, char *argv[]) 4538589Sabial{ 4670907Sabial int mib[4], i, num, len, j, plen; 4770907Sabial char buf[MAXPATHLEN], vty[5], pst[5], wmesg[10]; 4870906Sabial struct kinfo_proc *ki; 4968609Sabial char *t; 5070907Sabial int ma, mi; 5138589Sabial 5270907Sabial mib[0] = CTL_KERN; 5370907Sabial mib[1] = KERN_PROC; 5470907Sabial mib[2] = KERN_PROC_ALL; 5570907Sabial if (sysctl(mib, 3, NULL, &len, NULL, 0) != 0) { 5638589Sabial perror("sysctl sizing"); 5738589Sabial exit(1); 5838589Sabial } 5970907Sabial t = (char *)malloc(len); 6070907Sabial if (sysctl(mib, 3, t, &len, NULL, 0) != 0) { 6138589Sabial perror("sysctl info"); 6238589Sabial exit(1); 6338589Sabial } 6470907Sabial mib[2] = KERN_PROC_ARGS; 6570906Sabial num = len / KINFO_PROC_SIZE; 6670907Sabial i = 0; 6768609Sabial printf("USERNAME PID PPID PRI NICE TTY STAT WCHAN COMMAND\n"); 6868609Sabial while(i < num) { 6970906Sabial ki = (struct kinfo_proc *)(t + (num - i - 1) * KINFO_PROC_SIZE); 7070906Sabial mib[3] = ki->ki_pid; 7168609Sabial plen = MAXPATHLEN; 7270907Sabial if (sysctl(mib, 4, buf, &plen, NULL, 0) != 0) { 7370907Sabial perror("sysctl cmd info"); 7468609Sabial exit(1); 7568609Sabial } 7670907Sabial if (plen == 0) { 7770906Sabial sprintf(buf, "(%s)", ki->ki_comm); 7868609Sabial } else { 7970907Sabial for (j = 0; j < plen - 1; j++) { 8070907Sabial if (buf[j] == '\0') buf[j] = ' '; 8168609Sabial } 8268609Sabial } 8370907Sabial if (strcmp(ki->ki_wmesg, "") == 0) { 8468609Sabial sprintf(wmesg, "-"); 8568609Sabial } else { 8670906Sabial strcpy(wmesg, ki->ki_wmesg); 8768609Sabial } 8870907Sabial ma = major(ki->ki_tdev); 8970907Sabial mi = minor(ki->ki_tdev); 9038589Sabial switch(ma) { 9138589Sabial case 255: 9270907Sabial strcpy(vty, "??"); 9338589Sabial break; 9438589Sabial case 12: 9570907Sabial if(mi != 255) { 9670907Sabial sprintf(vty, "v%d", mi); 9738589Sabial break; 9838589Sabial } 9938589Sabial /* FALLTHROUGH */ 10038589Sabial case 0: 10170907Sabial strcpy(vty, "con"); 10238589Sabial break; 10338589Sabial case 5: 10470907Sabial sprintf(vty, "p%d", mi); 10538589Sabial break; 10638589Sabial } 10770907Sabial sprintf(pst, "%c", p_stat[ki->ki_stat]); 10868609Sabial printf("%8s %5u %5u %3d %4d %3s %-4s %-7s %s\n", 10970906Sabial ki->ki_login, 11070906Sabial ki->ki_pid, 11170906Sabial ki->ki_ppid, 11292071Sluigi ki->ki_pri.pri_level, /* XXX check this */ 11370906Sabial ki->ki_nice, 11438589Sabial vty, 11538589Sabial pst, 11668609Sabial wmesg, 11768609Sabial buf); 11838589Sabial i++; 11938589Sabial } 12068609Sabial free((void *)t); 12138589Sabial exit(0); 12238589Sabial} 123