14b88c807SRodney W. Grimes /*- 24b88c807SRodney W. Grimes * Copyright (c) 1991, 1993 34b88c807SRodney W. Grimes * The Regents of the University of California. All rights reserved. 44b88c807SRodney W. Grimes * 54b88c807SRodney W. Grimes * This code is derived from software contributed to Berkeley by 64b88c807SRodney W. Grimes * Kenneth Almquist. 74b88c807SRodney W. Grimes * 84b88c807SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 94b88c807SRodney W. Grimes * modification, are permitted provided that the following conditions 104b88c807SRodney W. Grimes * are met: 114b88c807SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 124b88c807SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 134b88c807SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 144b88c807SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 154b88c807SRodney W. Grimes * documentation and/or other materials provided with the distribution. 164b88c807SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 174b88c807SRodney W. Grimes * must display the following acknowledgement: 184b88c807SRodney W. Grimes * This product includes software developed by the University of 194b88c807SRodney W. Grimes * California, Berkeley and its contributors. 204b88c807SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 214b88c807SRodney W. Grimes * may be used to endorse or promote products derived from this software 224b88c807SRodney W. Grimes * without specific prior written permission. 234b88c807SRodney W. Grimes * 244b88c807SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 254b88c807SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 264b88c807SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 274b88c807SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 284b88c807SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 294b88c807SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 304b88c807SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 314b88c807SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 324b88c807SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 334b88c807SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 344b88c807SRodney W. Grimes * SUCH DAMAGE. 354b88c807SRodney W. Grimes * 36aa9caaf6SPeter Wemm * @(#)error.h 8.2 (Berkeley) 5/4/95 377a8e920bSMartin Cracauer * $Id: error.h,v 1.7 1997/02/22 13:58:23 peter Exp $ 384b88c807SRodney W. Grimes */ 394b88c807SRodney W. Grimes 404b88c807SRodney W. Grimes /* 414b88c807SRodney W. Grimes * Types of operations (passed to the errmsg routine). 424b88c807SRodney W. Grimes */ 434b88c807SRodney W. Grimes 444b88c807SRodney W. Grimes #define E_OPEN 01 /* opening a file */ 454b88c807SRodney W. Grimes #define E_CREAT 02 /* creating a file */ 464b88c807SRodney W. Grimes #define E_EXEC 04 /* executing a program */ 474b88c807SRodney W. Grimes 484b88c807SRodney W. Grimes 494b88c807SRodney W. Grimes /* 504b88c807SRodney W. Grimes * We enclose jmp_buf in a structure so that we can declare pointers to 514b88c807SRodney W. Grimes * jump locations. The global variable handler contains the location to 524b88c807SRodney W. Grimes * jump to when an exception occurs, and the global variable exception 534b88c807SRodney W. Grimes * contains a code identifying the exeception. To implement nested 544b88c807SRodney W. Grimes * exception handlers, the user should save the value of handler on entry 554b88c807SRodney W. Grimes * to an inner scope, set handler to point to a jmploc structure for the 564b88c807SRodney W. Grimes * inner scope, and restore handler on exit from the scope. 574b88c807SRodney W. Grimes */ 584b88c807SRodney W. Grimes 594b88c807SRodney W. Grimes #include <setjmp.h> 607a8e920bSMartin Cracauer #include <signal.h> 614b88c807SRodney W. Grimes 624b88c807SRodney W. Grimes struct jmploc { 634b88c807SRodney W. Grimes jmp_buf loc; 644b88c807SRodney W. Grimes }; 654b88c807SRodney W. Grimes 664b88c807SRodney W. Grimes extern struct jmploc *handler; 674b88c807SRodney W. Grimes extern int exception; 684b88c807SRodney W. Grimes 694b88c807SRodney W. Grimes /* exceptions */ 704b88c807SRodney W. Grimes #define EXINT 0 /* SIGINT received */ 714b88c807SRodney W. Grimes #define EXERROR 1 /* a generic error */ 724b88c807SRodney W. Grimes #define EXSHELLPROC 2 /* execute a shell procedure */ 73ab0a2172SSteve Price #define EXEXEC 3 /* command execution failed */ 744b88c807SRodney W. Grimes 754b88c807SRodney W. Grimes 764b88c807SRodney W. Grimes /* 774b88c807SRodney W. Grimes * These macros allow the user to suspend the handling of interrupt signals 784b88c807SRodney W. Grimes * over a period of time. This is similar to SIGHOLD to or sigblock, but 794b88c807SRodney W. Grimes * much more efficient and portable. (But hacking the kernel is so much 804b88c807SRodney W. Grimes * more fun than worrying about efficiency and portability. :-)) 814b88c807SRodney W. Grimes */ 824b88c807SRodney W. Grimes 837a8e920bSMartin Cracauer extern volatile sig_atomic_t suppressint; 847a8e920bSMartin Cracauer extern volatile sig_atomic_t intpending; 854b88c807SRodney W. Grimes extern char *commandname; /* name of command--printed on error */ 864b88c807SRodney W. Grimes 874b88c807SRodney W. Grimes #define INTOFF suppressint++ 88aa9caaf6SPeter Wemm #define INTON { if (--suppressint == 0 && intpending) onint(); } 894b88c807SRodney W. Grimes #define FORCEINTON {suppressint = 0; if (intpending) onint();} 904b88c807SRodney W. Grimes #define CLEAR_PENDING_INT intpending = 0 914b88c807SRodney W. Grimes #define int_pending() intpending 924b88c807SRodney W. Grimes 93aa9caaf6SPeter Wemm void exraise __P((int)); 94aa9caaf6SPeter Wemm void onint __P((void)); 95aa9caaf6SPeter Wemm void error __P((char *, ...)); 96ab0a2172SSteve Price void exerror __P((int, char *, ...)); 97aa9caaf6SPeter Wemm char *errmsg __P((int, int)); 984b88c807SRodney W. Grimes 994b88c807SRodney W. Grimes 1004b88c807SRodney W. Grimes /* 1014b88c807SRodney W. Grimes * BSD setjmp saves the signal mask, which violates ANSI C and takes time, 1024b88c807SRodney W. Grimes * so we use _setjmp instead. 1034b88c807SRodney W. Grimes */ 1044b88c807SRodney W. Grimes 1054b88c807SRodney W. Grimes #ifdef BSD 1064b88c807SRodney W. Grimes #define setjmp(jmploc) _setjmp(jmploc) 1074b88c807SRodney W. Grimes #define longjmp(jmploc, val) _longjmp(jmploc, val) 1084b88c807SRodney W. Grimes #endif 109