| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #ifndef _FRR_FERR_H |
| #define _FRR_FERR_H |
| |
| |
| |
| |
| |
| #include <stdint.h> |
| #include <limits.h> |
| #include <errno.h> |
| |
| #include "vty.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| typedef int ferr_r; |
| |
| |
| enum ferr_kind { |
| |
| FERR_OK = 0, |
| |
| |
| |
| |
| FERR_CODE_BUG, |
| |
| |
| |
| |
| |
| FERR_CONFIG_INVALID, |
| |
| |
| |
| |
| |
| |
| FERR_CONFIG_REALITY, |
| |
| |
| |
| FERR_RESOURCE, |
| |
| |
| FERR_SYSTEM, |
| |
| |
| |
| FERR_LIBRARY, |
| }; |
| |
| struct ferr { |
| |
| const char *file; |
| const char *func; |
| int line; |
| |
| enum ferr_kind kind; |
| |
| |
| |
| |
| |
| |
| uint32_t unique_id; |
| |
| char message[384]; |
| |
| |
| int errno_val; |
| |
| char pathname[PATH_MAX]; |
| }; |
| |
| |
| #define BABEL_FERR_START 0x01000001 |
| #define BABEL_FRRR_END 0x01FFFFFF |
| #define BGP_FERR_START 0x02000001 |
| #define BGP_FERR_END 0x02FFFFFF |
| #define EIGRP_FERR_START 0x03000001 |
| #define EIGRP_FERR_END 0x03FFFFFF |
| #define ISIS_FERR_START 0x04000001 |
| #define ISIS_FERR_END 0x04FFFFFF |
| #define LDP_FERR_START 0x05000001 |
| #define LDP_FERR_END 0x05FFFFFF |
| #define LIB_FERR_START 0x06000001 |
| #define LIB_FERR_END 0x06FFFFFF |
| #define NHRP_FERR_START 0x07000001 |
| #define NHRP_FERR_END 0x07FFFFFF |
| #define OSPF_FERR_START 0x08000001 |
| #define OSPF_FERR_END 0x08FFFFFF |
| #define OSPFV3_FERR_START 0x09000001 |
| #define OSPFV3_FERR_END 0x09FFFFFF |
| #define PBR_FERR_START 0x0A000001 |
| #define PBR_FERR_END 0x0AFFFFFF |
| #define PIM_FERR_START 0x0B000001 |
| #define PIM_FERR_STOP 0x0BFFFFFF |
| #define RIP_FERR_START 0x0C000001 |
| #define RIP_FERR_STOP 0x0CFFFFFF |
| #define RIPNG_FERR_START 0x0D000001 |
| #define RIPNG_FERR_STOP 0x0DFFFFFF |
| #define SHARP_FERR_START 0x0E000001 |
| #define SHARP_FERR_END 0x0EFFFFFF |
| #define VTYSH_FERR_START 0x0F000001 |
| #define VTYSH_FRR_END 0x0FFFFFFF |
| #define WATCHFRR_FERR_START 0x10000001 |
| #define WATCHFRR_FERR_END 0x10FFFFFF |
| #define ZEBRA_FERR_START 0xF1000001 |
| #define ZEBRA_FERR_END 0xF1FFFFFF |
| #define END_FERR 0xFFFFFFFF |
| |
| struct log_ref { |
| |
| |
| uint32_t code; |
| |
| const char *title; |
| |
| const char *description; |
| |
| const char *suggestion; |
| }; |
| |
| void log_ref_add(struct log_ref *ref); |
| struct log_ref *log_ref_get(uint32_t code); |
| void log_ref_display(struct vty *vty, uint32_t code, bool json); |
| |
| |
| |
| |
| |
| void log_ref_init(void); |
| void log_ref_fini(void); |
| void log_ref_vty_init(void); |
| |
| |
| |
| |
| |
| |
| |
| const struct ferr *ferr_get_last(ferr_r errval); |
| |
| |
| |
| |
| |
| ferr_r ferr_clear(void); |
| |
| |
| ferr_r ferr_set_internal(const char *file, int line, const char *func, |
| enum ferr_kind kind, const char *text, ...); |
| ferr_r ferr_set_internal_ext(const char *file, int line, const char *func, |
| enum ferr_kind kind, const char *pathname, |
| int errno_val, const char *text, ...); |
| |
| #define ferr_ok() 0 |
| |
| |
| |
| |
| |
| |
| |
| |
| #define ferr_code_bug(...) \ |
| ferr_set_internal(__FILE__, __LINE__, __func__, FERR_CODE_BUG, \ |
| __VA_ARGS__) |
| #define ferr_cfg_invalid(...) \ |
| ferr_set_internal(__FILE__, __LINE__, __func__, FERR_CONFIG_INVALID, \ |
| __VA_ARGS__) |
| #define ferr_cfg_reality(...) \ |
| ferr_set_internal(__FILE__, __LINE__, __func__, FERR_CONFIG_REALITY, \ |
| __VA_ARGS__) |
| #define ferr_cfg_resource(...) \ |
| ferr_set_internal(__FILE__, __LINE__, __func__, FERR_RESOURCE, \ |
| __VA_ARGS__) |
| #define ferr_system(...) \ |
| ferr_set_internal(__FILE__, __LINE__, __func__, FERR_SYSTEM, \ |
| __VA_ARGS__) |
| #define ferr_library(...) \ |
| ferr_set_internal(__FILE__, __LINE__, __func__, FERR_LIBRARY, \ |
| __VA_ARGS__) |
| |
| |
| #define ferr_system_errno(...) \ |
| ferr_set_internal_ext(__FILE__, __LINE__, __func__, FERR_SYSTEM, NULL, \ |
| errno, __VA_ARGS__) |
| #define ferr_system_path_errno(path, ...) \ |
| ferr_set_internal_ext(__FILE__, __LINE__, __func__, FERR_SYSTEM, path, \ |
| errno, __VA_ARGS__) |
| |
| #include "vty.h" |
| |
| void vty_print_error(struct vty *vty, ferr_r err, const char *msg, ...); |
| |
| #define CMD_FERR_DO(func, action, ...) \ |
| do { \ |
| ferr_r cmd_retval = func; \ |
| if (cmd_retval) { \ |
| vty_print_error(vty, cmd_retval, __VA_ARGS__); \ |
| action; \ |
| } \ |
| } while (0) |
| |
| #define CMD_FERR_RETURN(func, ...) \ |
| CMD_FERR_DO(func, return CMD_WARNING_CONFIG_FAILED, __VA_ARGS__) |
| #define CMD_FERR_GOTO(func, label, ...) \ |
| CMD_FERR_DO(func, goto label, __VA_ARGS__) |
| |
| |
| #ifdef THIS_IS_AN_EXAMPLE |
| ferr_r foo_bar_set(struct object *obj, int bar) |
| { |
| if (bar < 1 || bar >= 100) |
| return ferr_config_invalid("bar setting (%d) must be 0<x<100", |
| bar); |
| obj->bar = bar; |
| if (ioctl(obj->fd, bar)) |
| return ferr_system_errno("couldn't set bar to %d", bar); |
| |
| return ferr_ok(); |
| } |
| |
| DEFUN("bla") |
| { |
| CMD_FERR_RETURN(foo_bar_set(obj, atoi(argv[1])), |
| "command failed: $ERR\n"); |
| return CMD_SUCCESS; |
| } |
| |
| #endif |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |