#ifndef __COMMON_H__ #define __COMMON_H__ #include "config.h" #include #include #include #include #include /* gcc specific extension. does nothing on other compilers */ #if defined(__GNUC__) #define ATTRIB(x) __attribute__ (x) #else #define ATTRIB(x) /* no attributes */ #endif extern int common_debug_level; void common_init(void); int common_set_smbnetfs_debug_level(int level); int common_set_log_file(const char *logfile); void common_debug_print(const char *fmt, ...) ATTRIB((format(printf, 1, 2))); void common_print_backtrace(void); static inline int common_get_smbnetfs_debug_level(void){ return g_atomic_int_get(&common_debug_level); } #define DEBUG_PRINT(level, fmt, args...) \ if ((level >= 0) && (level <= common_get_smbnetfs_debug_level())){ \ struct timeval __now; \ gettimeofday(&__now, NULL); \ char __tstamp[20]; \ struct tm __tm; \ localtime_r(&__now.tv_sec, &__tm); \ strftime(__tstamp, 20, "%Y-%m-%d %T", &__tm); \ common_debug_print("%.19s.%03d " fmt, __tstamp, (int)(__now.tv_usec / 1000), ## args); \ } #ifdef PRINTF_DEBUG #include #define DPRINTF(level, fmt, args...) dprintf(fileno(stderr), "%d->%s: " fmt, getpid(), __FUNCTION__, ## args) #else #define DPRINTF(level, fmt, args...) DEBUG_PRINT(level, "%d->%s: " fmt, getpid(), __FUNCTION__, ## args) #endif #endif /* __COMMON_H__ */