1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* $NetBSD: miscbltin.c,v 1.34.2.1 2005/04/07 11:34:20 tron Exp $ */ 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*- 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 1991, 1993 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The Regents of the University of California. All rights reserved. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This code is derived from software contributed to Berkeley by 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Kenneth Almquist. 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met: 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * documentation and/or other materials provided with the distribution. 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * may be used to endorse or promote products derived from this software 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * without specific prior written permission. 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE. 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/cdefs.h> 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef lint 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char sccsid[] = "@(#)miscbltin.c 8.4 (Berkeley) 5/4/95"; 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project__RCSID("$NetBSD: miscbltin.c,v 1.34.2.1 2005/04/07 11:34:20 tron Exp $"); 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* not lint */ 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Miscelaneous builtins. 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> /* quad_t */ 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/param.h> /* BSD4_4 */ 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h> 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/time.h> 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/resource.h> 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <ctype.h> 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "shell.h" 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "options.h" 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "var.h" 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "output.h" 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "memalloc.h" 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "error.h" 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "miscbltin.h" 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "mystring.h" 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef rflag 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The read builtin. 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Backslahes escape the next char unless -r is specified. 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This uses unbuffered input, which may be avoidable in some cases. 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Note that if IFS=' :' then read x y should work so that: 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 'a b' x='a', y='b' 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ' a b ' x='a', y='b' 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ':b' x='', y='b' 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ':' x='', y='' 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * '::' x='', y='' 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ': :' x='', y='' 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ':::' x='', y='::' 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ':b c:' x='', y='b c:' 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectreadcmd(int argc, char **argv) 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **ap; 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char c; 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int rflag; 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *prompt; 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *ifs; 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p; 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int startword; 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int status; 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int is_ifs; 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int saveall = 0; 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rflag = 0; 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prompt = NULL; 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while ((i = nextopt("p:r")) != '\0') { 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (i == 'p') 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prompt = optionarg; 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rflag = 1; 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (prompt && isatty(0)) { 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out2str(prompt); 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flushall(); 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*(ap = argptr) == NULL) 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("arg count"); 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((ifs = bltinlookup("IFS", 1)) == NULL) 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ifs = " \t\n"; 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project status = 0; 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startword = 2; 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STARTSTACKSTR(p); 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (;;) { 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (read(0, &c, 1) != 1) { 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project status = 1; 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c == '\0') 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c == '\\' && !rflag) { 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (read(0, &c, 1) != 1) { 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project status = 1; 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c != '\n') 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STPUTC(c, p); 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c == '\n') 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strchr(ifs, c)) 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_ifs = strchr(" \t\n", c) ? 1 : 2; 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_ifs = 0; 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (startword != 0) { 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (is_ifs == 1) { 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Ignore leading IFS whitespace */ 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (saveall) 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STPUTC(c, p); 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (is_ifs == 2 && startword == 1) { 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Only one non-whitespace IFS per word */ 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startword = 2; 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (saveall) 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STPUTC(c, p); 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (is_ifs == 0) { 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* append this character to the current variable */ 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startword = 0; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (saveall) 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Not just a spare terminator */ 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project saveall++; 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STPUTC(c, p); 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* end of variable... */ 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startword = is_ifs; 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ap[1] == NULL) { 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Last variable needs all IFS chars */ 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project saveall++; 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STPUTC(c, p); 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STACKSTRNUL(p); 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setvar(*ap, stackblock(), 0); 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ap++; 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STARTSTACKSTR(p); 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STACKSTRNUL(p); 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Remove trailing IFS chars */ 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (; stackblock() <= --p; *p = 0) { 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strchr(ifs, *p)) 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strchr(" \t\n", *p)) 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Always remove whitespace */ 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (saveall > 1) 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Don't remove non-whitespace unless it was naked */ 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setvar(*ap, stackblock(), 0); 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Set any remaining args to "" */ 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (*++ap != NULL) 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setvar(*ap, nullstr, 0); 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return status; 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectumaskcmd(int argc, char **argv) 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *ap; 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int mask; 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int symbolic_mode = 0; 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while ((i = nextopt("S")) != '\0') { 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project symbolic_mode = 1; 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTOFF; 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mask = umask(0); 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project umask(mask); 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTON; 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((ap = *argptr) == NULL) { 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (symbolic_mode) { 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char u[4], g[4], o[4]; 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project i = 0; 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((mask & S_IRUSR) == 0) 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u[i++] = 'r'; 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((mask & S_IWUSR) == 0) 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u[i++] = 'w'; 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((mask & S_IXUSR) == 0) 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u[i++] = 'x'; 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u[i] = '\0'; 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project i = 0; 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((mask & S_IRGRP) == 0) 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g[i++] = 'r'; 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((mask & S_IWGRP) == 0) 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g[i++] = 'w'; 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((mask & S_IXGRP) == 0) 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g[i++] = 'x'; 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g[i] = '\0'; 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project i = 0; 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((mask & S_IROTH) == 0) 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project o[i++] = 'r'; 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((mask & S_IWOTH) == 0) 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project o[i++] = 'w'; 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((mask & S_IXOTH) == 0) 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project o[i++] = 'x'; 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project o[i] = '\0'; 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("u=%s,g=%s,o=%s\n", u, g, o); 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("%.4o\n", mask); 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (isdigit((unsigned char)*ap)) { 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mask = 0; 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*ap >= '8' || *ap < '0') 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("Illegal number: %s", argv[1]); 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mask = (mask << 3) + (*ap - '0'); 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (*++ap != '\0'); 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project umask(mask); 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("Illegal mode: %s", ap); 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 1 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ulimit builtin 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This code, originally by Doug Gwyn, Doug Kingston, Eric Gisin, and 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Michael Rendell was ripped from pdksh 5.0.8 and hacked for use with 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ash by J.T. Conklin. 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Public domain. 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct limits { 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name; 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int cmd; 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int factor; /* multiply by to get rlim_{cur,max} values */ 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char option; 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const struct limits limits[] = { 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_CPU 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "time(seconds)", RLIMIT_CPU, 1, 't' }, 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_FSIZE 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "file(blocks)", RLIMIT_FSIZE, 512, 'f' }, 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_DATA 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "data(kbytes)", RLIMIT_DATA, 1024, 'd' }, 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_STACK 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "stack(kbytes)", RLIMIT_STACK, 1024, 's' }, 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_CORE 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "coredump(blocks)", RLIMIT_CORE, 512, 'c' }, 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_RSS 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "memory(kbytes)", RLIMIT_RSS, 1024, 'm' }, 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_MEMLOCK 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "locked memory(kbytes)", RLIMIT_MEMLOCK, 1024, 'l' }, 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_NPROC 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "process(processes)", RLIMIT_NPROC, 1, 'p' }, 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_NOFILE 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "nofiles(descriptors)", RLIMIT_NOFILE, 1, 'n' }, 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_VMEM 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "vmemory(kbytes)", RLIMIT_VMEM, 1024, 'v' }, 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_SWAP 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "swap(kbytes)", RLIMIT_SWAP, 1024, 'w' }, 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef RLIMIT_SBSIZE 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "sbsize(bytes)", RLIMIT_SBSIZE, 1, 'b' }, 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { (char *) 0, 0, 0, '\0' } 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectulimitcmd(int argc, char **argv) 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int c; 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rlim_t val = 0; 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project enum { SOFT = 0x1, HARD = 0x2 } 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project how = SOFT | HARD; 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const struct limits *l; 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int set, all = 0; 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int optc, what; 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct rlimit limit; 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project what = 'f'; 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while ((optc = nextopt("HSabtfdsmcnpl")) != '\0') 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (optc) { 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'H': 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project how = HARD; 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'S': 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project how = SOFT; 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'a': 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project all = 1; 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project what = optc; 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (l = limits; l->name && l->option != what; l++) 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ; 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!l->name) 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("internal error (%c)", what); 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project set = *argptr ? 1 : 0; 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (set) { 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p = *argptr; 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (all || argptr[1]) 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("too many arguments"); 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strcmp(p, "unlimited") == 0) 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = RLIM_INFINITY; 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = (rlim_t) 0; 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while ((c = *p++) >= '0' && c <= '9') 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = (val * 10) + (long)(c - '0'); 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((long)val < 0) 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c) 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("bad number"); 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val *= l->factor; 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (all) { 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (l = limits; l->name; l++) { 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project getrlimit(l->cmd, &limit); 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (how & SOFT) 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = limit.rlim_cur; 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (how & HARD) 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = limit.rlim_max; 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("%-20s ", l->name); 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (val == RLIM_INFINITY) 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("unlimited\n"); 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val /= l->factor; 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef BSD4_4 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("%lld\n", (long long) val); 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("%ld\n", (long) val); 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project getrlimit(l->cmd, &limit); 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (set) { 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (how & HARD) 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project limit.rlim_max = val; 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (how & SOFT) 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project limit.rlim_cur = val; 423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (setrlimit(l->cmd, &limit) < 0) 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("error setting limit (%s)", strerror(errno)); 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (how & SOFT) 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = limit.rlim_cur; 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (how & HARD) 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = limit.rlim_max; 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (val == RLIM_INFINITY) 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("unlimited\n"); 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val /= l->factor; 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef BSD4_4 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("%lld\n", (long long) val); 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("%ld\n", (long) val); 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 446