1598585e8SMikolaj Golub /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 31de7b4b8SPedro F. Giffuni * 4598585e8SMikolaj Golub * Copyright (c) 2011 Mikolaj Golub 5474b62b8SAllan Jude * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org> 6598585e8SMikolaj Golub * All rights reserved. 7598585e8SMikolaj Golub * 8598585e8SMikolaj Golub * Redistribution and use in source and binary forms, with or without 9598585e8SMikolaj Golub * modification, are permitted provided that the following conditions 10598585e8SMikolaj Golub * are met: 11598585e8SMikolaj Golub * 1. Redistributions of source code must retain the above copyright 12598585e8SMikolaj Golub * notice, this list of conditions and the following disclaimer. 13598585e8SMikolaj Golub * 2. Redistributions in binary form must reproduce the above copyright 14598585e8SMikolaj Golub * notice, this list of conditions and the following disclaimer in the 15598585e8SMikolaj Golub * documentation and/or other materials provided with the distribution. 16598585e8SMikolaj Golub * 17598585e8SMikolaj Golub * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18598585e8SMikolaj Golub * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19598585e8SMikolaj Golub * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20598585e8SMikolaj Golub * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21598585e8SMikolaj Golub * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22598585e8SMikolaj Golub * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23598585e8SMikolaj Golub * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24598585e8SMikolaj Golub * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25598585e8SMikolaj Golub * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26598585e8SMikolaj Golub * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27598585e8SMikolaj Golub * SUCH DAMAGE. 28598585e8SMikolaj Golub */ 29598585e8SMikolaj Golub 30b65eb2f8SKonstantin Belousov #include <sys/cdefs.h> 31b65eb2f8SKonstantin Belousov __FBSDID("$FreeBSD$"); 32b65eb2f8SKonstantin Belousov 33598585e8SMikolaj Golub #include <sys/param.h> 34598585e8SMikolaj Golub #include <sys/time.h> 3529bf090eSGleb Smirnoff #include <sys/resource.h> 36598585e8SMikolaj Golub #include <sys/sysctl.h> 37598585e8SMikolaj Golub #include <sys/user.h> 38598585e8SMikolaj Golub 39598585e8SMikolaj Golub #include <err.h> 40598585e8SMikolaj Golub #include <errno.h> 41598585e8SMikolaj Golub #include <libprocstat.h> 42de21500dSMikolaj Golub #include <libutil.h> 43598585e8SMikolaj Golub #include <limits.h> 44598585e8SMikolaj Golub #include <stdio.h> 45598585e8SMikolaj Golub #include <stdlib.h> 46598585e8SMikolaj Golub #include <string.h> 47598585e8SMikolaj Golub 48598585e8SMikolaj Golub #include "procstat.h" 49598585e8SMikolaj Golub 50de21500dSMikolaj Golub static struct { 51de21500dSMikolaj Golub const char *name; 52de21500dSMikolaj Golub const char *suffix; 531bdbd705SKonstantin Belousov } rlimit_param[15] = { 54de21500dSMikolaj Golub {"cputime", "sec"}, 55de21500dSMikolaj Golub {"filesize", "B "}, 56de21500dSMikolaj Golub {"datasize", "B "}, 57de21500dSMikolaj Golub {"stacksize", "B "}, 58de21500dSMikolaj Golub {"coredumpsize", "B "}, 59de21500dSMikolaj Golub {"memoryuse", "B "}, 60de21500dSMikolaj Golub {"memorylocked", "B "}, 61de21500dSMikolaj Golub {"maxprocesses", " "}, 62de21500dSMikolaj Golub {"openfiles", " "}, 63de21500dSMikolaj Golub {"sbsize", "B "}, 64de21500dSMikolaj Golub {"vmemoryuse", "B "}, 65de21500dSMikolaj Golub {"pseudo-terminals", " "}, 66de21500dSMikolaj Golub {"swapuse", "B "}, 6785a0ddfdSKonstantin Belousov {"kqueues", " "}, 681bdbd705SKonstantin Belousov {"umtxp", " "}, 69de21500dSMikolaj Golub }; 70de21500dSMikolaj Golub 711bdbd705SKonstantin Belousov #if RLIM_NLIMITS > 15 72de21500dSMikolaj Golub #error "Resource limits have grown. Add new entries to rlimit_param[]." 73de21500dSMikolaj Golub #endif 74de21500dSMikolaj Golub 75eaa769f5SMikolaj Golub static const char * 76eaa769f5SMikolaj Golub humanize_rlimit(int indx, rlim_t limit) 77de21500dSMikolaj Golub { 78de21500dSMikolaj Golub static char buf[14]; 79de21500dSMikolaj Golub int scale; 80de21500dSMikolaj Golub 81de21500dSMikolaj Golub if (limit == RLIM_INFINITY) 82de21500dSMikolaj Golub return ("infinity "); 83de21500dSMikolaj Golub 84de21500dSMikolaj Golub scale = humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 85de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE | HN_GETSCALE, HN_DECIMAL); 86de21500dSMikolaj Golub (void)humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 87de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE, HN_DECIMAL); 88de21500dSMikolaj Golub /* Pad with one space if there is no suffix prefix. */ 89de21500dSMikolaj Golub if (scale == 0) 90de21500dSMikolaj Golub sprintf(buf + strlen(buf), " "); 91de21500dSMikolaj Golub return (buf); 92de21500dSMikolaj Golub } 93de21500dSMikolaj Golub 94598585e8SMikolaj Golub void 9521b4f75aSMikolaj Golub procstat_rlimit(struct procstat *prstat, struct kinfo_proc *kipp) 96598585e8SMikolaj Golub { 9798623e8dSMikolaj Golub struct rlimit rlimit; 9821b4f75aSMikolaj Golub int i; 99598585e8SMikolaj Golub 1002a243b95SBrooks Davis if ((procstat_opts & PS_OPT_NOHEADER) == 0) { 101474b62b8SAllan Jude xo_emit("{T:/%5s %-16s %-16s %16s %16s}\n", 102de21500dSMikolaj Golub "PID", "COMM", "RLIMIT", "SOFT ", "HARD "); 103de21500dSMikolaj Golub } 104474b62b8SAllan Jude xo_emit("{ek:process_id/%5d}{e:command/%-16s/%s}", kipp->ki_pid, 105474b62b8SAllan Jude kipp->ki_comm); 106c3c314f9SMikolaj Golub for (i = 0; i < RLIM_NLIMITS; i++) { 10721b4f75aSMikolaj Golub if (procstat_getrlimit(prstat, kipp, i, &rlimit) == -1) 108598585e8SMikolaj Golub return; 109474b62b8SAllan Jude xo_emit("{dk:process_id/%5d} {d:command/%-16s} " 110474b62b8SAllan Jude "{d:rlimit_param/%-16s} ", kipp->ki_pid, kipp->ki_comm, 111de21500dSMikolaj Golub rlimit_param[i].name); 112474b62b8SAllan Jude 113474b62b8SAllan Jude xo_open_container(rlimit_param[i].name); 114474b62b8SAllan Jude if (rlimit.rlim_cur == RLIM_INFINITY) 115474b62b8SAllan Jude xo_emit("{e:soft_limit/infinity}"); 116474b62b8SAllan Jude else 117474b62b8SAllan Jude xo_emit("{e:soft_limit/%U}", rlimit.rlim_cur); 118474b62b8SAllan Jude 119474b62b8SAllan Jude if (rlimit.rlim_max == RLIM_INFINITY) 120474b62b8SAllan Jude xo_emit("{e:hard_limit/infinity}"); 121474b62b8SAllan Jude else 122474b62b8SAllan Jude xo_emit("{e:hard_limit/%U}", rlimit.rlim_max); 123474b62b8SAllan Jude xo_close_container(rlimit_param[i].name); 124474b62b8SAllan Jude 125474b62b8SAllan Jude xo_emit("{d:rlim_cur/%16s} ", 126474b62b8SAllan Jude humanize_rlimit(i, rlimit.rlim_cur)); 127474b62b8SAllan Jude xo_emit("{d:rlim_max/%16s}\n", 128474b62b8SAllan Jude humanize_rlimit(i, rlimit.rlim_max)); 129598585e8SMikolaj Golub } 130598585e8SMikolaj Golub } 131