Line data Source code
1 : /*
2 : * Copyright (c) 2015 Cisco and/or its affiliates.
3 : * Licensed under the Apache License, Version 2.0 (the "License");
4 : * you may not use this file except in compliance with the License.
5 : * You may obtain a copy of the License at:
6 : *
7 : * http://www.apache.org/licenses/LICENSE-2.0
8 : *
9 : * Unless required by applicable law or agreed to in writing, software
10 : * distributed under the License is distributed on an "AS IS" BASIS,
11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : * See the License for the specific language governing permissions and
13 : * limitations under the License.
14 : */
15 : /*
16 : Copyright (c) 2001, 2002, 2003 Eliot Dresselhaus
17 :
18 : Permission is hereby granted, free of charge, to any person obtaining
19 : a copy of this software and associated documentation files (the
20 : "Software"), to deal in the Software without restriction, including
21 : without limitation the rights to use, copy, modify, merge, publish,
22 : distribute, sublicense, and/or sell copies of the Software, and to
23 : permit persons to whom the Software is furnished to do so, subject to
24 : the following conditions:
25 :
26 : The above copyright notice and this permission notice shall be
27 : included in all copies or substantial portions of the Software.
28 :
29 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30 : EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31 : MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32 : NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33 : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34 : OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35 : WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 : */
37 :
38 : #ifndef included_error_h
39 : #define included_error_h
40 :
41 : #include <vppinfra/clib.h> /* for CLIB_LINUX_KERNEL */
42 : #include <vppinfra/error_bootstrap.h>
43 :
44 : #ifdef CLIB_UNIX
45 : #include <errno.h>
46 : #endif
47 :
48 : #ifdef CLIB_LINUX_KERNEL
49 : #include <linux/errno.h>
50 : #endif
51 :
52 : #include <stdarg.h>
53 : #include <vppinfra/vec.h>
54 :
55 : /* Callback functions for error reporting. */
56 : typedef void clib_error_handler_func_t (void *arg, u8 * msg, int msg_len);
57 : void clib_error_register_handler (clib_error_handler_func_t func, void *arg);
58 :
59 : #define clib_warning(format,args...) \
60 : _clib_error (CLIB_ERROR_WARNING, clib_error_function, __LINE__, format, ## args)
61 :
62 : #define clib_error(format,args...) \
63 : _clib_error (CLIB_ERROR_FATAL, clib_error_function, __LINE__, format, ## args)
64 :
65 : #define clib_unix_error(format,args...) \
66 : _clib_error (CLIB_ERROR_FATAL | CLIB_ERROR_ERRNO_VALID, clib_error_function, __LINE__, format, ## args)
67 :
68 : #define clib_unix_warning(format,args...) \
69 : _clib_error (CLIB_ERROR_WARNING | CLIB_ERROR_ERRNO_VALID, clib_error_function, __LINE__, format, ## args)
70 :
71 : /* For programming errors and assert. */
72 : #define clib_panic(format,args...) \
73 : _clib_error (CLIB_ERROR_ABORT, (char *) clib_error_function, __LINE__, format, ## args)
74 :
75 : #include <vppinfra/clib_error.h>
76 :
77 : #define clib_error_get_code(err) ((err) ? (err)->code : 0)
78 : #define clib_error_set_code(err, c) \
79 : do { \
80 : if (err) \
81 : (err)->code = (c); \
82 : } while (0)
83 :
84 : extern void *clib_error_free_vector (clib_error_t * errors);
85 :
86 : #define clib_error_free(e) e = clib_error_free_vector(e)
87 :
88 : extern clib_error_t *_clib_error_return (clib_error_t *errors, any code,
89 : uword flags, const char *where,
90 : const char *fmt, ...);
91 :
92 : #define clib_error_return_code(e,code,flags,args...) \
93 : _clib_error_return((e),(code),(flags),(char *)clib_error_function,args)
94 :
95 : #define clib_error_create(args...) \
96 : clib_error_return_code(0,0,0,args)
97 :
98 : #define clib_error_return(e,args...) \
99 : clib_error_return_code(e,0,0,args)
100 :
101 : #define clib_error_return_unix(e,args...) \
102 : clib_error_return_code(e,errno,CLIB_ERROR_ERRNO_VALID,args)
103 :
104 : #define clib_error_return_fatal(e,args...) \
105 : clib_error_return_code(e,0,CLIB_ERROR_FATAL,args)
106 :
107 : #define clib_error_return_unix_fatal(e,args...) \
108 : clib_error_return_code(e,errno,CLIB_ERROR_ERRNO_VALID|CLIB_ERROR_FATAL,args)
109 :
110 : extern clib_error_t *_clib_error_report (clib_error_t * errors);
111 :
112 : #define clib_error_report(e) do { (e) = _clib_error_report (e); } while (0)
113 :
114 : u8 *format_clib_error (u8 * s, va_list * va);
115 :
116 : always_inline word
117 501 : unix_error_is_fatal (word error)
118 : {
119 : #ifdef CLIB_UNIX
120 501 : switch (error)
121 : {
122 501 : case EWOULDBLOCK:
123 : case EINTR:
124 501 : return 0;
125 : }
126 : #endif
127 0 : return 1;
128 : }
129 :
130 : #define IF_ERROR_IS_FATAL_RETURN_ELSE_FREE(e) \
131 : do { \
132 : if (e) \
133 : { \
134 : if (unix_error_is_fatal (clib_error_get_code (e))) \
135 : return (e); \
136 : else \
137 : clib_error_free (e); \
138 : } \
139 : } while (0)
140 :
141 : #define ERROR_RETURN_IF(x) \
142 : do { \
143 : clib_error_t * _error_return_if = (x); \
144 : if (_error_return_if) \
145 : return clib_error_return (_error_return_if, 0); \
146 : } while (0)
147 :
148 : #define ERROR_ASSERT(truth) \
149 : ({ \
150 : clib_error_t * _error_assert = 0; \
151 : if (CLIB_DEBUG > 0 && ! (truth)) \
152 : { \
153 : _error_assert = clib_error_return_fatal \
154 : (0, "%s:%d (%s) assertion `%s' fails", \
155 : __FILE__, \
156 : (uword) __LINE__, \
157 : clib_error_function, \
158 : # truth); \
159 : } \
160 : _error_assert; \
161 : })
162 :
163 : /* Assert to remain even if CLIB_DEBUG is set to 0. */
164 : #define CLIB_ERROR_ASSERT(truth) \
165 : ({ \
166 : clib_error_t * _error_assert = 0; \
167 : if (! (truth)) \
168 : { \
169 : _error_assert = \
170 : clib_error_return_fatal \
171 : (0, "%s:%d (%s) assertion `%s' fails", \
172 : __FILE__, \
173 : (uword) __LINE__, \
174 : clib_error_function, \
175 : # truth); \
176 : } \
177 : _error_assert; \
178 : })
179 :
180 : /*
181 : * If we're running under Coverity, don't die on
182 : * failed static assertions.
183 : */
184 : #ifdef __COVERITY__
185 : #ifndef _Static_assert
186 : #define _Static_assert(x,y)
187 : #endif
188 : #endif
189 :
190 : #endif /* included_error_h */
191 :
192 : /*
193 : * fd.io coding-style-patch-verification: ON
194 : *
195 : * Local Variables:
196 : * eval: (c-set-style "gnu")
197 : * End:
198 : */
|