Annotation of embedaddon/sudo/include/sudo_debug.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (c) 2011 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_DEBUG_H
! 18: #define _SUDO_DEBUG_H
! 19:
! 20: #include <stdarg.h>
! 21:
! 22: /*
! 23: * The priority and subsystem are encoded in a single 32-bit value.
! 24: * The lower 4 bits are the priority and the top 26 bits are the subsystem.
! 25: * This allows for 16 priorities and a very large number of subsystems.
! 26: * Bit 5 is used as a flag to specify whether to log the errno value.
! 27: * Bit 6 specifies whether to log the function, file and line number data.
! 28: */
! 29:
! 30: /*
! 31: * Sudo debug priorities, ordered least to most verbose,
! 32: * in other words, highest to lowest priority. Max pri is 15.
! 33: * Note: order must match sudo_debug_priorities[]
! 34: */
! 35: #define SUDO_DEBUG_CRIT 1 /* critical errors */
! 36: #define SUDO_DEBUG_ERROR 2 /* non-critical errors */
! 37: #define SUDO_DEBUG_WARN 3 /* non-fatal warnings */
! 38: #define SUDO_DEBUG_NOTICE 4 /* non-error condition notices */
! 39: #define SUDO_DEBUG_DIAG 5 /* diagnostic messages */
! 40: #define SUDO_DEBUG_INFO 6 /* informational message */
! 41: #define SUDO_DEBUG_TRACE 7 /* log function enter/exit */
! 42: #define SUDO_DEBUG_DEBUG 8 /* very verbose debugging */
! 43:
! 44: /*
! 45: * Sudo debug subsystems.
! 46: * This includes subsystems in the sudoers plugin.
! 47: * Note: order must match sudo_debug_subsystems[]
! 48: */
! 49: #define SUDO_DEBUG_MAIN ( 1<<6) /* sudo main() */
! 50: #define SUDO_DEBUG_ARGS ( 2<<6) /* command line argument processing */
! 51: #define SUDO_DEBUG_EXEC ( 3<<6) /* command execution */
! 52: #define SUDO_DEBUG_PTY ( 4<<6) /* pseudo-tty */
! 53: #define SUDO_DEBUG_UTMP ( 5<<6) /* utmp file ops */
! 54: #define SUDO_DEBUG_CONV ( 6<<6) /* user conversation */
! 55: #define SUDO_DEBUG_PCOMM ( 7<<6) /* plugin communications */
! 56: #define SUDO_DEBUG_UTIL ( 8<<6) /* utility functions */
! 57: #define SUDO_DEBUG_NETIF ( 9<<6) /* network interface functions */
! 58: #define SUDO_DEBUG_AUDIT (10<<6) /* audit */
! 59: #define SUDO_DEBUG_EDIT (11<<6) /* sudoedit */
! 60: #define SUDO_DEBUG_SELINUX (12<<6) /* selinux */
! 61: #define SUDO_DEBUG_LDAP (13<<6) /* sudoers LDAP */
! 62: #define SUDO_DEBUG_MATCH (14<<6) /* sudoers matching */
! 63: #define SUDO_DEBUG_PARSER (15<<6) /* sudoers parser */
! 64: #define SUDO_DEBUG_ALIAS (16<<6) /* sudoers alias functions */
! 65: #define SUDO_DEBUG_DEFAULTS (17<<6) /* sudoers defaults settings */
! 66: #define SUDO_DEBUG_AUTH (18<<6) /* authentication functions */
! 67: #define SUDO_DEBUG_ENV (19<<6) /* environment handling */
! 68: #define SUDO_DEBUG_LOGGING (20<<6) /* logging functions */
! 69: #define SUDO_DEBUG_NSS (21<<6) /* network service switch */
! 70: #define SUDO_DEBUG_RBTREE (22<<6) /* red-black tree functions */
! 71: #define SUDO_DEBUG_PERMS (23<<6) /* uid/gid swapping functions */
! 72: #define SUDO_DEBUG_PLUGIN (24<<6) /* main plugin functions */
! 73: #define SUDO_DEBUG_HOOKS (25<<6) /* hook functions */
! 74: #define SUDO_DEBUG_ALL 0xfff0 /* all subsystems */
! 75:
! 76: /* Flag to include string version of errno in debug info. */
! 77: #define SUDO_DEBUG_ERRNO (1<<4)
! 78:
! 79: /* Flag to include function, file and line number in debug info. */
! 80: #define SUDO_DEBUG_LINENO (1<<5)
! 81:
! 82: /* Extract priority and convert to an index. */
! 83: #define SUDO_DEBUG_PRI(n) (((n) & 0xf) - 1)
! 84:
! 85: /* Extract subsystem and convert to an index. */
! 86: #define SUDO_DEBUG_SUBSYS(n) (((n) >> 6) - 1)
! 87:
! 88: /*
! 89: * Wrapper for sudo_debug_enter() that declares __func__ as needed
! 90: * and sets sudo_debug_subsys for sudo_debug_exit().
! 91: */
! 92: #ifdef HAVE___FUNC__
! 93: # define debug_decl(funcname, subsys) \
! 94: const int sudo_debug_subsys = (subsys); \
! 95: sudo_debug_enter(__func__, __FILE__, __LINE__, sudo_debug_subsys);
! 96: #else
! 97: # define debug_decl(funcname, subsys) \
! 98: const int sudo_debug_subsys = (subsys); \
! 99: const char *__func__ = #funcname; \
! 100: sudo_debug_enter(__func__, __FILE__, __LINE__, sudo_debug_subsys);
! 101: #endif
! 102:
! 103: /*
! 104: * Wrappers for sudo_debug_exit() and friends.
! 105: */
! 106: #define debug_return \
! 107: do { \
! 108: sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); \
! 109: return; \
! 110: } while (0)
! 111:
! 112: #define debug_return_int(rval) \
! 113: do { \
! 114: int sudo_debug_rval = (rval); \
! 115: sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, \
! 116: sudo_debug_rval); \
! 117: return sudo_debug_rval; \
! 118: } while (0)
! 119:
! 120: #define debug_return_size_t(rval) \
! 121: do { \
! 122: size_t sudo_debug_rval = (rval); \
! 123: sudo_debug_exit_size_t(__func__, __FILE__, __LINE__, sudo_debug_subsys,\
! 124: sudo_debug_rval); \
! 125: return sudo_debug_rval; \
! 126: } while (0)
! 127:
! 128: #define debug_return_long(rval) \
! 129: do { \
! 130: long sudo_debug_rval = (rval); \
! 131: sudo_debug_exit_long(__func__, __FILE__, __LINE__, sudo_debug_subsys, \
! 132: sudo_debug_rval); \
! 133: return sudo_debug_rval; \
! 134: } while (0)
! 135:
! 136: #define debug_return_bool(rval) \
! 137: do { \
! 138: int sudo_debug_rval = (rval); \
! 139: sudo_debug_exit_bool(__func__, __FILE__, __LINE__, sudo_debug_subsys, \
! 140: sudo_debug_rval); \
! 141: return sudo_debug_rval; \
! 142: } while (0)
! 143:
! 144: #define debug_return_str(rval) \
! 145: do { \
! 146: const char *sudo_debug_rval = (rval); \
! 147: sudo_debug_exit_str(__func__, __FILE__, __LINE__, sudo_debug_subsys, \
! 148: sudo_debug_rval); \
! 149: return (char *)sudo_debug_rval; \
! 150: } while (0)
! 151:
! 152: #define debug_return_str_masked(rval) \
! 153: do { \
! 154: const char *sudo_debug_rval = (rval); \
! 155: sudo_debug_exit_str_masked(__func__, __FILE__, __LINE__, \
! 156: sudo_debug_subsys, sudo_debug_rval); \
! 157: return (char *)sudo_debug_rval; \
! 158: } while (0)
! 159:
! 160: #define debug_return_ptr(rval) \
! 161: do { \
! 162: const void *sudo_debug_rval = (rval); \
! 163: sudo_debug_exit_ptr(__func__, __FILE__, __LINE__, sudo_debug_subsys, \
! 164: sudo_debug_rval); \
! 165: return (void *)sudo_debug_rval; \
! 166: } while (0)
! 167:
! 168: /*
! 169: * Variadic macros are a C99 feature but GNU cpp has supported
! 170: * a (different) version of them for a long time.
! 171: */
! 172: #if defined(__GNUC__) && __GNUC__ == 2
! 173: # define sudo_debug_printf(pri, fmt...) \
! 174: sudo_debug_printf2(__func__, __FILE__, __LINE__, (pri)|sudo_debug_subsys, \
! 175: (fmt))
! 176: #else
! 177: # define sudo_debug_printf(pri, ...) \
! 178: sudo_debug_printf2(__func__, __FILE__, __LINE__, (pri)|sudo_debug_subsys, \
! 179: __VA_ARGS__)
! 180: #endif
! 181:
! 182: #define sudo_debug_execve(pri, path, argv, envp) \
! 183: sudo_debug_execve2((pri)|sudo_debug_subsys, (path), (argv), (envp))
! 184:
! 185: /*
! 186: * NULL-terminated string lists of priorities and subsystems.
! 187: */
! 188: extern const char *const sudo_debug_priorities[];
! 189: extern const char *const sudo_debug_subsystems[];
! 190:
! 191: void sudo_debug_enter(const char *func, const char *file, int line, int subsys);
! 192: void sudo_debug_execve2(int level, const char *path, char *const argv[], char *const envp[]);
! 193: void sudo_debug_exit(const char *func, const char *file, int line, int subsys);
! 194: void sudo_debug_exit_int(const char *func, const char *file, int line, int subsys, int rval);
! 195: void sudo_debug_exit_long(const char *func, const char *file, int line, int subsys, long rval);
! 196: void sudo_debug_exit_size_t(const char *func, const char *file, int line, int subsys, size_t rval);
! 197: void sudo_debug_exit_bool(const char *func, const char *file, int line, int subsys, int rval);
! 198: void sudo_debug_exit_str(const char *func, const char *file, int line, int subsys, const char *rval);
! 199: void sudo_debug_exit_str_masked(const char *func, const char *file, int line, int subsys, const char *rval);
! 200: void sudo_debug_exit_ptr(const char *func, const char *file, int line, int subsys, const void *rval);
! 201: int sudo_debug_fd_set(int fd);
! 202: int sudo_debug_init(const char *debugfile, const char *settings);
! 203: void sudo_debug_printf2(const char *func, const char *file, int line, int level, const char *format, ...) __printflike(5, 6);
! 204: void sudo_debug_write(const char *str, int len, int errno_val);
! 205: void sudo_debug_write2(const char *func, const char *file, int line, const char *str, int len, int errno_val);
! 206: pid_t sudo_debug_fork(void);
! 207:
! 208: #endif /* _SUDO_DEBUG_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>