]>
Commit | Line | Data |
---|---|---|
71aad674 A |
1 | /*- |
2 | * Copyright (c) 1991, 1993 | |
3 | * The Regents of the University of California. 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. | |
254f12f7 | 16 | * 3. Neither the name of the University nor the names of its contributors |
71aad674 A |
17 | * may be used to endorse or promote products derived from this software |
18 | * without specific prior written permission. | |
19 | * | |
20 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
21 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
22 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
23 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
24 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
25 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
26 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
27 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
28 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
29 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
30 | * SUCH DAMAGE. | |
31 | * | |
32 | * @(#)error.h 8.2 (Berkeley) 5/4/95 | |
254f12f7 | 33 | * $FreeBSD: head/bin/sh/error.h 319591 2017-06-04 21:58:02Z jilles $ |
71aad674 A |
34 | */ |
35 | ||
36 | /* | |
37 | * We enclose jmp_buf in a structure so that we can declare pointers to | |
38 | * jump locations. The global variable handler contains the location to | |
39 | * jump to when an exception occurs, and the global variable exception | |
40 | * contains a code identifying the exception. To implement nested | |
41 | * exception handlers, the user should save the value of handler on entry | |
42 | * to an inner scope, set handler to point to a jmploc structure for the | |
43 | * inner scope, and restore handler on exit from the scope. | |
44 | */ | |
45 | ||
46 | #include <setjmp.h> | |
47 | #include <signal.h> | |
48 | ||
49 | struct jmploc { | |
50 | jmp_buf loc; | |
51 | }; | |
52 | ||
53 | extern struct jmploc *handler; | |
54 | extern volatile sig_atomic_t exception; | |
55 | ||
56 | /* exceptions */ | |
57 | #define EXINT 0 /* SIGINT received */ | |
58 | #define EXERROR 1 /* a generic error */ | |
59 | #define EXEXEC 2 /* command execution failed */ | |
60 | #define EXEXIT 3 /* call exitshell(exitstatus) */ | |
61 | ||
62 | ||
63 | /* | |
64 | * These macros allow the user to suspend the handling of interrupt signals | |
65 | * over a period of time. This is similar to SIGHOLD to or sigblock, but | |
66 | * much more efficient and portable. (But hacking the kernel is so much | |
67 | * more fun than worrying about efficiency and portability. :-)) | |
68 | */ | |
69 | ||
70 | extern volatile sig_atomic_t suppressint; | |
71 | extern volatile sig_atomic_t intpending; | |
72 | ||
73 | #define INTOFF suppressint++ | |
74 | #define INTON { if (--suppressint == 0 && intpending) onint(); } | |
75 | #define is_int_on() suppressint | |
254f12f7 | 76 | #define SETINTON(s) do { suppressint = (s); if (suppressint == 0 && intpending) onint(); } while (0) |
71aad674 A |
77 | #define FORCEINTON {suppressint = 0; if (intpending) onint();} |
78 | #define SET_PENDING_INT intpending = 1 | |
79 | #define CLEAR_PENDING_INT intpending = 0 | |
80 | #define int_pending() intpending | |
81 | ||
82 | void exraise(int) __dead2; | |
83 | void onint(void) __dead2; | |
84 | void warning(const char *, ...) __printflike(1, 2); | |
85 | void error(const char *, ...) __printf0like(1, 2) __dead2; | |
86 | void exerror(int, const char *, ...) __printf0like(2, 3) __dead2; | |
87 | ||
88 | ||
89 | /* | |
90 | * BSD setjmp saves the signal mask, which violates ANSI C and takes time, | |
91 | * so we use _setjmp instead. | |
92 | */ | |
93 | ||
94 | #define setjmp(jmploc) _setjmp(jmploc) | |
95 | #define longjmp(jmploc, val) _longjmp(jmploc, val) |