1598585e8SMikolaj Golub /*- 2598585e8SMikolaj Golub * Copyright (c) 2011 Mikolaj Golub 3*474b62b8SAllan Jude * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org> 4598585e8SMikolaj Golub * All rights reserved. 5598585e8SMikolaj Golub * 6598585e8SMikolaj Golub * Redistribution and use in source and binary forms, with or without 7598585e8SMikolaj Golub * modification, are permitted provided that the following conditions 8598585e8SMikolaj Golub * are met: 9598585e8SMikolaj Golub * 1. Redistributions of source code must retain the above copyright 10598585e8SMikolaj Golub * notice, this list of conditions and the following disclaimer. 11598585e8SMikolaj Golub * 2. Redistributions in binary form must reproduce the above copyright 12598585e8SMikolaj Golub * notice, this list of conditions and the following disclaimer in the 13598585e8SMikolaj Golub * documentation and/or other materials provided with the distribution. 14598585e8SMikolaj Golub * 15598585e8SMikolaj Golub * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16598585e8SMikolaj Golub * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17598585e8SMikolaj Golub * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18598585e8SMikolaj Golub * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19598585e8SMikolaj Golub * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20598585e8SMikolaj Golub * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21598585e8SMikolaj Golub * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22598585e8SMikolaj Golub * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23598585e8SMikolaj Golub * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24598585e8SMikolaj Golub * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25598585e8SMikolaj Golub * SUCH DAMAGE. 26598585e8SMikolaj Golub * 27598585e8SMikolaj Golub * $FreeBSD$ 28598585e8SMikolaj Golub */ 29598585e8SMikolaj Golub 30598585e8SMikolaj Golub #include <sys/param.h> 31598585e8SMikolaj Golub #include <sys/time.h> 32598585e8SMikolaj Golub #include <sys/resourcevar.h> 33598585e8SMikolaj Golub #include <sys/sysctl.h> 34598585e8SMikolaj Golub #include <sys/user.h> 35598585e8SMikolaj Golub 36598585e8SMikolaj Golub #include <err.h> 37598585e8SMikolaj Golub #include <errno.h> 38598585e8SMikolaj Golub #include <libprocstat.h> 39de21500dSMikolaj Golub #include <libutil.h> 40598585e8SMikolaj Golub #include <limits.h> 41598585e8SMikolaj Golub #include <stdio.h> 42598585e8SMikolaj Golub #include <stdlib.h> 43598585e8SMikolaj Golub #include <string.h> 44598585e8SMikolaj Golub 45598585e8SMikolaj Golub #include "procstat.h" 46598585e8SMikolaj Golub 47de21500dSMikolaj Golub static struct { 48de21500dSMikolaj Golub const char *name; 49de21500dSMikolaj Golub const char *suffix; 5085a0ddfdSKonstantin Belousov } rlimit_param[14] = { 51de21500dSMikolaj Golub {"cputime", "sec"}, 52de21500dSMikolaj Golub {"filesize", "B "}, 53de21500dSMikolaj Golub {"datasize", "B "}, 54de21500dSMikolaj Golub {"stacksize", "B "}, 55de21500dSMikolaj Golub {"coredumpsize", "B "}, 56de21500dSMikolaj Golub {"memoryuse", "B "}, 57de21500dSMikolaj Golub {"memorylocked", "B "}, 58de21500dSMikolaj Golub {"maxprocesses", " "}, 59de21500dSMikolaj Golub {"openfiles", " "}, 60de21500dSMikolaj Golub {"sbsize", "B "}, 61de21500dSMikolaj Golub {"vmemoryuse", "B "}, 62de21500dSMikolaj Golub {"pseudo-terminals", " "}, 63de21500dSMikolaj Golub {"swapuse", "B "}, 6485a0ddfdSKonstantin Belousov {"kqueues", " "}, 65de21500dSMikolaj Golub }; 66de21500dSMikolaj Golub 6785a0ddfdSKonstantin Belousov #if RLIM_NLIMITS > 14 68de21500dSMikolaj Golub #error "Resource limits have grown. Add new entries to rlimit_param[]." 69de21500dSMikolaj Golub #endif 70de21500dSMikolaj Golub 71eaa769f5SMikolaj Golub static const char * 72eaa769f5SMikolaj Golub humanize_rlimit(int indx, rlim_t limit) 73de21500dSMikolaj Golub { 74de21500dSMikolaj Golub static char buf[14]; 75de21500dSMikolaj Golub int scale; 76de21500dSMikolaj Golub 77de21500dSMikolaj Golub if (limit == RLIM_INFINITY) 78de21500dSMikolaj Golub return ("infinity "); 79de21500dSMikolaj Golub 80de21500dSMikolaj Golub scale = humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 81de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE | HN_GETSCALE, HN_DECIMAL); 82de21500dSMikolaj Golub (void)humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 83de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE, HN_DECIMAL); 84de21500dSMikolaj Golub /* Pad with one space if there is no suffix prefix. */ 85de21500dSMikolaj Golub if (scale == 0) 86de21500dSMikolaj Golub sprintf(buf + strlen(buf), " "); 87de21500dSMikolaj Golub return (buf); 88de21500dSMikolaj Golub } 89de21500dSMikolaj Golub 90598585e8SMikolaj Golub void 9121b4f75aSMikolaj Golub procstat_rlimit(struct procstat *prstat, struct kinfo_proc *kipp) 92598585e8SMikolaj Golub { 9398623e8dSMikolaj Golub struct rlimit rlimit; 9421b4f75aSMikolaj Golub int i; 95598585e8SMikolaj Golub 96de21500dSMikolaj Golub if (!hflag) { 97*474b62b8SAllan Jude xo_emit("{T:/%5s %-16s %-16s %16s %16s}\n", 98de21500dSMikolaj Golub "PID", "COMM", "RLIMIT", "SOFT ", "HARD "); 99de21500dSMikolaj Golub } 100*474b62b8SAllan Jude xo_emit("{ek:process_id/%5d}{e:command/%-16s/%s}", kipp->ki_pid, 101*474b62b8SAllan Jude kipp->ki_comm); 102c3c314f9SMikolaj Golub for (i = 0; i < RLIM_NLIMITS; i++) { 10321b4f75aSMikolaj Golub if (procstat_getrlimit(prstat, kipp, i, &rlimit) == -1) 104598585e8SMikolaj Golub return; 105*474b62b8SAllan Jude xo_emit("{dk:process_id/%5d} {d:command/%-16s} " 106*474b62b8SAllan Jude "{d:rlimit_param/%-16s} ", kipp->ki_pid, kipp->ki_comm, 107de21500dSMikolaj Golub rlimit_param[i].name); 108*474b62b8SAllan Jude 109*474b62b8SAllan Jude xo_open_container(rlimit_param[i].name); 110*474b62b8SAllan Jude if (rlimit.rlim_cur == RLIM_INFINITY) 111*474b62b8SAllan Jude xo_emit("{e:soft_limit/infinity}"); 112*474b62b8SAllan Jude else 113*474b62b8SAllan Jude xo_emit("{e:soft_limit/%U}", rlimit.rlim_cur); 114*474b62b8SAllan Jude 115*474b62b8SAllan Jude if (rlimit.rlim_max == RLIM_INFINITY) 116*474b62b8SAllan Jude xo_emit("{e:hard_limit/infinity}"); 117*474b62b8SAllan Jude else 118*474b62b8SAllan Jude xo_emit("{e:hard_limit/%U}", rlimit.rlim_max); 119*474b62b8SAllan Jude xo_close_container(rlimit_param[i].name); 120*474b62b8SAllan Jude 121*474b62b8SAllan Jude xo_emit("{d:rlim_cur/%16s} ", 122*474b62b8SAllan Jude humanize_rlimit(i, rlimit.rlim_cur)); 123*474b62b8SAllan Jude xo_emit("{d:rlim_max/%16s}\n", 124*474b62b8SAllan Jude humanize_rlimit(i, rlimit.rlim_max)); 125598585e8SMikolaj Golub } 126598585e8SMikolaj Golub } 127