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