43 #ifdef CLIB_LINUX_KERNEL 44 #include <linux/unistd.h> 45 #include <linux/kernel.h> 54 #ifdef CLIB_STANDALONE 55 #include <vppinfra/standalone_stdio.h> 96 for (i = 0; i <
vec_len (handlers); i++)
97 handlers[i].func (handlers[i].arg, msg, vec_len (msg));
100 if (vec_len (handlers) == 0)
101 os_puts (msg, vec_len (msg), 1);
106 void _clib_error (
int how_to_die,
107 char * function_name,
116 msg =
format (msg,
"%s:", function_name);
118 msg =
format (msg,
"%wd:", line_number);
128 msg =
format (msg,
": %s (errno %d)", strerror (errno), errno);
155 word errno_save = errno;
203 where =
format (where,
"from ");
206 s =
format (s,
"%v: ", where);
237 static error_t * foo1 (
int x)
239 return error_return (0,
"x is odd %d", x);
242 static error_t * foo2 (
int x)
244 return error_return (0,
"x is even %d", x);
247 static error_t * foo (
int x)
255 return error_return (e, 0);
258 static void error_handler (
void * arg,
char * msg,
int msg_len)
260 write (2, msg, msg_len);
263 int main (
int argc,
char * argv[])
267 register_error_handler (error_handler, 0);
sll srl srl sll sra u16x4 i
void * clib_error_free_vector(clib_error_t *errors)
void os_puts(u8 *string, uword length, uword is_error)
u8 * format_clib_error(u8 *s, va_list *va)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
void clib_error_handler_func_t(void *arg, u8 *msg, int msg_len)
#define vec_end(v)
End (last data address) of vector.
static void error_exit(int code)
#define vec_free(V)
Free vector's memory (no header).
#define clib_error_free(e)
clib_error_handler_func_t * func
void clib_error_register_handler(clib_error_handler_func_t func, void *arg)
static void debugger(void)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
#define vec_foreach(var, vec)
Vector iterator.
static u8 * dispatch_message(u8 *msg)
CLIB vectors are ubiquitous dynamically resized arrays with by user defined "headers".