#ifndef _FUMIGATE_ #define _FUMIGATE_ #include <time.h> #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/time.h> #include <unistd.h> #define dassert(x) do { if(!(x)) { \ struct timeval tv; struct tm tm; time_t now; \ time(&now); localtime_r(&now, &tm); gettimeofday(&tv, NULL); \ fprintf(stderr, "%02d%02d%02d.%08d:%5d %s (%s:%d] failed assertion '%s'\n", \ tm.tm_hour, tm.tm_min, tm.tm_sec, (int)tv.tv_usec, getpid(), __FUNCTION__, \ __FILE__, __LINE__, #x); abort(); } } while(0) #define dperror(x) do { if(x) { \ struct timeval tv; struct tm tm; time_t now; \ time(&now); localtime_r(&now, &tm); gettimeofday(&tv, NULL); \ fprintf(stderr, "%02d%02d%02d.%08d:%5d %s (%s:%d] '%s' failed with '%s'\n", \ tm.tm_hour, tm.tm_min, tm.tm_sec, (int)tv.tv_usec, getpid(), __FUNCTION__, \ __FILE__, __LINE__, #x, strerror(errno)); abort(); } } while(0) /* DEBUG only error messages */ #ifdef DEBUG /* debug test: * if the first argument `test' evaluates as false, * the rest of the arguments are passed to fprintf */ #define dtest(test, args...) \ do { if (!test) { \ fprintf(stderr, "%5d %s (%s:%d)] ", getpid(), __FUNCTION__, __FILE__, __LINE__); \ fprintf(stderr, args); \ fprintf(stderr, "\n"); \ }} while(0) /* debug print * prints arguments */ #define dprintk(args...) \ do { \ struct timeval __tv; struct tm __tm; time_t __now; \ time(&__now); localtime_r(&__now, &__tm); gettimeofday(&__tv, NULL); \ fprintf(stderr, "%02d%02d%02d.%08d:%5d %s (%s:%d)] ", \ __tm.tm_hour, __tm.tm_min, __tm.tm_sec, (int)__tv.tv_usec, getpid(), __FUNCTION__, \ __FILE__, __LINE__); \ fprintf(stderr, args); \ fprintf(stderr, "\n"); \ } while(0) #define bhexdump(buffer, size) \ do { \ struct timeval tv; struct tm tm; time_t now; \ int my__count; unsigned char *my__buffer = (unsigned char *)buffer; \ time(&now); localtime_r(&now, &tm); gettimeofday(&tv, NULL); \ fprintf(stderr, "%02d%02d%02d.%08d:%5d %s (%s:%d)] buffer %s at %p len %d ", \ tm.tm_hour, tm.tm_min, tm.tm_sec, (int)tv.tv_usec, getpid(), __FUNCTION__, \ __FILE__, __LINE__, #buffer, buffer, size); \ for(my__count = 0; my__count < size; my__count++) { \ fprintf(stderr, "%02x ", my__buffer[my__count]); \ if(my__count && my__count % 16 == 15) fprintf(stderr, "\n\t"); \ } \ fprintf(stderr, "\n"); \ } while(0) #else #define dtest(args...) #define dprintk(args...) #define dhexdump(args...) #endif /* DEBUG */ #define printk(args...) \ do { \ struct timeval tv; struct tm tm; time_t now; \ time(&now); localtime_r(&now, &tm); gettimeofday(&tv, NULL); \ fprintf(stderr, "%02d%02d%02d.%08d:%5d %s (%s:%d)] ", \ tm.tm_hour, tm.tm_min, tm.tm_sec, (int)tv.tv_usec, getpid(), __FUNCTION__, \ __FILE__, __LINE__); \ fprintf(stderr, args); \ fprintf(stderr, "\n"); \ } while(0) #define IF_FAIL_ERRNO(condition, args...) \ do { \ if (!(condition)) { \ fprintf(stderr, "%s (%s:%d)] ", __FUNCTION__, __FILE__, __LINE__); \ fprintf(stderr, args); \ fprintf(stderr, ": "); \ perror(NULL); \ abort(); \ }} while (0) #define handle_errno(x) if((x)<0) do { fprintf(stderr, "%s (%s:%d)] %s\n", __FUNCTION__, __FILE__, __LINE__, strerror(errno)); abort(); } while(0) #endif /* !_FUMIGATE_ */