diff options
author | Andreas Schneider <asn@samba.org> | 2014-07-31 10:18:59 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2014-07-31 18:49:47 +0200 |
commit | 0a3d14248473be3d964d50b75b92a6328b8f82cd (patch) | |
tree | 0ee44394c5df9bc595a5dc0a55ef3249806489d9 /lib | |
parent | 6bbf9fa6df11dd60e6a808cf2e81b88c4e211a90 (diff) | |
download | samba-0a3d14248473be3d964d50b75b92a6328b8f82cd.tar.gz |
uwrap: Add a better logging function.
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/uid_wrapper/uid_wrapper.c | 75 |
1 files changed, 67 insertions, 8 deletions
diff --git a/lib/uid_wrapper/uid_wrapper.c b/lib/uid_wrapper/uid_wrapper.c index 2b8723840a0..eec6d967423 100644 --- a/lib/uid_wrapper/uid_wrapper.c +++ b/lib/uid_wrapper/uid_wrapper.c @@ -56,12 +56,6 @@ #define PRINTF_ATTRIBUTE(a,b) #endif /* HAVE_FUNCTION_ATTRIBUTE_FORMAT */ -#ifdef NDEBUG -#define UWRAP_DEBUG(...) -#else -#define UWRAP_DEBUG(...) fprintf(stderr, __VA_ARGS__) -#endif - #define UWRAP_DLIST_ADD(list,item) do { \ if (!(list)) { \ (item)->prev = NULL; \ @@ -97,6 +91,70 @@ #define SAFE_FREE(x) do { if ((x) != NULL) {free(x); (x)=NULL;} } while(0) #endif +/***************** + * LOGGING + *****************/ + +enum uwrap_dbglvl_e { + UWRAP_LOG_ERROR = 0, + UWRAP_LOG_WARN, + UWRAP_LOG_DEBUG, + UWRAP_LOG_TRACE +}; + +#ifdef NDEBUG +# define UWRAP_LOG(...) +#else /* NDEBUG */ +static void uwrap_log(enum uwrap_dbglvl_e dbglvl, const char *format, ...) PRINTF_ATTRIBUTE(2, 3); +# define UWRAP_LOG(dbglvl, ...) uwrap_log((dbglvl), __VA_ARGS__) + +static void uwrap_log(enum uwrap_dbglvl_e dbglvl, const char *format, ...) +{ + char buffer[1024]; + va_list va; + const char *d; + unsigned int lvl = 0; + + d = getenv("UID_WRAPPER_DEBUGLEVEL"); + if (d != NULL) { + lvl = atoi(d); + } + + va_start(va, format); + vsnprintf(buffer, sizeof(buffer), format, va); + va_end(va); + + if (lvl >= dbglvl) { + switch (dbglvl) { + case UWRAP_LOG_ERROR: + fprintf(stderr, + "UWRAP_ERROR(%d): %s\n", + (int)getpid(), buffer); + break; + case UWRAP_LOG_WARN: + fprintf(stderr, + "UWRAP_WARN(%d): %s\n", + (int)getpid(), buffer); + break; + case UWRAP_LOG_DEBUG: + fprintf(stderr, + "UWRAP_DEBUG(%d): %s\n", + (int)getpid(), buffer); + break; + case UWRAP_LOG_TRACE: + fprintf(stderr, + "UWRAP_TRACE(%d): %s\n", + (int)getpid(), buffer); + break; + } + } +} +#endif /* NDEBUG */ + +/***************** + * LIBC + *****************/ + #define LIBC_NAME "libc.so" struct uwrap_libc_fns { @@ -1117,8 +1175,9 @@ static long int uwrap_syscall (long int sysno, va_list vp) } break; default: - UWRAP_DEBUG("UID_WRAPPER calling non-wrapped syscall " - "%lu\n", sysno); + UWRAP_LOG(UWRAP_LOG_DEBUG, + "UID_WRAPPER calling non-wrapped syscall %lu\n", + sysno); rc = libc_vsyscall(sysno, vp); break; |