Commit | Line | Data |
---|---|---|
15637ed4 RG |
1 | /*- |
2 | * Copyright (c) 1991 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * This code is derived from software contributed to Berkeley by | |
6 | * Kenneth Almquist. | |
7 | * | |
8 | * Redistribution and use in source and binary forms, with or without | |
9 | * modification, are permitted provided that the following conditions | |
10 | * are met: | |
11 | * 1. Redistributions of source code must retain the above copyright | |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * 2. Redistributions in binary form must reproduce the above copyright | |
14 | * notice, this list of conditions and the following disclaimer in the | |
15 | * documentation and/or other materials provided with the distribution. | |
16 | * 3. All advertising materials mentioning features or use of this software | |
17 | * must display the following acknowledgement: | |
18 | * This product includes software developed by the University of | |
19 | * California, Berkeley and its contributors. | |
20 | * 4. Neither the name of the University nor the names of its contributors | |
21 | * may be used to endorse or promote products derived from this software | |
22 | * without specific prior written permission. | |
23 | * | |
24 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
25 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
27 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
30 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
31 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
33 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
34 | * SUCH DAMAGE. | |
35 | * | |
78ed81a3 | 36 | * from: @(#)error.h 5.1 (Berkeley) 3/7/91 |
37 | * error.h,v 1.4 1993/08/01 18:58:32 mycroft Exp | |
15637ed4 RG |
38 | */ |
39 | ||
40 | /* | |
41 | * Types of operations (passed to the errmsg routine). | |
42 | */ | |
43 | ||
44 | #define E_OPEN 01 /* opening a file */ | |
45 | #define E_CREAT 02 /* creating a file */ | |
46 | #define E_EXEC 04 /* executing a program */ | |
47 | ||
48 | ||
49 | /* | |
50 | * We enclose jmp_buf in a structure so that we can declare pointers to | |
51 | * jump locations. The global variable handler contains the location to | |
52 | * jump to when an exception occurs, and the global variable exception | |
53 | * contains a code identifying the exeception. To implement nested | |
54 | * exception handlers, the user should save the value of handler on entry | |
55 | * to an inner scope, set handler to point to a jmploc structure for the | |
56 | * inner scope, and restore handler on exit from the scope. | |
57 | */ | |
58 | ||
59 | #include <setjmp.h> | |
60 | ||
61 | struct jmploc { | |
62 | jmp_buf loc; | |
63 | }; | |
64 | ||
65 | extern struct jmploc *handler; | |
66 | extern int exception; | |
67 | ||
68 | /* exceptions */ | |
69 | #define EXINT 0 /* SIGINT received */ | |
70 | #define EXERROR 1 /* a generic error */ | |
71 | #define EXSHELLPROC 2 /* execute a shell procedure */ | |
72 | ||
73 | ||
74 | /* | |
75 | * These macros allow the user to suspend the handling of interrupt signals | |
76 | * over a period of time. This is similar to SIGHOLD to or sigblock, but | |
77 | * much more efficient and portable. (But hacking the kernel is so much | |
78 | * more fun than worrying about efficiency and portability. :-)) | |
79 | */ | |
80 | ||
81 | extern volatile int suppressint; | |
82 | extern volatile int intpending; | |
83 | extern char *commandname; /* name of command--printed on error */ | |
84 | ||
85 | #define INTOFF suppressint++ | |
86 | #define INTON if (--suppressint == 0 && intpending) onint(); else | |
87 | #define FORCEINTON {suppressint = 0; if (intpending) onint();} | |
88 | #define CLEAR_PENDING_INT intpending = 0 | |
89 | #define int_pending() intpending | |
90 | ||
91 | #ifdef __STDC__ | |
92 | void exraise(int); | |
93 | void onint(void); | |
94 | void error2(char *, char *); | |
95 | void error(char *, ...); | |
96 | char *errmsg(int, int); | |
97 | #else | |
98 | void exraise(); | |
99 | void onint(); | |
100 | void error2(); | |
101 | void error(); | |
102 | char *errmsg(); | |
103 | #endif | |
104 | ||
105 | ||
106 | /* | |
107 | * BSD setjmp saves the signal mask, which violates ANSI C and takes time, | |
108 | * so we use _setjmp instead. | |
109 | */ | |
110 | ||
111 | #ifdef BSD | |
112 | #define setjmp(jmploc) _setjmp(jmploc) | |
113 | #define longjmp(jmploc, val) _longjmp(jmploc, val) | |
114 | #endif |