14b88c807SRodney W. Grimes /*- 24b88c807SRodney W. Grimes * Copyright (c) 1991, 1993 34b88c807SRodney W. Grimes * The Regents of the University of California. All rights reserved. 44b88c807SRodney W. Grimes * 54b88c807SRodney W. Grimes * This code is derived from software contributed to Berkeley by 64b88c807SRodney W. Grimes * Kenneth Almquist. 74b88c807SRodney W. Grimes * 84b88c807SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 94b88c807SRodney W. Grimes * modification, are permitted provided that the following conditions 104b88c807SRodney W. Grimes * are met: 114b88c807SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 124b88c807SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 134b88c807SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 144b88c807SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 154b88c807SRodney W. Grimes * documentation and/or other materials provided with the distribution. 164b88c807SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 174b88c807SRodney W. Grimes * must display the following acknowledgement: 184b88c807SRodney W. Grimes * This product includes software developed by the University of 194b88c807SRodney W. Grimes * California, Berkeley and its contributors. 204b88c807SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 214b88c807SRodney W. Grimes * may be used to endorse or promote products derived from this software 224b88c807SRodney W. Grimes * without specific prior written permission. 234b88c807SRodney W. Grimes * 244b88c807SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 254b88c807SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 264b88c807SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 274b88c807SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 284b88c807SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 294b88c807SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 304b88c807SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 314b88c807SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 324b88c807SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 334b88c807SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 344b88c807SRodney W. Grimes * SUCH DAMAGE. 354b88c807SRodney W. Grimes */ 364b88c807SRodney W. Grimes 374b88c807SRodney W. Grimes #ifndef lint 383d7b5b93SPhilippe Charnier #if 0 393d7b5b93SPhilippe Charnier static char sccsid[] = "@(#)miscbltin.c 8.4 (Berkeley) 5/4/95"; 403d7b5b93SPhilippe Charnier #endif 413d7b5b93SPhilippe Charnier static const char rcsid[] = 428f0561ccSThomas Gellekum "$Id: miscbltin.c,v 1.19 1999/05/08 10:21:56 kris Exp $"; 434b88c807SRodney W. Grimes #endif /* not lint */ 444b88c807SRodney W. Grimes 454b88c807SRodney W. Grimes /* 4646be34b9SKris Kennaway * Miscellaneous builtins. 474b88c807SRodney W. Grimes */ 484b88c807SRodney W. Grimes 49aa9caaf6SPeter Wemm #include <sys/types.h> 50aa9caaf6SPeter Wemm #include <sys/stat.h> 51aa9caaf6SPeter Wemm #include <sys/time.h> 52aa9caaf6SPeter Wemm #include <sys/resource.h> 53aa9caaf6SPeter Wemm #include <unistd.h> 54aa9caaf6SPeter Wemm #include <ctype.h> 5516992ff4SPeter Wemm #include <errno.h> 564417f629SPeter Wemm #include <stdio.h> 571f40b47bSMartin Cracauer #include <stdlib.h> 58afa53c8dSMike Smith #include <termios.h> 59aa9caaf6SPeter Wemm 604b88c807SRodney W. Grimes #include "shell.h" 614b88c807SRodney W. Grimes #include "options.h" 624b88c807SRodney W. Grimes #include "var.h" 634b88c807SRodney W. Grimes #include "output.h" 644b88c807SRodney W. Grimes #include "memalloc.h" 654b88c807SRodney W. Grimes #include "error.h" 664b88c807SRodney W. Grimes #include "mystring.h" 674b88c807SRodney W. Grimes 684b88c807SRodney W. Grimes #undef eflag 694b88c807SRodney W. Grimes 704b88c807SRodney W. Grimes extern char **argptr; /* argument list for builtin command */ 714b88c807SRodney W. Grimes 724b88c807SRodney W. Grimes 734b88c807SRodney W. Grimes /* 748f0561ccSThomas Gellekum * The read builtin. The -r option causes backslashes to be treated like 758f0561ccSThomas Gellekum * ordinary characters. 764b88c807SRodney W. Grimes * 774b88c807SRodney W. Grimes * This uses unbuffered input, which may be avoidable in some cases. 784b88c807SRodney W. Grimes */ 794b88c807SRodney W. Grimes 80aa9caaf6SPeter Wemm int 81aa9caaf6SPeter Wemm readcmd(argc, argv) 82e7a0b024SSteve Price int argc __unused; 83e7a0b024SSteve Price char **argv __unused; 84aa9caaf6SPeter Wemm { 854b88c807SRodney W. Grimes char **ap; 864b88c807SRodney W. Grimes int backslash; 874b88c807SRodney W. Grimes char c; 888f0561ccSThomas Gellekum int rflag; 894b88c807SRodney W. Grimes char *prompt; 904b88c807SRodney W. Grimes char *ifs; 914b88c807SRodney W. Grimes char *p; 924b88c807SRodney W. Grimes int startword; 934b88c807SRodney W. Grimes int status; 944b88c807SRodney W. Grimes int i; 95afa53c8dSMike Smith struct timeval tv; 96afa53c8dSMike Smith char *tvptr; 97afa53c8dSMike Smith fd_set ifds; 98afa53c8dSMike Smith struct termios told, tnew; 99afa53c8dSMike Smith int tsaved; 1004b88c807SRodney W. Grimes 1018f0561ccSThomas Gellekum rflag = 0; 1024b88c807SRodney W. Grimes prompt = NULL; 103afa53c8dSMike Smith tv.tv_sec = -1; 104afa53c8dSMike Smith tv.tv_usec = 0; 1058f0561ccSThomas Gellekum while ((i = nextopt("erp:t:")) != '\0') { 106afa53c8dSMike Smith switch(i) { 107afa53c8dSMike Smith case 'p': 1084b88c807SRodney W. Grimes prompt = optarg; 109afa53c8dSMike Smith break; 110afa53c8dSMike Smith case 'e': 1118f0561ccSThomas Gellekum break; 1128f0561ccSThomas Gellekum case 'r': 1138f0561ccSThomas Gellekum rflag = 1; 114afa53c8dSMike Smith break; 115afa53c8dSMike Smith case 't': 116afa53c8dSMike Smith tv.tv_sec = strtol(optarg, &tvptr, 0); 117afa53c8dSMike Smith if (tvptr == optarg) 118afa53c8dSMike Smith error("timeout value"); 119afa53c8dSMike Smith switch(*tvptr) { 120afa53c8dSMike Smith case 0: 121afa53c8dSMike Smith case 's': 122afa53c8dSMike Smith break; 123afa53c8dSMike Smith case 'h': 124afa53c8dSMike Smith tv.tv_sec *= 60; 125afa53c8dSMike Smith /* FALLTHROUGH */ 126afa53c8dSMike Smith case 'm': 127afa53c8dSMike Smith tv.tv_sec *= 60; 128afa53c8dSMike Smith break; 129afa53c8dSMike Smith default: 130afa53c8dSMike Smith error("timeout unit"); 131afa53c8dSMike Smith } 132afa53c8dSMike Smith break; 133afa53c8dSMike Smith } 1344b88c807SRodney W. Grimes } 1354b88c807SRodney W. Grimes if (prompt && isatty(0)) { 1364b88c807SRodney W. Grimes out2str(prompt); 1374b88c807SRodney W. Grimes flushall(); 1384b88c807SRodney W. Grimes } 1394b88c807SRodney W. Grimes if (*(ap = argptr) == NULL) 1404b88c807SRodney W. Grimes error("arg count"); 1414b88c807SRodney W. Grimes if ((ifs = bltinlookup("IFS", 1)) == NULL) 1424b88c807SRodney W. Grimes ifs = nullstr; 143afa53c8dSMike Smith 144afa53c8dSMike Smith if (tv.tv_sec >= 0) { 145afa53c8dSMike Smith /* 146afa53c8dSMike Smith * See if we can disable input processing; this will 147afa53c8dSMike Smith * not give the desired result if we are in a pipeline 148afa53c8dSMike Smith * and someone upstream is still in line-by-line mode. 149afa53c8dSMike Smith */ 150afa53c8dSMike Smith tsaved = 0; 151afa53c8dSMike Smith if (tcgetattr(0, &told) == 0) { 152afa53c8dSMike Smith memcpy(&tnew, &told, sizeof(told)); 153afa53c8dSMike Smith cfmakeraw(&tnew); 154afa53c8dSMike Smith tcsetattr(0, TCSANOW, &tnew); 155afa53c8dSMike Smith tsaved = 1; 156afa53c8dSMike Smith } 157afa53c8dSMike Smith /* 158afa53c8dSMike Smith * Wait for something to become available. 159afa53c8dSMike Smith */ 160afa53c8dSMike Smith FD_ZERO(&ifds); 161afa53c8dSMike Smith FD_SET(0, &ifds); 162afa53c8dSMike Smith status = select(1, &ifds, NULL, NULL, &tv); 163afa53c8dSMike Smith if (tsaved) 164afa53c8dSMike Smith tcsetattr(0, TCSANOW, &told); 165afa53c8dSMike Smith /* 166afa53c8dSMike Smith * If there's nothing ready, return an error. 167afa53c8dSMike Smith */ 168afa53c8dSMike Smith if (status <= 0) 169afa53c8dSMike Smith return(1); 170afa53c8dSMike Smith } 171afa53c8dSMike Smith 1724b88c807SRodney W. Grimes status = 0; 1734b88c807SRodney W. Grimes startword = 1; 1744b88c807SRodney W. Grimes backslash = 0; 1754b88c807SRodney W. Grimes STARTSTACKSTR(p); 1764b88c807SRodney W. Grimes for (;;) { 1774b88c807SRodney W. Grimes if (read(0, &c, 1) != 1) { 1784b88c807SRodney W. Grimes status = 1; 1794b88c807SRodney W. Grimes break; 1804b88c807SRodney W. Grimes } 1814b88c807SRodney W. Grimes if (c == '\0') 1824b88c807SRodney W. Grimes continue; 1834b88c807SRodney W. Grimes if (backslash) { 1844b88c807SRodney W. Grimes backslash = 0; 1854b88c807SRodney W. Grimes if (c != '\n') 1864b88c807SRodney W. Grimes STPUTC(c, p); 1874b88c807SRodney W. Grimes continue; 1884b88c807SRodney W. Grimes } 1898f0561ccSThomas Gellekum if (!rflag && c == '\\') { 1904b88c807SRodney W. Grimes backslash++; 1914b88c807SRodney W. Grimes continue; 1924b88c807SRodney W. Grimes } 1934b88c807SRodney W. Grimes if (c == '\n') 1944b88c807SRodney W. Grimes break; 1954b88c807SRodney W. Grimes if (startword && *ifs == ' ' && strchr(ifs, c)) { 1964b88c807SRodney W. Grimes continue; 1974b88c807SRodney W. Grimes } 1984b88c807SRodney W. Grimes startword = 0; 1994b88c807SRodney W. Grimes if (backslash && c == '\\') { 2004b88c807SRodney W. Grimes if (read(0, &c, 1) != 1) { 2014b88c807SRodney W. Grimes status = 1; 2024b88c807SRodney W. Grimes break; 2034b88c807SRodney W. Grimes } 2044b88c807SRodney W. Grimes STPUTC(c, p); 2054b88c807SRodney W. Grimes } else if (ap[1] != NULL && strchr(ifs, c) != NULL) { 2064b88c807SRodney W. Grimes STACKSTRNUL(p); 2074b88c807SRodney W. Grimes setvar(*ap, stackblock(), 0); 2084b88c807SRodney W. Grimes ap++; 2094b88c807SRodney W. Grimes startword = 1; 2104b88c807SRodney W. Grimes STARTSTACKSTR(p); 2114b88c807SRodney W. Grimes } else { 2124b88c807SRodney W. Grimes STPUTC(c, p); 2134b88c807SRodney W. Grimes } 2144b88c807SRodney W. Grimes } 2154b88c807SRodney W. Grimes STACKSTRNUL(p); 2164b88c807SRodney W. Grimes setvar(*ap, stackblock(), 0); 2174b88c807SRodney W. Grimes while (*++ap != NULL) 2184b88c807SRodney W. Grimes setvar(*ap, nullstr, 0); 2194b88c807SRodney W. Grimes return status; 2204b88c807SRodney W. Grimes } 2214b88c807SRodney W. Grimes 2224b88c807SRodney W. Grimes 2234b88c807SRodney W. Grimes 224aa9caaf6SPeter Wemm int 225aa9caaf6SPeter Wemm umaskcmd(argc, argv) 226e7a0b024SSteve Price int argc __unused; 227aa9caaf6SPeter Wemm char **argv; 228aa9caaf6SPeter Wemm { 229aa9caaf6SPeter Wemm char *ap; 2304b88c807SRodney W. Grimes int mask; 2314b88c807SRodney W. Grimes int i; 232aa9caaf6SPeter Wemm int symbolic_mode = 0; 2334b88c807SRodney W. Grimes 234aa9caaf6SPeter Wemm while ((i = nextopt("S")) != '\0') { 235aa9caaf6SPeter Wemm symbolic_mode = 1; 236aa9caaf6SPeter Wemm } 237aa9caaf6SPeter Wemm 2384b88c807SRodney W. Grimes INTOFF; 2394b88c807SRodney W. Grimes mask = umask(0); 2404b88c807SRodney W. Grimes umask(mask); 2414b88c807SRodney W. Grimes INTON; 242aa9caaf6SPeter Wemm 243aa9caaf6SPeter Wemm if ((ap = *argptr) == NULL) { 244aa9caaf6SPeter Wemm if (symbolic_mode) { 245aa9caaf6SPeter Wemm char u[4], g[4], o[4]; 246aa9caaf6SPeter Wemm 247aa9caaf6SPeter Wemm i = 0; 248aa9caaf6SPeter Wemm if ((mask & S_IRUSR) == 0) 249aa9caaf6SPeter Wemm u[i++] = 'r'; 250aa9caaf6SPeter Wemm if ((mask & S_IWUSR) == 0) 251aa9caaf6SPeter Wemm u[i++] = 'w'; 252aa9caaf6SPeter Wemm if ((mask & S_IXUSR) == 0) 253aa9caaf6SPeter Wemm u[i++] = 'x'; 254aa9caaf6SPeter Wemm u[i] = '\0'; 255aa9caaf6SPeter Wemm 256aa9caaf6SPeter Wemm i = 0; 257aa9caaf6SPeter Wemm if ((mask & S_IRGRP) == 0) 258aa9caaf6SPeter Wemm g[i++] = 'r'; 259aa9caaf6SPeter Wemm if ((mask & S_IWGRP) == 0) 260aa9caaf6SPeter Wemm g[i++] = 'w'; 261aa9caaf6SPeter Wemm if ((mask & S_IXGRP) == 0) 262aa9caaf6SPeter Wemm g[i++] = 'x'; 263aa9caaf6SPeter Wemm g[i] = '\0'; 264aa9caaf6SPeter Wemm 265aa9caaf6SPeter Wemm i = 0; 266aa9caaf6SPeter Wemm if ((mask & S_IROTH) == 0) 267aa9caaf6SPeter Wemm o[i++] = 'r'; 268aa9caaf6SPeter Wemm if ((mask & S_IWOTH) == 0) 269aa9caaf6SPeter Wemm o[i++] = 'w'; 270aa9caaf6SPeter Wemm if ((mask & S_IXOTH) == 0) 271aa9caaf6SPeter Wemm o[i++] = 'x'; 272aa9caaf6SPeter Wemm o[i] = '\0'; 273aa9caaf6SPeter Wemm 274aa9caaf6SPeter Wemm out1fmt("u=%s,g=%s,o=%s\n", u, g, o); 2754b88c807SRodney W. Grimes } else { 276aa9caaf6SPeter Wemm out1fmt("%.4o\n", mask); 277aa9caaf6SPeter Wemm } 278aa9caaf6SPeter Wemm } else { 279aa9caaf6SPeter Wemm if (isdigit(*ap)) { 2804b88c807SRodney W. Grimes mask = 0; 2814b88c807SRodney W. Grimes do { 282aa9caaf6SPeter Wemm if (*ap >= '8' || *ap < '0') 2834b88c807SRodney W. Grimes error("Illegal number: %s", argv[1]); 284aa9caaf6SPeter Wemm mask = (mask << 3) + (*ap - '0'); 285aa9caaf6SPeter Wemm } while (*++ap != '\0'); 2864b88c807SRodney W. Grimes umask(mask); 287aa9caaf6SPeter Wemm } else { 288aa9caaf6SPeter Wemm void *set; 289aa9caaf6SPeter Wemm if ((set = setmode (ap)) == 0) 290aa9caaf6SPeter Wemm error("Illegal number: %s", ap); 291aa9caaf6SPeter Wemm 292aa9caaf6SPeter Wemm mask = getmode (set, ~mask & 0777); 293aa9caaf6SPeter Wemm umask(~mask & 0777); 294a207266eSWarner Losh free(set); 295aa9caaf6SPeter Wemm } 2964b88c807SRodney W. Grimes } 2974b88c807SRodney W. Grimes return 0; 2984b88c807SRodney W. Grimes } 2997a2afe64SJoerg Wunsch 300aa9caaf6SPeter Wemm /* 301aa9caaf6SPeter Wemm * ulimit builtin 302aa9caaf6SPeter Wemm * 303aa9caaf6SPeter Wemm * This code, originally by Doug Gwyn, Doug Kingston, Eric Gisin, and 304aa9caaf6SPeter Wemm * Michael Rendell was ripped from pdksh 5.0.8 and hacked for use with 305aa9caaf6SPeter Wemm * ash by J.T. Conklin. 306aa9caaf6SPeter Wemm * 307aa9caaf6SPeter Wemm * Public domain. 308aa9caaf6SPeter Wemm */ 3097a2afe64SJoerg Wunsch 310aa9caaf6SPeter Wemm struct limits { 311aa9caaf6SPeter Wemm const char *name; 31216992ff4SPeter Wemm const char *units; 313aa9caaf6SPeter Wemm int cmd; 314aa9caaf6SPeter Wemm int factor; /* multiply by to get rlim_{cur,max} values */ 315aa9caaf6SPeter Wemm char option; 3167a2afe64SJoerg Wunsch }; 3177a2afe64SJoerg Wunsch 318aa9caaf6SPeter Wemm static const struct limits limits[] = { 319aa9caaf6SPeter Wemm #ifdef RLIMIT_CPU 32016992ff4SPeter Wemm { "cpu time", "seconds", RLIMIT_CPU, 1, 't' }, 321aa9caaf6SPeter Wemm #endif 322aa9caaf6SPeter Wemm #ifdef RLIMIT_FSIZE 32316992ff4SPeter Wemm { "file size", "512-blocks", RLIMIT_FSIZE, 512, 'f' }, 324aa9caaf6SPeter Wemm #endif 325aa9caaf6SPeter Wemm #ifdef RLIMIT_DATA 32616992ff4SPeter Wemm { "data seg size", "kbytes", RLIMIT_DATA, 1024, 'd' }, 327aa9caaf6SPeter Wemm #endif 328aa9caaf6SPeter Wemm #ifdef RLIMIT_STACK 32916992ff4SPeter Wemm { "stack size", "kbytes", RLIMIT_STACK, 1024, 's' }, 330aa9caaf6SPeter Wemm #endif 331aa9caaf6SPeter Wemm #ifdef RLIMIT_CORE 33216992ff4SPeter Wemm { "core file size", "512-blocks", RLIMIT_CORE, 512, 'c' }, 333aa9caaf6SPeter Wemm #endif 334aa9caaf6SPeter Wemm #ifdef RLIMIT_RSS 33516992ff4SPeter Wemm { "max memory size", "kbytes", RLIMIT_RSS, 1024, 'm' }, 336aa9caaf6SPeter Wemm #endif 337aa9caaf6SPeter Wemm #ifdef RLIMIT_MEMLOCK 33816992ff4SPeter Wemm { "locked memory", "kbytes", RLIMIT_MEMLOCK, 1024, 'l' }, 339aa9caaf6SPeter Wemm #endif 340aa9caaf6SPeter Wemm #ifdef RLIMIT_NPROC 34116992ff4SPeter Wemm { "max user processes", (char *)0, RLIMIT_NPROC, 1, 'u' }, 342aa9caaf6SPeter Wemm #endif 343aa9caaf6SPeter Wemm #ifdef RLIMIT_NOFILE 34416992ff4SPeter Wemm { "open files", (char *)0, RLIMIT_NOFILE, 1, 'n' }, 345aa9caaf6SPeter Wemm #endif 346aa9caaf6SPeter Wemm #ifdef RLIMIT_VMEM 34716992ff4SPeter Wemm { "virtual mem size", "kbytes", RLIMIT_VMEM, 1024, 'v' }, 348aa9caaf6SPeter Wemm #endif 349aa9caaf6SPeter Wemm #ifdef RLIMIT_SWAP 35016992ff4SPeter Wemm { "swap limit", "kbytes", RLIMIT_SWAP, 1024, 'w' }, 351aa9caaf6SPeter Wemm #endif 35216992ff4SPeter Wemm { (char *) 0, (char *)0, 0, 0, '\0' } 3537a2afe64SJoerg Wunsch }; 3547a2afe64SJoerg Wunsch 355aa9caaf6SPeter Wemm int 356aa9caaf6SPeter Wemm ulimitcmd(argc, argv) 357e7a0b024SSteve Price int argc __unused; 358e7a0b024SSteve Price char **argv __unused; 359aa9caaf6SPeter Wemm { 360afb033d5SSteve Price int c; 3614417f629SPeter Wemm quad_t val = 0; 362aa9caaf6SPeter Wemm enum { SOFT = 0x1, HARD = 0x2 } 363aa9caaf6SPeter Wemm how = SOFT | HARD; 364aa9caaf6SPeter Wemm const struct limits *l; 365aa9caaf6SPeter Wemm int set, all = 0; 366aa9caaf6SPeter Wemm int optc, what; 367aa9caaf6SPeter Wemm struct rlimit limit; 3687a2afe64SJoerg Wunsch 369aa9caaf6SPeter Wemm what = 'f'; 37016992ff4SPeter Wemm while ((optc = nextopt("HSatfdsmcnul")) != '\0') 371aa9caaf6SPeter Wemm switch (optc) { 3727a2afe64SJoerg Wunsch case 'H': 373aa9caaf6SPeter Wemm how = HARD; 3747a2afe64SJoerg Wunsch break; 3757a2afe64SJoerg Wunsch case 'S': 376aa9caaf6SPeter Wemm how = SOFT; 3777a2afe64SJoerg Wunsch break; 3787a2afe64SJoerg Wunsch case 'a': 379aa9caaf6SPeter Wemm all = 1; 3807a2afe64SJoerg Wunsch break; 381aa9caaf6SPeter Wemm default: 382aa9caaf6SPeter Wemm what = optc; 3837a2afe64SJoerg Wunsch } 3847a2afe64SJoerg Wunsch 385aa9caaf6SPeter Wemm for (l = limits; l->name && l->option != what; l++) 386aa9caaf6SPeter Wemm ; 387aa9caaf6SPeter Wemm if (!l->name) 388ab0a2172SSteve Price error("ulimit: internal error (%c)", what); 3897a2afe64SJoerg Wunsch 390aa9caaf6SPeter Wemm set = *argptr ? 1 : 0; 391aa9caaf6SPeter Wemm if (set) { 392aa9caaf6SPeter Wemm char *p = *argptr; 393aa9caaf6SPeter Wemm 394aa9caaf6SPeter Wemm if (all || argptr[1]) 395ab0a2172SSteve Price error("ulimit: too many arguments"); 396aa9caaf6SPeter Wemm if (strcmp(p, "unlimited") == 0) 3977a2afe64SJoerg Wunsch val = RLIM_INFINITY; 3987a2afe64SJoerg Wunsch else { 399aa9caaf6SPeter Wemm val = (quad_t) 0; 400aa9caaf6SPeter Wemm 401aa9caaf6SPeter Wemm while ((c = *p++) >= '0' && c <= '9') 402aa9caaf6SPeter Wemm { 403aa9caaf6SPeter Wemm val = (val * 10) + (long)(c - '0'); 404aa9caaf6SPeter Wemm if (val < (quad_t) 0) 405aa9caaf6SPeter Wemm break; 4067a2afe64SJoerg Wunsch } 407aa9caaf6SPeter Wemm if (c) 408ab0a2172SSteve Price error("ulimit: bad number"); 409aa9caaf6SPeter Wemm val *= l->factor; 410aa9caaf6SPeter Wemm } 411aa9caaf6SPeter Wemm } 412aa9caaf6SPeter Wemm if (all) { 413aa9caaf6SPeter Wemm for (l = limits; l->name; l++) { 41416992ff4SPeter Wemm char optbuf[40]; 41516992ff4SPeter Wemm if (getrlimit(l->cmd, &limit) < 0) 416ab0a2172SSteve Price error("ulimit: can't get limit: %s", strerror(errno)); 417aa9caaf6SPeter Wemm if (how & SOFT) 418aa9caaf6SPeter Wemm val = limit.rlim_cur; 419aa9caaf6SPeter Wemm else if (how & HARD) 420aa9caaf6SPeter Wemm val = limit.rlim_max; 421aa9caaf6SPeter Wemm 42216992ff4SPeter Wemm if (l->units) 42316992ff4SPeter Wemm snprintf(optbuf, sizeof(optbuf), 4244e4e0959SPeter Wemm "(%s, -%c) ", l->units, l->option); 42516992ff4SPeter Wemm else 42616992ff4SPeter Wemm snprintf(optbuf, sizeof(optbuf), 4274e4e0959SPeter Wemm "(-%c) ", l->option); 4284e4e0959SPeter Wemm out1fmt("%-18s %18s ", l->name, optbuf); 429aa9caaf6SPeter Wemm if (val == RLIM_INFINITY) 430aa9caaf6SPeter Wemm out1fmt("unlimited\n"); 431aa9caaf6SPeter Wemm else 432aa9caaf6SPeter Wemm { 433aa9caaf6SPeter Wemm val /= l->factor; 4344417f629SPeter Wemm out1fmt("%qd\n", (quad_t) val); 4357a2afe64SJoerg Wunsch } 4367a2afe64SJoerg Wunsch } 4377a2afe64SJoerg Wunsch return 0; 4387a2afe64SJoerg Wunsch } 439aa9caaf6SPeter Wemm 44016992ff4SPeter Wemm if (getrlimit(l->cmd, &limit) < 0) 441ab0a2172SSteve Price error("ulimit: can't get limit: %s", strerror(errno)); 442aa9caaf6SPeter Wemm if (set) { 443aa9caaf6SPeter Wemm if (how & SOFT) 444aa9caaf6SPeter Wemm limit.rlim_cur = val; 445aa9caaf6SPeter Wemm if (how & HARD) 446aa9caaf6SPeter Wemm limit.rlim_max = val; 447aa9caaf6SPeter Wemm if (setrlimit(l->cmd, &limit) < 0) 448ab0a2172SSteve Price error("ulimit: bad limit: %s", strerror(errno)); 449aa9caaf6SPeter Wemm } else { 450aa9caaf6SPeter Wemm if (how & SOFT) 451aa9caaf6SPeter Wemm val = limit.rlim_cur; 452aa9caaf6SPeter Wemm else if (how & HARD) 453aa9caaf6SPeter Wemm val = limit.rlim_max; 454aa9caaf6SPeter Wemm 455aa9caaf6SPeter Wemm if (val == RLIM_INFINITY) 456aa9caaf6SPeter Wemm out1fmt("unlimited\n"); 457aa9caaf6SPeter Wemm else 458aa9caaf6SPeter Wemm { 459aa9caaf6SPeter Wemm val /= l->factor; 4604417f629SPeter Wemm out1fmt("%qd\n", (quad_t) val); 461aa9caaf6SPeter Wemm } 462aa9caaf6SPeter Wemm } 463aa9caaf6SPeter Wemm return 0; 464aa9caaf6SPeter Wemm } 465