1598585e8SMikolaj Golub /*- 2598585e8SMikolaj Golub * Copyright (c) 2011 Mikolaj Golub 3598585e8SMikolaj Golub * All rights reserved. 4598585e8SMikolaj Golub * 5598585e8SMikolaj Golub * Redistribution and use in source and binary forms, with or without 6598585e8SMikolaj Golub * modification, are permitted provided that the following conditions 7598585e8SMikolaj Golub * are met: 8598585e8SMikolaj Golub * 1. Redistributions of source code must retain the above copyright 9598585e8SMikolaj Golub * notice, this list of conditions and the following disclaimer. 10598585e8SMikolaj Golub * 2. Redistributions in binary form must reproduce the above copyright 11598585e8SMikolaj Golub * notice, this list of conditions and the following disclaimer in the 12598585e8SMikolaj Golub * documentation and/or other materials provided with the distribution. 13598585e8SMikolaj Golub * 14598585e8SMikolaj Golub * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15598585e8SMikolaj Golub * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16598585e8SMikolaj Golub * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17598585e8SMikolaj Golub * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18598585e8SMikolaj Golub * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19598585e8SMikolaj Golub * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20598585e8SMikolaj Golub * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21598585e8SMikolaj Golub * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22598585e8SMikolaj Golub * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23598585e8SMikolaj Golub * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24598585e8SMikolaj Golub * SUCH DAMAGE. 25598585e8SMikolaj Golub * 26598585e8SMikolaj Golub * $FreeBSD$ 27598585e8SMikolaj Golub */ 28598585e8SMikolaj Golub 29598585e8SMikolaj Golub #include <sys/param.h> 30598585e8SMikolaj Golub #include <sys/time.h> 31598585e8SMikolaj Golub #include <sys/resourcevar.h> 32598585e8SMikolaj Golub #include <sys/sysctl.h> 33598585e8SMikolaj Golub #include <sys/user.h> 34598585e8SMikolaj Golub 35598585e8SMikolaj Golub #include <err.h> 36598585e8SMikolaj Golub #include <errno.h> 37598585e8SMikolaj Golub #include <libprocstat.h> 38*de21500dSMikolaj Golub #include <libutil.h> 39598585e8SMikolaj Golub #include <limits.h> 40598585e8SMikolaj Golub #include <stdio.h> 41598585e8SMikolaj Golub #include <stdlib.h> 42598585e8SMikolaj Golub #include <string.h> 43598585e8SMikolaj Golub 44598585e8SMikolaj Golub #include "procstat.h" 45598585e8SMikolaj Golub 46*de21500dSMikolaj Golub static struct { 47*de21500dSMikolaj Golub const char *name; 48*de21500dSMikolaj Golub const char *suffix; 49*de21500dSMikolaj Golub } rlimit_param[13] = { 50*de21500dSMikolaj Golub {"cputime", "sec"}, 51*de21500dSMikolaj Golub {"filesize", "B "}, 52*de21500dSMikolaj Golub {"datasize", "B "}, 53*de21500dSMikolaj Golub {"stacksize", "B "}, 54*de21500dSMikolaj Golub {"coredumpsize", "B "}, 55*de21500dSMikolaj Golub {"memoryuse", "B "}, 56*de21500dSMikolaj Golub {"memorylocked", "B "}, 57*de21500dSMikolaj Golub {"maxprocesses", " "}, 58*de21500dSMikolaj Golub {"openfiles", " "}, 59*de21500dSMikolaj Golub {"sbsize", "B "}, 60*de21500dSMikolaj Golub {"vmemoryuse", "B "}, 61*de21500dSMikolaj Golub {"pseudo-terminals", " "}, 62*de21500dSMikolaj Golub {"swapuse", "B "}, 63*de21500dSMikolaj Golub }; 64*de21500dSMikolaj Golub 65*de21500dSMikolaj Golub #if RLIM_NLIMITS > 13 66*de21500dSMikolaj Golub #error "Resource limits have grown. Add new entries to rlimit_param[]." 67*de21500dSMikolaj Golub #endif 68*de21500dSMikolaj Golub 69598585e8SMikolaj Golub static struct rlimit rlimit[RLIM_NLIMITS]; 70598585e8SMikolaj Golub 71*de21500dSMikolaj Golub static 72*de21500dSMikolaj Golub const char *humanize_rlimit(int indx, rlim_t limit) 73*de21500dSMikolaj Golub { 74*de21500dSMikolaj Golub static char buf[14]; 75*de21500dSMikolaj Golub int scale; 76*de21500dSMikolaj Golub 77*de21500dSMikolaj Golub if (limit == RLIM_INFINITY) 78*de21500dSMikolaj Golub return ("infinity "); 79*de21500dSMikolaj Golub 80*de21500dSMikolaj Golub scale = humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 81*de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE | HN_GETSCALE, HN_DECIMAL); 82*de21500dSMikolaj Golub (void)humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 83*de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE, HN_DECIMAL); 84*de21500dSMikolaj Golub /* Pad with one space if there is no suffix prefix. */ 85*de21500dSMikolaj Golub if (scale == 0) 86*de21500dSMikolaj Golub sprintf(buf + strlen(buf), " "); 87*de21500dSMikolaj Golub return (buf); 88*de21500dSMikolaj Golub } 89*de21500dSMikolaj Golub 90598585e8SMikolaj Golub void 91598585e8SMikolaj Golub procstat_rlimit(struct kinfo_proc *kipp) 92598585e8SMikolaj Golub { 93598585e8SMikolaj Golub int error, i, name[4]; 94598585e8SMikolaj Golub size_t len; 95598585e8SMikolaj Golub 96*de21500dSMikolaj Golub if (!hflag) { 97*de21500dSMikolaj Golub printf("%5s %-16s %-16s %16s %16s\n", 98*de21500dSMikolaj Golub "PID", "COMM", "RLIMIT", "SOFT ", "HARD "); 99*de21500dSMikolaj Golub } 100598585e8SMikolaj Golub name[0] = CTL_KERN; 101598585e8SMikolaj Golub name[1] = KERN_PROC; 102598585e8SMikolaj Golub name[2] = KERN_PROC_RLIMIT; 103598585e8SMikolaj Golub name[3] = kipp->ki_pid; 104598585e8SMikolaj Golub len = sizeof(rlimit); 105598585e8SMikolaj Golub error = sysctl(name, 4, rlimit, &len, NULL, 0); 106598585e8SMikolaj Golub if (error < 0 && errno != ESRCH) { 107598585e8SMikolaj Golub warn("sysctl: kern.proc.rlimit: %d", kipp->ki_pid); 108598585e8SMikolaj Golub return; 109598585e8SMikolaj Golub } 110598585e8SMikolaj Golub if (error < 0 || len != sizeof(rlimit)) 111598585e8SMikolaj Golub return; 112598585e8SMikolaj Golub 113598585e8SMikolaj Golub for (i = 0; i < RLIM_NLIMITS; i++) { 114*de21500dSMikolaj Golub printf("%5d %-16s %-16s ", kipp->ki_pid, kipp->ki_comm, 115*de21500dSMikolaj Golub rlimit_param[i].name); 116*de21500dSMikolaj Golub printf("%16s ", humanize_rlimit(i, rlimit[i].rlim_cur)); 117*de21500dSMikolaj Golub printf("%16s\n", humanize_rlimit(i, rlimit[i].rlim_max)); 118598585e8SMikolaj Golub } 119598585e8SMikolaj Golub } 120