Annotation of embedaddon/sudo/include/fatal.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (c) 2004, 2010-2013 Todd C. Miller <Todd.Miller@courtesan.com>
! 3: *
! 4: * Permission to use, copy, modify, and distribute this software for any
! 5: * purpose with or without fee is hereby granted, provided that the above
! 6: * copyright notice and this permission notice appear in all copies.
! 7: *
! 8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 15: */
! 16:
! 17: #ifndef _SUDO_FATAL_H_
! 18: #define _SUDO_FATAL_H_
! 19:
! 20: #include <stdarg.h>
! 21: #include <setjmp.h>
! 22:
! 23: /*
! 24: * We wrap fatal/fatalx and warning/warningx so that the same output can
! 25: * go to the debug file, if there is one.
! 26: */
! 27: #if defined(SUDO_ERROR_WRAP) && SUDO_ERROR_WRAP == 0
! 28: # if defined(__GNUC__) && __GNUC__ == 2
! 29: # define fatal(fmt...) fatal_nodebug(fmt)
! 30: # define fatalx(fmt...) fatalx_nodebug(fmt)
! 31: # define warning(fmt...) warning_nodebug(fmt)
! 32: # define warningx(fmt...) warningx_nodebug(fmt)
! 33: # else
! 34: # define fatal(...) fatal_nodebug(__VA_ARGS__)
! 35: # define fatalx(...) fatalx_nodebug(__VA_ARGS__)
! 36: # define warning(...) warning_nodebug(__VA_ARGS__)
! 37: # define warningx(...) warningx_nodebug(__VA_ARGS__)
! 38: # endif /* __GNUC__ == 2 */
! 39: # define vfatal(fmt, ap) fatal_nodebug((fmt), (ap))
! 40: # define vfatalx(fmt, ap) fatalx_nodebug((fmt), (ap))
! 41: # define vwarning(fmt, ap) warning_nodebug((fmt), (ap))
! 42: # define vwarningx(fmt, ap) warningx_nodebug((fmt), (ap))
! 43: #else /* SUDO_ERROR_WRAP */
! 44: # if defined(__GNUC__) && __GNUC__ == 2
! 45: # define fatal(fmt...) do { \
! 46: sudo_debug_printf2(__func__, __FILE__, __LINE__, \
! 47: SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
! 48: fmt); \
! 49: fatal_nodebug(fmt); \
! 50: } while (0)
! 51: # define fatalx(fmt...) do { \
! 52: sudo_debug_printf2(__func__, __FILE__, __LINE__, \
! 53: SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \
! 54: fatalx_nodebug(fmt); \
! 55: } while (0)
! 56: # define warning(fmt...) do { \
! 57: sudo_debug_printf2(__func__, __FILE__, __LINE__, \
! 58: SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
! 59: fmt); \
! 60: warning_nodebug(fmt); \
! 61: } while (0)
! 62: # define warningx(fmt...) do { \
! 63: sudo_debug_printf2(__func__, __FILE__, __LINE__, \
! 64: SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \
! 65: warningx_nodebug(fmt); \
! 66: } while (0)
! 67: # else
! 68: # define fatal(...) do { \
! 69: sudo_debug_printf2(__func__, __FILE__, __LINE__, \
! 70: SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
! 71: __VA_ARGS__); \
! 72: fatal_nodebug(__VA_ARGS__); \
! 73: } while (0)
! 74: # define fatalx(...) do { \
! 75: sudo_debug_printf2(__func__, __FILE__, __LINE__, \
! 76: SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \
! 77: fatalx_nodebug(__VA_ARGS__); \
! 78: } while (0)
! 79: # define warning(...) do { \
! 80: sudo_debug_printf2(__func__, __FILE__, __LINE__, \
! 81: SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
! 82: __VA_ARGS__); \
! 83: warning_nodebug(__VA_ARGS__); \
! 84: } while (0)
! 85: # define warningx(...) do { \
! 86: sudo_debug_printf2(__func__, __FILE__, __LINE__, \
! 87: SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \
! 88: warningx_nodebug(__VA_ARGS__); \
! 89: } while (0)
! 90: # endif /* __GNUC__ == 2 */
! 91: # define vfatal(fmt, ap) do { \
! 92: sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
! 93: SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
! 94: (fmt), (ap)); \
! 95: vfatal_nodebug((fmt), (ap)); \
! 96: } while (0)
! 97: # define vfatalx(fmt, ap) do { \
! 98: sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
! 99: SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), (ap)); \
! 100: vfatalx_nodebug((fmt), (ap)); \
! 101: } while (0)
! 102: # define vwarning(fmt, ap) do { \
! 103: sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
! 104: SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
! 105: (fmt), (ap)); \
! 106: vwarning_nodebug((fmt), (ap)); \
! 107: warning_restore_locale(); \
! 108: } while (0)
! 109: # define vwarningx(fmt, ap) do { \
! 110: sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
! 111: SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), (ap)); \
! 112: vwarningx_nodebug((fmt), (ap)); \
! 113: } while (0)
! 114: #endif /* SUDO_ERROR_WRAP */
! 115:
! 116: #if defined(__GNUC__) && __GNUC__ == 2
! 117: # define fatal_nodebug(fmt...) do { \
! 118: warning_set_locale(); \
! 119: fatal2(fmt); \
! 120: } while (0)
! 121: # define fatalx_nodebug(fmt...) do { \
! 122: warning_set_locale(); \
! 123: fatalx2(fmt); \
! 124: } while (0)
! 125: # define warning_nodebug(fmt...) do { \
! 126: warning_set_locale(); \
! 127: warning2(fmt); \
! 128: warning_restore_locale(); \
! 129: } while (0)
! 130: # define warningx_nodebug(fmt...) do { \
! 131: warning_set_locale(); \
! 132: warningx2(fmt); \
! 133: warning_restore_locale(); \
! 134: } while (0)
! 135: #else
! 136: # define fatal_nodebug(...) do { \
! 137: warning_set_locale(); \
! 138: fatal2(__VA_ARGS__); \
! 139: } while (0)
! 140: # define fatalx_nodebug(...) do { \
! 141: warning_set_locale(); \
! 142: fatalx2(__VA_ARGS__); \
! 143: } while (0)
! 144: # define warning_nodebug(...) do { \
! 145: warning_set_locale(); \
! 146: warning2(__VA_ARGS__); \
! 147: warning_restore_locale(); \
! 148: } while (0)
! 149: # define warningx_nodebug(...) do { \
! 150: warning_set_locale(); \
! 151: warningx2(__VA_ARGS__); \
! 152: warning_restore_locale(); \
! 153: } while (0)
! 154: #endif /* __GNUC__ == 2 */
! 155: #define vfatal_nodebug(fmt, ap) do { \
! 156: warning_set_locale(); \
! 157: vfatal2((fmt), (ap)); \
! 158: } while (0)
! 159: #define vfatalx_nodebug(fmt, ap) do { \
! 160: warning_set_locale(); \
! 161: vfatalx2((fmt), (ap)); \
! 162: } while (0)
! 163: #define vwarning_nodebug(fmt, ap) do { \
! 164: warning_set_locale(); \
! 165: vwarning2((fmt), (ap)); \
! 166: warning_restore_locale(); \
! 167: } while (0)
! 168: #define vwarningx_nodebug(fmt, ap) do { \
! 169: warning_set_locale(); \
! 170: vwarningx2((fmt), (ap)); \
! 171: warning_restore_locale(); \
! 172: } while (0)
! 173:
! 174: #define fatal_setjmp() (fatal_enable_setjmp(), sigsetjmp(fatal_jmp, 1))
! 175: #define fatal_longjmp(val) siglongjmp(fatal_jmp, val)
! 176:
! 177: extern int (*sudo_printf)(int msg_type, const char *fmt, ...);
! 178: extern sigjmp_buf fatal_jmp;
! 179:
! 180: int fatal_callback_register(void (*func)(void));
! 181: void fatal_disable_setjmp(void);
! 182: void fatal_enable_setjmp(void);
! 183: void fatal2(const char *, ...) __printf0like(1, 2) __attribute__((__noreturn__));
! 184: void fatalx2(const char *, ...) __printflike(1, 2) __attribute__((__noreturn__));
! 185: void vfatal2(const char *, va_list ap) __printf0like(1, 0) __attribute__((__noreturn__));
! 186: void vfatalx2(const char *, va_list ap) __printflike(1, 0) __attribute__((__noreturn__));
! 187: void warning2(const char *, ...) __printf0like(1, 2);
! 188: void warningx2(const char *, ...) __printflike(1, 2);
! 189: void vwarning2(const char *, va_list ap) __printf0like(1, 0);
! 190: void vwarningx2(const char *, va_list ap) __printflike(1, 0);
! 191: void warning_set_locale(void);
! 192: void warning_restore_locale(void);
! 193:
! 194: #endif /* _SUDO_FATAL_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>