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> 38de21500dSMikolaj 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 46de21500dSMikolaj Golub static struct { 47de21500dSMikolaj Golub const char *name; 48de21500dSMikolaj Golub const char *suffix; 49de21500dSMikolaj Golub } rlimit_param[13] = { 50de21500dSMikolaj Golub {"cputime", "sec"}, 51de21500dSMikolaj Golub {"filesize", "B "}, 52de21500dSMikolaj Golub {"datasize", "B "}, 53de21500dSMikolaj Golub {"stacksize", "B "}, 54de21500dSMikolaj Golub {"coredumpsize", "B "}, 55de21500dSMikolaj Golub {"memoryuse", "B "}, 56de21500dSMikolaj Golub {"memorylocked", "B "}, 57de21500dSMikolaj Golub {"maxprocesses", " "}, 58de21500dSMikolaj Golub {"openfiles", " "}, 59de21500dSMikolaj Golub {"sbsize", "B "}, 60de21500dSMikolaj Golub {"vmemoryuse", "B "}, 61de21500dSMikolaj Golub {"pseudo-terminals", " "}, 62de21500dSMikolaj Golub {"swapuse", "B "}, 63de21500dSMikolaj Golub }; 64de21500dSMikolaj Golub 65de21500dSMikolaj Golub #if RLIM_NLIMITS > 13 66de21500dSMikolaj Golub #error "Resource limits have grown. Add new entries to rlimit_param[]." 67de21500dSMikolaj Golub #endif 68de21500dSMikolaj Golub 69eaa769f5SMikolaj Golub static const char * 70eaa769f5SMikolaj Golub humanize_rlimit(int indx, rlim_t limit) 71de21500dSMikolaj Golub { 72de21500dSMikolaj Golub static char buf[14]; 73de21500dSMikolaj Golub int scale; 74de21500dSMikolaj Golub 75de21500dSMikolaj Golub if (limit == RLIM_INFINITY) 76de21500dSMikolaj Golub return ("infinity "); 77de21500dSMikolaj Golub 78de21500dSMikolaj Golub scale = humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 79de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE | HN_GETSCALE, HN_DECIMAL); 80de21500dSMikolaj Golub (void)humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 81de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE, HN_DECIMAL); 82de21500dSMikolaj Golub /* Pad with one space if there is no suffix prefix. */ 83de21500dSMikolaj Golub if (scale == 0) 84de21500dSMikolaj Golub sprintf(buf + strlen(buf), " "); 85de21500dSMikolaj Golub return (buf); 86de21500dSMikolaj Golub } 87de21500dSMikolaj Golub 88598585e8SMikolaj Golub void 89*21b4f75aSMikolaj Golub procstat_rlimit(struct procstat *prstat, struct kinfo_proc *kipp) 90598585e8SMikolaj Golub { 9198623e8dSMikolaj Golub struct rlimit rlimit; 92*21b4f75aSMikolaj Golub int i; 93598585e8SMikolaj Golub 94de21500dSMikolaj Golub if (!hflag) { 95de21500dSMikolaj Golub printf("%5s %-16s %-16s %16s %16s\n", 96de21500dSMikolaj Golub "PID", "COMM", "RLIMIT", "SOFT ", "HARD "); 97de21500dSMikolaj Golub } 98c3c314f9SMikolaj Golub for (i = 0; i < RLIM_NLIMITS; i++) { 99*21b4f75aSMikolaj Golub if (procstat_getrlimit(prstat, kipp, i, &rlimit) == -1) 100598585e8SMikolaj Golub return; 101de21500dSMikolaj Golub printf("%5d %-16s %-16s ", kipp->ki_pid, kipp->ki_comm, 102de21500dSMikolaj Golub rlimit_param[i].name); 10398623e8dSMikolaj Golub printf("%16s ", humanize_rlimit(i, rlimit.rlim_cur)); 10498623e8dSMikolaj Golub printf("%16s\n", humanize_rlimit(i, rlimit.rlim_max)); 105598585e8SMikolaj Golub } 106598585e8SMikolaj Golub } 107