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. 3589730b29SDavid Greenman * 36aa9caaf6SPeter Wemm * $Id: miscbltin.c,v 1.4 1995/10/21 00:47:30 joerg Exp $ 374b88c807SRodney W. Grimes */ 384b88c807SRodney W. Grimes 394b88c807SRodney W. Grimes #ifndef lint 40aa9caaf6SPeter Wemm static char sccsid[] = "@(#)miscbltin.c 8.4 (Berkeley) 5/4/95"; 414b88c807SRodney W. Grimes #endif /* not lint */ 424b88c807SRodney W. Grimes 434b88c807SRodney W. Grimes /* 444b88c807SRodney W. Grimes * Miscelaneous builtins. 454b88c807SRodney W. Grimes */ 464b88c807SRodney W. Grimes 47aa9caaf6SPeter Wemm #include <sys/types.h> 48aa9caaf6SPeter Wemm #include <sys/stat.h> 49aa9caaf6SPeter Wemm #include <sys/time.h> 50aa9caaf6SPeter Wemm #include <sys/resource.h> 51aa9caaf6SPeter Wemm #include <unistd.h> 52aa9caaf6SPeter Wemm #include <ctype.h> 53aa9caaf6SPeter Wemm 544b88c807SRodney W. Grimes #include "shell.h" 554b88c807SRodney W. Grimes #include "options.h" 564b88c807SRodney W. Grimes #include "var.h" 574b88c807SRodney W. Grimes #include "output.h" 584b88c807SRodney W. Grimes #include "memalloc.h" 594b88c807SRodney W. Grimes #include "error.h" 604b88c807SRodney W. Grimes #include "mystring.h" 614b88c807SRodney W. Grimes 624b88c807SRodney W. Grimes #undef eflag 634b88c807SRodney W. Grimes 644b88c807SRodney W. Grimes extern char **argptr; /* argument list for builtin command */ 654b88c807SRodney W. Grimes 664b88c807SRodney W. Grimes 674b88c807SRodney W. Grimes /* 684b88c807SRodney W. Grimes * The read builtin. The -e option causes backslashes to escape the 694b88c807SRodney W. Grimes * following character. 704b88c807SRodney W. Grimes * 714b88c807SRodney W. Grimes * This uses unbuffered input, which may be avoidable in some cases. 724b88c807SRodney W. Grimes */ 734b88c807SRodney W. Grimes 74aa9caaf6SPeter Wemm int 75aa9caaf6SPeter Wemm readcmd(argc, argv) 76aa9caaf6SPeter Wemm int argc; 77aa9caaf6SPeter Wemm char **argv; 78aa9caaf6SPeter Wemm { 794b88c807SRodney W. Grimes char **ap; 804b88c807SRodney W. Grimes int backslash; 814b88c807SRodney W. Grimes char c; 824b88c807SRodney W. Grimes int eflag; 834b88c807SRodney W. Grimes char *prompt; 844b88c807SRodney W. Grimes char *ifs; 854b88c807SRodney W. Grimes char *p; 864b88c807SRodney W. Grimes int startword; 874b88c807SRodney W. Grimes int status; 884b88c807SRodney W. Grimes int i; 894b88c807SRodney W. Grimes 904b88c807SRodney W. Grimes eflag = 0; 914b88c807SRodney W. Grimes prompt = NULL; 924b88c807SRodney W. Grimes while ((i = nextopt("ep:")) != '\0') { 934b88c807SRodney W. Grimes if (i == 'p') 944b88c807SRodney W. Grimes prompt = optarg; 954b88c807SRodney W. Grimes else 964b88c807SRodney W. Grimes eflag = 1; 974b88c807SRodney W. Grimes } 984b88c807SRodney W. Grimes if (prompt && isatty(0)) { 994b88c807SRodney W. Grimes out2str(prompt); 1004b88c807SRodney W. Grimes flushall(); 1014b88c807SRodney W. Grimes } 1024b88c807SRodney W. Grimes if (*(ap = argptr) == NULL) 1034b88c807SRodney W. Grimes error("arg count"); 1044b88c807SRodney W. Grimes if ((ifs = bltinlookup("IFS", 1)) == NULL) 1054b88c807SRodney W. Grimes ifs = nullstr; 1064b88c807SRodney W. Grimes status = 0; 1074b88c807SRodney W. Grimes startword = 1; 1084b88c807SRodney W. Grimes backslash = 0; 1094b88c807SRodney W. Grimes STARTSTACKSTR(p); 1104b88c807SRodney W. Grimes for (;;) { 1114b88c807SRodney W. Grimes if (read(0, &c, 1) != 1) { 1124b88c807SRodney W. Grimes status = 1; 1134b88c807SRodney W. Grimes break; 1144b88c807SRodney W. Grimes } 1154b88c807SRodney W. Grimes if (c == '\0') 1164b88c807SRodney W. Grimes continue; 1174b88c807SRodney W. Grimes if (backslash) { 1184b88c807SRodney W. Grimes backslash = 0; 1194b88c807SRodney W. Grimes if (c != '\n') 1204b88c807SRodney W. Grimes STPUTC(c, p); 1214b88c807SRodney W. Grimes continue; 1224b88c807SRodney W. Grimes } 1234b88c807SRodney W. Grimes if (eflag && c == '\\') { 1244b88c807SRodney W. Grimes backslash++; 1254b88c807SRodney W. Grimes continue; 1264b88c807SRodney W. Grimes } 1274b88c807SRodney W. Grimes if (c == '\n') 1284b88c807SRodney W. Grimes break; 1294b88c807SRodney W. Grimes if (startword && *ifs == ' ' && strchr(ifs, c)) { 1304b88c807SRodney W. Grimes continue; 1314b88c807SRodney W. Grimes } 1324b88c807SRodney W. Grimes startword = 0; 1334b88c807SRodney W. Grimes if (backslash && c == '\\') { 1344b88c807SRodney W. Grimes if (read(0, &c, 1) != 1) { 1354b88c807SRodney W. Grimes status = 1; 1364b88c807SRodney W. Grimes break; 1374b88c807SRodney W. Grimes } 1384b88c807SRodney W. Grimes STPUTC(c, p); 1394b88c807SRodney W. Grimes } else if (ap[1] != NULL && strchr(ifs, c) != NULL) { 1404b88c807SRodney W. Grimes STACKSTRNUL(p); 1414b88c807SRodney W. Grimes setvar(*ap, stackblock(), 0); 1424b88c807SRodney W. Grimes ap++; 1434b88c807SRodney W. Grimes startword = 1; 1444b88c807SRodney W. Grimes STARTSTACKSTR(p); 1454b88c807SRodney W. Grimes } else { 1464b88c807SRodney W. Grimes STPUTC(c, p); 1474b88c807SRodney W. Grimes } 1484b88c807SRodney W. Grimes } 1494b88c807SRodney W. Grimes STACKSTRNUL(p); 1504b88c807SRodney W. Grimes setvar(*ap, stackblock(), 0); 1514b88c807SRodney W. Grimes while (*++ap != NULL) 1524b88c807SRodney W. Grimes setvar(*ap, nullstr, 0); 1534b88c807SRodney W. Grimes return status; 1544b88c807SRodney W. Grimes } 1554b88c807SRodney W. Grimes 1564b88c807SRodney W. Grimes 1574b88c807SRodney W. Grimes 158aa9caaf6SPeter Wemm int 159aa9caaf6SPeter Wemm umaskcmd(argc, argv) 160aa9caaf6SPeter Wemm int argc; 161aa9caaf6SPeter Wemm char **argv; 162aa9caaf6SPeter Wemm { 163aa9caaf6SPeter Wemm char *ap; 1644b88c807SRodney W. Grimes int mask; 1654b88c807SRodney W. Grimes int i; 166aa9caaf6SPeter Wemm int symbolic_mode = 0; 1674b88c807SRodney W. Grimes 168aa9caaf6SPeter Wemm while ((i = nextopt("S")) != '\0') { 169aa9caaf6SPeter Wemm symbolic_mode = 1; 170aa9caaf6SPeter Wemm } 171aa9caaf6SPeter Wemm 1724b88c807SRodney W. Grimes INTOFF; 1734b88c807SRodney W. Grimes mask = umask(0); 1744b88c807SRodney W. Grimes umask(mask); 1754b88c807SRodney W. Grimes INTON; 176aa9caaf6SPeter Wemm 177aa9caaf6SPeter Wemm if ((ap = *argptr) == NULL) { 178aa9caaf6SPeter Wemm if (symbolic_mode) { 179aa9caaf6SPeter Wemm char u[4], g[4], o[4]; 180aa9caaf6SPeter Wemm 181aa9caaf6SPeter Wemm i = 0; 182aa9caaf6SPeter Wemm if ((mask & S_IRUSR) == 0) 183aa9caaf6SPeter Wemm u[i++] = 'r'; 184aa9caaf6SPeter Wemm if ((mask & S_IWUSR) == 0) 185aa9caaf6SPeter Wemm u[i++] = 'w'; 186aa9caaf6SPeter Wemm if ((mask & S_IXUSR) == 0) 187aa9caaf6SPeter Wemm u[i++] = 'x'; 188aa9caaf6SPeter Wemm u[i] = '\0'; 189aa9caaf6SPeter Wemm 190aa9caaf6SPeter Wemm i = 0; 191aa9caaf6SPeter Wemm if ((mask & S_IRGRP) == 0) 192aa9caaf6SPeter Wemm g[i++] = 'r'; 193aa9caaf6SPeter Wemm if ((mask & S_IWGRP) == 0) 194aa9caaf6SPeter Wemm g[i++] = 'w'; 195aa9caaf6SPeter Wemm if ((mask & S_IXGRP) == 0) 196aa9caaf6SPeter Wemm g[i++] = 'x'; 197aa9caaf6SPeter Wemm g[i] = '\0'; 198aa9caaf6SPeter Wemm 199aa9caaf6SPeter Wemm i = 0; 200aa9caaf6SPeter Wemm if ((mask & S_IROTH) == 0) 201aa9caaf6SPeter Wemm o[i++] = 'r'; 202aa9caaf6SPeter Wemm if ((mask & S_IWOTH) == 0) 203aa9caaf6SPeter Wemm o[i++] = 'w'; 204aa9caaf6SPeter Wemm if ((mask & S_IXOTH) == 0) 205aa9caaf6SPeter Wemm o[i++] = 'x'; 206aa9caaf6SPeter Wemm o[i] = '\0'; 207aa9caaf6SPeter Wemm 208aa9caaf6SPeter Wemm out1fmt("u=%s,g=%s,o=%s\n", u, g, o); 2094b88c807SRodney W. Grimes } else { 210aa9caaf6SPeter Wemm out1fmt("%.4o\n", mask); 211aa9caaf6SPeter Wemm } 212aa9caaf6SPeter Wemm } else { 213aa9caaf6SPeter Wemm if (isdigit(*ap)) { 2144b88c807SRodney W. Grimes mask = 0; 2154b88c807SRodney W. Grimes do { 216aa9caaf6SPeter Wemm if (*ap >= '8' || *ap < '0') 2174b88c807SRodney W. Grimes error("Illegal number: %s", argv[1]); 218aa9caaf6SPeter Wemm mask = (mask << 3) + (*ap - '0'); 219aa9caaf6SPeter Wemm } while (*++ap != '\0'); 2204b88c807SRodney W. Grimes umask(mask); 221aa9caaf6SPeter Wemm } else { 222aa9caaf6SPeter Wemm void *set; 223aa9caaf6SPeter Wemm if ((set = setmode (ap)) == 0) 224aa9caaf6SPeter Wemm error("Illegal number: %s", ap); 225aa9caaf6SPeter Wemm 226aa9caaf6SPeter Wemm mask = getmode (set, ~mask & 0777); 227aa9caaf6SPeter Wemm umask(~mask & 0777); 228aa9caaf6SPeter Wemm } 2294b88c807SRodney W. Grimes } 2304b88c807SRodney W. Grimes return 0; 2314b88c807SRodney W. Grimes } 2327a2afe64SJoerg Wunsch 233aa9caaf6SPeter Wemm /* 234aa9caaf6SPeter Wemm * ulimit builtin 235aa9caaf6SPeter Wemm * 236aa9caaf6SPeter Wemm * This code, originally by Doug Gwyn, Doug Kingston, Eric Gisin, and 237aa9caaf6SPeter Wemm * Michael Rendell was ripped from pdksh 5.0.8 and hacked for use with 238aa9caaf6SPeter Wemm * ash by J.T. Conklin. 239aa9caaf6SPeter Wemm * 240aa9caaf6SPeter Wemm * Public domain. 241aa9caaf6SPeter Wemm */ 2427a2afe64SJoerg Wunsch 243aa9caaf6SPeter Wemm struct limits { 244aa9caaf6SPeter Wemm const char *name; 245aa9caaf6SPeter Wemm int cmd; 246aa9caaf6SPeter Wemm int factor; /* multiply by to get rlim_{cur,max} values */ 247aa9caaf6SPeter Wemm char option; 2487a2afe64SJoerg Wunsch }; 2497a2afe64SJoerg Wunsch 250aa9caaf6SPeter Wemm static const struct limits limits[] = { 251aa9caaf6SPeter Wemm #ifdef RLIMIT_CPU 252aa9caaf6SPeter Wemm { "time(seconds)", RLIMIT_CPU, 1, 't' }, 253aa9caaf6SPeter Wemm #endif 254aa9caaf6SPeter Wemm #ifdef RLIMIT_FSIZE 255aa9caaf6SPeter Wemm { "file(512-blocks)", RLIMIT_FSIZE, 512, 'f' }, 256aa9caaf6SPeter Wemm #endif 257aa9caaf6SPeter Wemm #ifdef RLIMIT_DATA 258aa9caaf6SPeter Wemm { "data(kbytes)", RLIMIT_DATA, 1024, 'd' }, 259aa9caaf6SPeter Wemm #endif 260aa9caaf6SPeter Wemm #ifdef RLIMIT_STACK 261aa9caaf6SPeter Wemm { "stack(kbytes)", RLIMIT_STACK, 1024, 's' }, 262aa9caaf6SPeter Wemm #endif 263aa9caaf6SPeter Wemm #ifdef RLIMIT_CORE 264aa9caaf6SPeter Wemm { "coredump(512-blocks)", RLIMIT_CORE, 512, 'c' }, 265aa9caaf6SPeter Wemm #endif 266aa9caaf6SPeter Wemm #ifdef RLIMIT_RSS 267aa9caaf6SPeter Wemm { "memory(kbytes)", RLIMIT_RSS, 1024, 'm' }, 268aa9caaf6SPeter Wemm #endif 269aa9caaf6SPeter Wemm #ifdef RLIMIT_MEMLOCK 270aa9caaf6SPeter Wemm { "lockedmem(kbytes)", RLIMIT_MEMLOCK, 1024, 'l' }, 271aa9caaf6SPeter Wemm #endif 272aa9caaf6SPeter Wemm #ifdef RLIMIT_NPROC 273aa9caaf6SPeter Wemm { "process(processes)", RLIMIT_NPROC, 1, 'u' }, 274aa9caaf6SPeter Wemm #endif 275aa9caaf6SPeter Wemm #ifdef RLIMIT_NOFILE 276aa9caaf6SPeter Wemm { "nofiles(descriptors)", RLIMIT_NOFILE, 1, 'n' }, 277aa9caaf6SPeter Wemm #endif 278aa9caaf6SPeter Wemm #ifdef RLIMIT_VMEM 279aa9caaf6SPeter Wemm { "vmemory(kbytes)", RLIMIT_VMEM, 1024, 'v' }, 280aa9caaf6SPeter Wemm #endif 281aa9caaf6SPeter Wemm #ifdef RLIMIT_SWAP 282aa9caaf6SPeter Wemm { "swap(kbytes)", RLIMIT_SWAP, 1024, 'w' }, 283aa9caaf6SPeter Wemm #endif 284aa9caaf6SPeter Wemm { (char *) 0, 0, 0, '\0' } 2857a2afe64SJoerg Wunsch }; 2867a2afe64SJoerg Wunsch 287aa9caaf6SPeter Wemm int 288aa9caaf6SPeter Wemm ulimitcmd(argc, argv) 289aa9caaf6SPeter Wemm int argc; 290aa9caaf6SPeter Wemm char **argv; 291aa9caaf6SPeter Wemm { 292aa9caaf6SPeter Wemm register int c; 2937a2afe64SJoerg Wunsch quad_t val; 294aa9caaf6SPeter Wemm enum { SOFT = 0x1, HARD = 0x2 } 295aa9caaf6SPeter Wemm how = SOFT | HARD; 296aa9caaf6SPeter Wemm const struct limits *l; 297aa9caaf6SPeter Wemm int set, all = 0; 298aa9caaf6SPeter Wemm int optc, what; 299aa9caaf6SPeter Wemm struct rlimit limit; 3007a2afe64SJoerg Wunsch 301aa9caaf6SPeter Wemm what = 'f'; 302aa9caaf6SPeter Wemm while ((optc = nextopt("HSatfdsmcnpl")) != '\0') 303aa9caaf6SPeter Wemm switch (optc) { 3047a2afe64SJoerg Wunsch case 'H': 305aa9caaf6SPeter Wemm how = HARD; 3067a2afe64SJoerg Wunsch break; 3077a2afe64SJoerg Wunsch case 'S': 308aa9caaf6SPeter Wemm how = SOFT; 3097a2afe64SJoerg Wunsch break; 3107a2afe64SJoerg Wunsch case 'a': 311aa9caaf6SPeter Wemm all = 1; 3127a2afe64SJoerg Wunsch break; 313aa9caaf6SPeter Wemm default: 314aa9caaf6SPeter Wemm what = optc; 3157a2afe64SJoerg Wunsch } 3167a2afe64SJoerg Wunsch 317aa9caaf6SPeter Wemm for (l = limits; l->name && l->option != what; l++) 318aa9caaf6SPeter Wemm ; 319aa9caaf6SPeter Wemm if (!l->name) 320aa9caaf6SPeter Wemm error("ulimit: internal error (%c)\n", what); 3217a2afe64SJoerg Wunsch 322aa9caaf6SPeter Wemm set = *argptr ? 1 : 0; 323aa9caaf6SPeter Wemm if (set) { 324aa9caaf6SPeter Wemm char *p = *argptr; 325aa9caaf6SPeter Wemm 326aa9caaf6SPeter Wemm if (all || argptr[1]) 327aa9caaf6SPeter Wemm error("ulimit: too many arguments\n"); 328aa9caaf6SPeter Wemm if (strcmp(p, "unlimited") == 0) 3297a2afe64SJoerg Wunsch val = RLIM_INFINITY; 3307a2afe64SJoerg Wunsch else { 331aa9caaf6SPeter Wemm val = (quad_t) 0; 332aa9caaf6SPeter Wemm 333aa9caaf6SPeter Wemm while ((c = *p++) >= '0' && c <= '9') 334aa9caaf6SPeter Wemm { 335aa9caaf6SPeter Wemm val = (val * 10) + (long)(c - '0'); 336aa9caaf6SPeter Wemm if (val < (quad_t) 0) 337aa9caaf6SPeter Wemm break; 3387a2afe64SJoerg Wunsch } 339aa9caaf6SPeter Wemm if (c) 340aa9caaf6SPeter Wemm error("ulimit: bad number\n"); 341aa9caaf6SPeter Wemm val *= l->factor; 342aa9caaf6SPeter Wemm } 343aa9caaf6SPeter Wemm } 344aa9caaf6SPeter Wemm if (all) { 345aa9caaf6SPeter Wemm for (l = limits; l->name; l++) { 346aa9caaf6SPeter Wemm getrlimit(l->cmd, &limit); 347aa9caaf6SPeter Wemm if (how & SOFT) 348aa9caaf6SPeter Wemm val = limit.rlim_cur; 349aa9caaf6SPeter Wemm else if (how & HARD) 350aa9caaf6SPeter Wemm val = limit.rlim_max; 351aa9caaf6SPeter Wemm 352aa9caaf6SPeter Wemm out1fmt("%-20s ", l->name); 353aa9caaf6SPeter Wemm if (val == RLIM_INFINITY) 354aa9caaf6SPeter Wemm out1fmt("unlimited\n"); 355aa9caaf6SPeter Wemm else 356aa9caaf6SPeter Wemm { 357aa9caaf6SPeter Wemm val /= l->factor; 358aa9caaf6SPeter Wemm out1fmt("%ld\n", (long) val); 3597a2afe64SJoerg Wunsch } 3607a2afe64SJoerg Wunsch } 3617a2afe64SJoerg Wunsch return 0; 3627a2afe64SJoerg Wunsch } 363aa9caaf6SPeter Wemm 364aa9caaf6SPeter Wemm getrlimit(l->cmd, &limit); 365aa9caaf6SPeter Wemm if (set) { 366aa9caaf6SPeter Wemm if (how & SOFT) 367aa9caaf6SPeter Wemm limit.rlim_cur = val; 368aa9caaf6SPeter Wemm if (how & HARD) 369aa9caaf6SPeter Wemm limit.rlim_max = val; 370aa9caaf6SPeter Wemm if (setrlimit(l->cmd, &limit) < 0) 371aa9caaf6SPeter Wemm error("ulimit: bad limit\n"); 372aa9caaf6SPeter Wemm } else { 373aa9caaf6SPeter Wemm if (how & SOFT) 374aa9caaf6SPeter Wemm val = limit.rlim_cur; 375aa9caaf6SPeter Wemm else if (how & HARD) 376aa9caaf6SPeter Wemm val = limit.rlim_max; 377aa9caaf6SPeter Wemm } 378aa9caaf6SPeter Wemm 379aa9caaf6SPeter Wemm if (!set) { 380aa9caaf6SPeter Wemm if (val == RLIM_INFINITY) 381aa9caaf6SPeter Wemm out1fmt("unlimited\n"); 382aa9caaf6SPeter Wemm else 383aa9caaf6SPeter Wemm { 384aa9caaf6SPeter Wemm val /= l->factor; 385aa9caaf6SPeter Wemm out1fmt("%ld\n", (long) val); 386aa9caaf6SPeter Wemm } 387aa9caaf6SPeter Wemm } 388aa9caaf6SPeter Wemm return 0; 389aa9caaf6SPeter Wemm } 390