1d37ed5a0SPoul-Henning Kamp /* 2d37ed5a0SPoul-Henning Kamp * Copyright (c) 1999 Adrian Chadd 3d37ed5a0SPoul-Henning Kamp * Copyright (c) 1993 4d37ed5a0SPoul-Henning Kamp * The Regents of the University of California. All rights reserved. 5d37ed5a0SPoul-Henning Kamp * 6d37ed5a0SPoul-Henning Kamp * This code is derived from software contributed to Berkeley by 7d37ed5a0SPoul-Henning Kamp * Jan-Simon Pendry. 8d37ed5a0SPoul-Henning Kamp * 9d37ed5a0SPoul-Henning Kamp * Redistribution and use in source and binary forms, with or without 10d37ed5a0SPoul-Henning Kamp * modification, are permitted provided that the following conditions 11d37ed5a0SPoul-Henning Kamp * are met: 12d37ed5a0SPoul-Henning Kamp * 1. Redistributions of source code must retain the above copyright 13d37ed5a0SPoul-Henning Kamp * notice, this list of conditions and the following disclaimer. 14d37ed5a0SPoul-Henning Kamp * 2. Redistributions in binary form must reproduce the above copyright 15d37ed5a0SPoul-Henning Kamp * notice, this list of conditions and the following disclaimer in the 16d37ed5a0SPoul-Henning Kamp * documentation and/or other materials provided with the distribution. 17d37ed5a0SPoul-Henning Kamp * 3. All advertising materials mentioning features or use of this software 18d37ed5a0SPoul-Henning Kamp * must display the following acknowledgement: 19d37ed5a0SPoul-Henning Kamp * This product includes software developed by the University of 20d37ed5a0SPoul-Henning Kamp * California, Berkeley and its contributors. 21d37ed5a0SPoul-Henning Kamp * 4. Neither the name of the University nor the names of its contributors 22d37ed5a0SPoul-Henning Kamp * may be used to endorse or promote products derived from this software 23d37ed5a0SPoul-Henning Kamp * without specific prior written permission. 24d37ed5a0SPoul-Henning Kamp * 25d37ed5a0SPoul-Henning Kamp * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26d37ed5a0SPoul-Henning Kamp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27d37ed5a0SPoul-Henning Kamp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28d37ed5a0SPoul-Henning Kamp * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29d37ed5a0SPoul-Henning Kamp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30d37ed5a0SPoul-Henning Kamp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31d37ed5a0SPoul-Henning Kamp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32d37ed5a0SPoul-Henning Kamp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33d37ed5a0SPoul-Henning Kamp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34d37ed5a0SPoul-Henning Kamp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35d37ed5a0SPoul-Henning Kamp * SUCH DAMAGE. 36d37ed5a0SPoul-Henning Kamp * 37d37ed5a0SPoul-Henning Kamp * @(#)procfs_status.c 8.4 (Berkeley) 6/15/94 38d37ed5a0SPoul-Henning Kamp * 39d37ed5a0SPoul-Henning Kamp * $Id: procfs_status.c,v 1.12 1999/01/05 03:53:06 peter Exp $ 40d37ed5a0SPoul-Henning Kamp */ 41d37ed5a0SPoul-Henning Kamp 42d37ed5a0SPoul-Henning Kamp /* 43d37ed5a0SPoul-Henning Kamp * To get resource.h to include our rlimit_ident[] array of rlimit identifiers 44d37ed5a0SPoul-Henning Kamp */ 45d37ed5a0SPoul-Henning Kamp 46d37ed5a0SPoul-Henning Kamp #define _RLIMIT_IDENT 47d37ed5a0SPoul-Henning Kamp 48d37ed5a0SPoul-Henning Kamp #include <sys/param.h> 49d37ed5a0SPoul-Henning Kamp #include <sys/systm.h> 50d37ed5a0SPoul-Henning Kamp #include <sys/proc.h> 51d37ed5a0SPoul-Henning Kamp #include <sys/vnode.h> 52d37ed5a0SPoul-Henning Kamp #include <sys/tty.h> 53d37ed5a0SPoul-Henning Kamp #include <sys/resourcevar.h> 54d37ed5a0SPoul-Henning Kamp #include <sys/resource.h> 55d37ed5a0SPoul-Henning Kamp #include <sys/types.h> 56d37ed5a0SPoul-Henning Kamp #include <miscfs/procfs/procfs.h> 57d37ed5a0SPoul-Henning Kamp 58d37ed5a0SPoul-Henning Kamp 59d37ed5a0SPoul-Henning Kamp /* 60d37ed5a0SPoul-Henning Kamp * This converts a quad_t to a string, stored in fin 61d37ed5a0SPoul-Henning Kamp * It is here because there doesn't exist a quad_t entry in the kernel 62d37ed5a0SPoul-Henning Kamp * printf() library. 63d37ed5a0SPoul-Henning Kamp */ 64d37ed5a0SPoul-Henning Kamp 65d37ed5a0SPoul-Henning Kamp static void quadtostring (char *fin, quad_t num) 66d37ed5a0SPoul-Henning Kamp { 67d37ed5a0SPoul-Henning Kamp char str[128]; 68d37ed5a0SPoul-Henning Kamp char *cp; 69d37ed5a0SPoul-Henning Kamp int i, n; 70d37ed5a0SPoul-Henning Kamp 71d37ed5a0SPoul-Henning Kamp cp = str; 72d37ed5a0SPoul-Henning Kamp i = 0; 73d37ed5a0SPoul-Henning Kamp 74d37ed5a0SPoul-Henning Kamp /* 75d37ed5a0SPoul-Henning Kamp * Create the number string. 76d37ed5a0SPoul-Henning Kamp * The string will be in reverse from the original number. 77d37ed5a0SPoul-Henning Kamp */ 78d37ed5a0SPoul-Henning Kamp 79d37ed5a0SPoul-Henning Kamp while (num) { 80d37ed5a0SPoul-Henning Kamp *(cp++) = (num % 10) + '0'; 81d37ed5a0SPoul-Henning Kamp num /= 10; 82d37ed5a0SPoul-Henning Kamp i++; 83d37ed5a0SPoul-Henning Kamp } 84d37ed5a0SPoul-Henning Kamp 85d37ed5a0SPoul-Henning Kamp /* Null terminate */ 86d37ed5a0SPoul-Henning Kamp *cp = '\0'; 87d37ed5a0SPoul-Henning Kamp 88d37ed5a0SPoul-Henning Kamp /* 89d37ed5a0SPoul-Henning Kamp * Now, swap the order 90d37ed5a0SPoul-Henning Kamp */ 91d37ed5a0SPoul-Henning Kamp 92d37ed5a0SPoul-Henning Kamp for (n = 0; n < i; n++) { 93d37ed5a0SPoul-Henning Kamp fin[n] = str[(i-1)-n]; 94d37ed5a0SPoul-Henning Kamp } 95d37ed5a0SPoul-Henning Kamp 96d37ed5a0SPoul-Henning Kamp /* Null terminate */ 97d37ed5a0SPoul-Henning Kamp fin[n] = '\0'; 98d37ed5a0SPoul-Henning Kamp 99d37ed5a0SPoul-Henning Kamp return; 100d37ed5a0SPoul-Henning Kamp } 101d37ed5a0SPoul-Henning Kamp 102d37ed5a0SPoul-Henning Kamp 103d37ed5a0SPoul-Henning Kamp 104d37ed5a0SPoul-Henning Kamp int 105d37ed5a0SPoul-Henning Kamp procfs_dorlimit(curp, p, pfs, uio) 106d37ed5a0SPoul-Henning Kamp struct proc *curp; 107d37ed5a0SPoul-Henning Kamp struct proc *p; 108d37ed5a0SPoul-Henning Kamp struct pfsnode *pfs; 109d37ed5a0SPoul-Henning Kamp struct uio *uio; 110d37ed5a0SPoul-Henning Kamp { 111d37ed5a0SPoul-Henning Kamp char *ps; 112d37ed5a0SPoul-Henning Kamp int i; 113d37ed5a0SPoul-Henning Kamp int xlen; 114d37ed5a0SPoul-Henning Kamp int error; 115d37ed5a0SPoul-Henning Kamp char psbuf[512]; /* XXX - conservative */ 116d37ed5a0SPoul-Henning Kamp char qstr[64]; 117d37ed5a0SPoul-Henning Kamp 118d37ed5a0SPoul-Henning Kamp if (uio->uio_rw != UIO_READ) 119d37ed5a0SPoul-Henning Kamp return (EOPNOTSUPP); 120d37ed5a0SPoul-Henning Kamp 121d37ed5a0SPoul-Henning Kamp 122d37ed5a0SPoul-Henning Kamp ps = psbuf; 123d37ed5a0SPoul-Henning Kamp 124d37ed5a0SPoul-Henning Kamp for (i = 0; i < RLIM_NLIMITS; i++) { 125d37ed5a0SPoul-Henning Kamp 126d37ed5a0SPoul-Henning Kamp /* 127d37ed5a0SPoul-Henning Kamp * Add the rlimit ident 128d37ed5a0SPoul-Henning Kamp */ 129d37ed5a0SPoul-Henning Kamp 130d37ed5a0SPoul-Henning Kamp ps += sprintf(ps, "%s ", rlimit_ident[i]); 131d37ed5a0SPoul-Henning Kamp 132d37ed5a0SPoul-Henning Kamp /* 133d37ed5a0SPoul-Henning Kamp * Replace RLIM_INFINITY with -1 in the string 134d37ed5a0SPoul-Henning Kamp */ 135d37ed5a0SPoul-Henning Kamp 136d37ed5a0SPoul-Henning Kamp /* 137d37ed5a0SPoul-Henning Kamp * current limit 138d37ed5a0SPoul-Henning Kamp */ 139d37ed5a0SPoul-Henning Kamp 140d37ed5a0SPoul-Henning Kamp if (p->p_rlimit[i].rlim_cur == RLIM_INFINITY) { 141d37ed5a0SPoul-Henning Kamp ps += sprintf(ps, "-1 "); 142d37ed5a0SPoul-Henning Kamp } else { 143d37ed5a0SPoul-Henning Kamp quadtostring(qstr, p->p_rlimit[i].rlim_cur); 144d37ed5a0SPoul-Henning Kamp ps += sprintf(ps, "%s ", qstr); 145d37ed5a0SPoul-Henning Kamp } 146d37ed5a0SPoul-Henning Kamp 147d37ed5a0SPoul-Henning Kamp /* 148d37ed5a0SPoul-Henning Kamp * maximum limit 149d37ed5a0SPoul-Henning Kamp */ 150d37ed5a0SPoul-Henning Kamp 151d37ed5a0SPoul-Henning Kamp if (p->p_rlimit[i].rlim_max == RLIM_INFINITY) { 152d37ed5a0SPoul-Henning Kamp ps += sprintf(ps, "-1\n"); 153d37ed5a0SPoul-Henning Kamp } else { 154d37ed5a0SPoul-Henning Kamp quadtostring(qstr, p->p_rlimit[i].rlim_max); 155d37ed5a0SPoul-Henning Kamp ps += sprintf(ps, "%s\n", qstr); 156d37ed5a0SPoul-Henning Kamp } 157d37ed5a0SPoul-Henning Kamp } 158d37ed5a0SPoul-Henning Kamp 159d37ed5a0SPoul-Henning Kamp /* 160d37ed5a0SPoul-Henning Kamp * This logic is rather tasty - but its from procfs_status.c, so 161d37ed5a0SPoul-Henning Kamp * I guess I'll use it here. 162d37ed5a0SPoul-Henning Kamp */ 163d37ed5a0SPoul-Henning Kamp 164d37ed5a0SPoul-Henning Kamp xlen = ps - psbuf; 165d37ed5a0SPoul-Henning Kamp xlen -= uio->uio_offset; 166d37ed5a0SPoul-Henning Kamp ps = psbuf + uio->uio_offset; 167d37ed5a0SPoul-Henning Kamp xlen = imin(xlen, uio->uio_resid); 168d37ed5a0SPoul-Henning Kamp if (xlen <= 0) 169d37ed5a0SPoul-Henning Kamp error = 0; 170d37ed5a0SPoul-Henning Kamp else 171d37ed5a0SPoul-Henning Kamp error = uiomove(ps, xlen, uio); 172d37ed5a0SPoul-Henning Kamp 173d37ed5a0SPoul-Henning Kamp return (error); 174d37ed5a0SPoul-Henning Kamp } 175d37ed5a0SPoul-Henning Kamp 176