1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* $NetBSD: options.c,v 1.37 2004/10/30 19:29:27 christos 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[] = "@(#)options.c 8.2 (Berkeley) 5/4/95"; 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project__RCSID("$NetBSD: options.c,v 1.37 2004/10/30 19:29:27 christos 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#include <signal.h> 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "shell.h" 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define DEFINE_OPTIONS 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "options.h" 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef DEFINE_OPTIONS 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "nodes.h" /* for other header files */ 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "eval.h" 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "jobs.h" 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "input.h" 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "output.h" 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "trap.h" 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "var.h" 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "memalloc.h" 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "error.h" 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "mystring.h" 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef SMALL 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "myhistedit.h" 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "show.h" 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *arg0; /* value of $0 */ 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct shparam shellparam; /* current positional parameters */ 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar **argptr; /* argument list for builtin commands */ 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *optionarg; /* set by nextopt (like getopt) */ 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *optptr; /* used by nextopt */ 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *minusc; /* argument to -c option */ 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void options(int); 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void minus_o(char *, int); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void setoption(int, int); 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC int getopts(char *, char *, char **, char ***, char **); 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Process the shell command line arguments. 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectprocargs(int argc, char **argv) 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argptr = argv; 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc > 0) 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argptr++; 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 0; i < NOPTS; i++) 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optlist[i].val = 2; 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project options(1); 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*argptr == NULL && minusc == NULL) 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sflag = 1; 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (iflag == 2 && sflag == 1 && isatty(0) && isatty(1)) 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iflag = 1; 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (mflag == 2) 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mflag = iflag; 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 0; i < NOPTS; i++) 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (optlist[i].val == 2) 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optlist[i].val = 0; 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if DEBUG == 2 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project debug = 1; 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project arg0 = argv[0]; 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sflag == 0 && minusc == NULL) { 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project commandname = argv[0]; 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project arg0 = *argptr++; 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setinputfile(arg0, 0); 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project commandname = arg0; 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* POSIX 1003.2: first arg after -c cmd is $0, remainder $1... */ 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (minusc != NULL) { 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argptr == NULL || *argptr == NULL) 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("Bad -c option"); 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project minusc = *argptr++; 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*argptr != 0) 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project arg0 = *argptr++; 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.p = argptr; 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.reset = 1; 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* assert(shellparam.malloc == 0 && shellparam.nparam == 0); */ 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (*argptr) { 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.nparam++; 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argptr++; 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optschanged(); 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectoptschanged(void) 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setinteractive(iflag); 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef WITH_HISTORY 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project histedit(); 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setjobctl(mflag); 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Process shell options. The global variable argptr contains a pointer 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * to the argument list; we advance it past the options. 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectoptions(int cmdline) 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project static char empty[] = ""; 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p; 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int val; 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int c; 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (cmdline) 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project minusc = NULL; 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while ((p = *argptr) != NULL) { 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argptr++; 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((c = *p++) == '-') { 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = 1; 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p[0] == '\0' || (p[0] == '-' && p[1] == '\0')) { 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!cmdline) { 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* "-" means turn off -x and -v */ 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p[0] == '\0') 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project xflag = vflag = 0; 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* "--" means reset params */ 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (*argptr == NULL) 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setparam(argptr); 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; /* "-" or "--" terminates options */ 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (c == '+') { 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project val = 0; 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argptr--; 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while ((c = *p++) != '\0') { 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c == 'c' && cmdline) { 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* command is after shell args*/ 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project minusc = empty; 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (c == 'o') { 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project minus_o(*argptr, val); 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*argptr) 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argptr++; 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setoption(c, val); 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectset_opt_val(int i, int val) 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int j; 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int flag; 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (val && (flag = optlist[i].opt_set)) { 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* some options (eg vi/emacs) are mutually exclusive */ 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (j = 0; j < NOPTS; j++) 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (optlist[j].opt_set == flag) 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optlist[j].val = 0; 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optlist[i].val = val; 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef DEBUG 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (&optlist[i].val == &debug) 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project opentrace(); 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectminus_o(char *name, int val) 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (name == NULL) { 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1str("Current option settings\n"); 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 0; i < NOPTS; i++) 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("%-16s%s\n", optlist[i].name, 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optlist[i].val ? "on" : "off"); 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 0; i < NOPTS; i++) 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (equal(name, optlist[i].name)) { 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project set_opt_val(i, val); 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("Illegal option -o %s", name); 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsetoption(int flag, int val) 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 0; i < NOPTS; i++) 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (optlist[i].letter == flag) { 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project set_opt_val( i, val ); 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("Illegal option -%c", flag); 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* NOTREACHED */ 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef mkinit 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectINCLUDE "options.h" 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSHELLPROC { 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 0; optlist[i].name; i++) 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optlist[i].val = 0; 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optschanged(); 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Set the shell parameters. 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsetparam(char **argv) 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **newparam; 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **ap; 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int nparam; 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (nparam = 0 ; argv[nparam] ; nparam++); 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ap = newparam = ckmalloc((nparam + 1) * sizeof *ap); 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (*argv) { 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *ap++ = savestr(*argv++); 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *ap = NULL; 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project freeparam(&shellparam); 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.malloc = 1; 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.nparam = nparam; 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.p = newparam; 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.optnext = NULL; 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Free the list of positional parameters. 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfreeparam(volatile struct shparam *param) 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **ap; 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (param->malloc) { 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (ap = param->p ; *ap ; ap++) 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ckfree(*ap); 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ckfree(param->p); 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The shift builtin command. 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectshiftcmd(int argc, char **argv) 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int n; 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **ap1, **ap2; 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n = 1; 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc > 1) 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n = number(argv[1]); 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (n > shellparam.nparam) 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("can't shift that many"); 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTOFF; 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.nparam -= n; 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (ap1 = shellparam.p ; --n >= 0 ; ap1++) { 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (shellparam.malloc) 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ckfree(*ap1); 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ap2 = shellparam.p; 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while ((*ap2++ = *ap1++) != NULL); 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.optnext = NULL; 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTON; 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The set command builtin. 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsetcmd(int argc, char **argv) 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc == 1) 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return showvars(0, 0, 1); 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTOFF; 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project options(0); 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optschanged(); 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*argptr != NULL) { 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setparam(argptr); 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTON; 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectgetoptsreset(value) 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *value; 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (number(value) == 1) { 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.optnext = NULL; 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.reset = 1; 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The getopts builtin. Shellparam.optnext points to the next argument 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * to be processed. Shellparam.optptr points to the next character to 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * be processed in the current argument. If shellparam.optnext is NULL, 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * then it's the first time getopts has been called. 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectgetoptscmd(int argc, char **argv) 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **optbase; 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 3) 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("usage: getopts optstring var [arg]"); 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (argc == 3) 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optbase = shellparam.p; 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optbase = &argv[3]; 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (shellparam.reset == 1) { 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.optnext = optbase; 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.optptr = NULL; 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project shellparam.reset = 0; 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return getopts(argv[1], argv[2], optbase, &shellparam.optnext, 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &shellparam.optptr); 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC int 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectgetopts(char *optstr, char *optvar, char **optfirst, char ***optnext, char **optpptr) 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p, *q; 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char c = '?'; 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int done = 0; 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ind = 0; 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int err = 0; 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char s[12]; 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((p = *optpptr) == NULL || *p == '\0') { 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Current word is done, advance */ 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*optnext == NULL) 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = **optnext; 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p == NULL || *p != '-' || *++p == '\0') { 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectatend: 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ind = *optnext - optfirst + 1; 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *optnext = NULL; 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = NULL; 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project done = 1; 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto out; 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (*optnext)++; 423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p[0] == '-' && p[1] == '\0') /* check for "--" */ 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto atend; 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = *p++; 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (q = optstr; *q != c; ) { 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*q == '\0') { 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (optstr[0] == ':') { 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s[0] = c; 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s[1] = '\0'; 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err |= setvarsafe("OPTARG", s, 0); 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project outfmt(&errout, "Illegal option -%c\n", c); 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (void) unsetvar("OPTARG", 0); 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = '?'; 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto bad; 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*++q == ':') 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project q++; 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*++q == ':') { 446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*p == '\0' && (p = **optnext) == NULL) { 447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (optstr[0] == ':') { 448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s[0] = c; 449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s[1] = '\0'; 450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err |= setvarsafe("OPTARG", s, 0); 451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = ':'; 452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project outfmt(&errout, "No arg for -%c option\n", c); 454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (void) unsetvar("OPTARG", 0); 455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = '?'; 456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto bad; 458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p == **optnext) 461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (*optnext)++; 462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err |= setvarsafe("OPTARG", p, 0); 463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = NULL; 464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else 465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err |= setvarsafe("OPTARG", "", 0); 466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ind = *optnext - optfirst + 1; 467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto out; 468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectbad: 470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ind = 1; 471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *optnext = NULL; 472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = NULL; 473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectout: 474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *optpptr = p; 475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fmtstr(s, sizeof(s), "%d", ind); 476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err |= setvarsafe("OPTIND", s, VNOFUNC); 477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s[0] = c; 478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s[1] = '\0'; 479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err |= setvarsafe(optvar, s, 0); 480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (err) { 481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *optnext = NULL; 482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *optpptr = NULL; 483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flushall(); 484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exraise(EXERROR); 485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return done; 487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * XXX - should get rid of. have all builtins use getopt(3). the 491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * library getopt must have the BSD extension static variable "optreset" 492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * otherwise it can't be used within the shell safely. 493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Standard option processing (a la getopt) for builtin routines. The 495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * only argument that is passed to nextopt is the option string; the 496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * other arguments are unnecessary. It return the character, or '\0' on 497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * end of input. 498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint 501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnextopt(const char *optstring) 502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p; 504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *q; 505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char c; 506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((p = optptr) == NULL || *p == '\0') { 508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = *argptr; 509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p == NULL || *p != '-' || *++p == '\0') 510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return '\0'; 511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argptr++; 512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p[0] == '-' && p[1] == '\0') /* check for "--" */ 513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return '\0'; 514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = *p++; 516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (q = optstring ; *q != c ; ) { 517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*q == '\0') 518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("Illegal option -%c", c); 519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*++q == ':') 520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project q++; 521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*++q == ':') { 523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*p == '\0' && (p = *argptr++) == NULL) 524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("No arg for -%c option", c); 525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optionarg = p; 526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = NULL; 527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project optptr = p; 529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return c; 530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 531