error.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* $NetBSD: error.c,v 1.31 2003/08/07 09:05:30 agc 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[] = "@(#)error.c 8.2 (Berkeley) 5/4/95"; 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project__RCSID("$NetBSD: error.c,v 1.31 2003/08/07 09:05:30 agc 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 * Errors and exceptions. 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <signal.h> 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "shell.h" 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "main.h" 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "options.h" 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "output.h" 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "error.h" 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "show.h" 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define signal bsd_signal 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Code to handle exceptions in C. 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct jmploc *handler; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint exception; 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvolatile int suppressint; 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvolatile int intpending; 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *commandname; 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void exverror(int, const char *, va_list) 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project __attribute__((__noreturn__)); 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Called to raise an exception. Since C doesn't include exceptions, we 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * just do a longjmp to the exception handler. The type of exception is 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * stored in the global variable "exception". 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectexraise(int e) 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (handler == NULL) 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project abort(); 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exception = e; 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project longjmp(handler->loc, 1); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Called from trap.c when a SIGINT is received. (If the user specifies 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * that SIGINT is to be trapped or ignored using the trap builtin, then 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * this routine is not called.) Suppressint is nonzero when interrupts 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are held using the INTOFF macro. The call to _exit is necessary because 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * there is a short period after a fork before the signal handlers are 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * set to the appropriate value for the child. (The test for iflag is 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * just defensive programming.) 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectonint(void) 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sigset_t nsigset; 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (suppressint) { 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project intpending = 1; 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project intpending = 0; 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sigemptyset(&nsigset); 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sigprocmask(SIG_SETMASK, &nsigset, NULL); 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (rootshell && iflag) 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exraise(EXINT); 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project signal(SIGINT, SIG_DFL); 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project raise(SIGINT); 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* NOTREACHED */ 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectexvwarning(int sv_errno, const char *msg, va_list ap) 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Partially emulate line buffered output so that: 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * printf '%d\n' 1 a 2 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * and 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * printf '%d %d %d\n' 1 a 2 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * both generate sensible text when stdout and stderr are merged. 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (output.nextc != output.buf && output.nextc[-1] == '\n') 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flushout(&output); 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (commandname) 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project outfmt(&errout, "%s: ", commandname); 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (msg != NULL) { 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project doformat(&errout, msg, ap); 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sv_errno >= 0) 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project outfmt(&errout, ": "); 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sv_errno >= 0) 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project outfmt(&errout, "%s", strerror(sv_errno)); 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out2c('\n'); 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flushout(&errout); 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Exverror is called to raise the error exception. If the second argument 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * is not NULL then error prints an error message using printf style 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * formatting. It then raises the error exception. 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectexverror(int cond, const char *msg, va_list ap) 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CLEAR_PENDING_INT; 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTOFF; 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef DEBUG 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (msg) { 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project TRACE(("exverror(%d, \"", cond)); 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project TRACEV((msg, ap)); 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project TRACE(("\") pid=%d\n", getpid())); 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project TRACE(("exverror(%d, NULL) pid=%d\n", cond, getpid())); 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (msg) 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exvwarning(-1, msg, ap); 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flushall(); 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exraise(cond); 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* NOTREACHED */ 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecterror(const char *msg, ...) 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, msg); 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exverror(EXERROR, msg, ap); 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* NOTREACHED */ 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectexerror(int cond, const char *msg, ...) 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, msg); 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exverror(cond, msg, ap); 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* NOTREACHED */ 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * error/warning routines for external builtins 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsh_exit(int rval) 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exerrno = rval & 255; 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exraise(EXEXEC); 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsh_err(int status, const char *fmt, ...) 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exvwarning(errno, fmt, ap); 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sh_exit(status); 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsh_verr(int status, const char *fmt, va_list ap) 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exvwarning(errno, fmt, ap); 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sh_exit(status); 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsh_errx(int status, const char *fmt, ...) 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exvwarning(-1, fmt, ap); 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sh_exit(status); 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsh_verrx(int status, const char *fmt, va_list ap) 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exvwarning(-1, fmt, ap); 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sh_exit(status); 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsh_warn(const char *fmt, ...) 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exvwarning(errno, fmt, ap); 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsh_vwarn(const char *fmt, va_list ap) 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exvwarning(errno, fmt, ap); 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsh_warnx(const char *fmt, ...) 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exvwarning(-1, fmt, ap); 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsh_vwarnx(const char *fmt, va_list ap) 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exvwarning(-1, fmt, ap); 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Table of error messages. 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct errname { 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project short errcode; /* error number */ 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project short action; /* operation which encountered the error */ 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *msg; /* text describing the error */ 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ALL (E_OPEN|E_CREAT|E_EXEC) 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC const struct errname errormsg[] = { 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EINTR, ALL, "interrupted" }, 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EACCES, ALL, "permission denied" }, 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EIO, ALL, "I/O error" }, 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EEXIST, ALL, "file exists" }, 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOENT, E_OPEN, "no such file" }, 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOENT, E_CREAT,"directory nonexistent" }, 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOENT, E_EXEC, "not found" }, 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOTDIR, E_OPEN, "no such file" }, 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOTDIR, E_CREAT,"directory nonexistent" }, 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOTDIR, E_EXEC, "not found" }, 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EISDIR, ALL, "is a directory" }, 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef EMFILE 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EMFILE, ALL, "too many open files" }, 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENFILE, ALL, "file table overflow" }, 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOSPC, ALL, "file system full" }, 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef EDQUOT 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EDQUOT, ALL, "disk quota exceeded" }, 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef ENOSR 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOSR, ALL, "no streams resources" }, 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENXIO, ALL, "no such device or address" }, 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EROFS, ALL, "read-only file system" }, 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ETXTBSY, ALL, "text busy" }, 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef EAGAIN 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EAGAIN, E_EXEC, "not enough memory" }, 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOMEM, ALL, "not enough memory" }, 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef ENOLINK 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ENOLINK, ALL, "remote access failed" }, 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef EMULTIHOP 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { EMULTIHOP, ALL, "remote access failed" }, 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef ECOMM 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ECOMM, ALL, "remote access failed" }, 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef ESTALE 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ESTALE, ALL, "remote access failed" }, 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef ETIMEDOUT 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ETIMEDOUT, ALL, "remote access failed" }, 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef ELOOP 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ELOOP, ALL, "symbolic link loop" }, 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { E2BIG, E_EXEC, "argument list too long" }, 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef ELIBACC 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { ELIBACC, E_EXEC, "shared library missing" }, 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0, 0, NULL }, 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Return a string describing an error. The returned string may be a 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * pointer to a static buffer that will be overwritten on the next call. 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Action describes the operation that got the error. 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectconst char * 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecterrmsg(int e, int action) 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct errname const *ep; 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project static char buf[12]; 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (ep = errormsg ; ep->errcode ; ep++) { 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ep->errcode == e && (ep->action & action) != 0) 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ep->msg; 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fmtstr(buf, sizeof buf, "error %d", e); 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return buf; 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 367