#include <limits.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include <ctype.h>
#include <math.h>
#include <sysexits.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/time.h>
#define DEV
static char *log_level_names[] = {
"ERROR",
"WARN",
"INFO",
"L3",
"L4",
"L5",
"L6",
"L7",
"DEBUG",
"DEBUGEXT"
};
int g_log_level = 10;
int logfd;
const char *get_log_level_name(int log_level)
{
return log_level_names[log_level];
}
void tlog(int level, const char *file, int line, const char *fun, const char *fmt, ...)
{
va_list args;
if (level > g_log_level)
return;
char timebuf[64] = "error?";
struct tm ct;
struct timeval tv = {0, 0};
gettimeofday(&tv, NULL);
localtime_r(&tv.tv_sec, &ct);
if (logfd <= 0)
return;
char logline[2048];
strftime(timebuf
, sizeof(timebuf
), "%H:%M:%S", &ct
);
if (fun)
snprintf(logline
, sizeof(logline
) - 1, "[%s.%06lu] %s:%d:%s [%s] ", timebuf
, tv.
tv_usec, file
, line
, fun
, get_log_level_name
(level
)); else
snprintf(logline
, sizeof(logline
) - 1, "[%s.%06lu] [%s] ", timebuf
, tv.
tv_usec, get_log_level_name
(level
));
int line_len
= strlen(logline
);
vsnprintf(logline + line_len, sizeof(logline) - line_len - 2, fmt, args);
logline[line_len++] = '\n';
/* Disable the warning locally */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-result"
write(logfd, logline, line_len);
#pragma GCC diagnostic pop
}
#ifndef __FILENAME__
#define __FILENAME__ __FILE__
#endif
#define LDEBUGEX 9
#define LDEBUG 8
#define LINFO 2
#define LWARN 1
#define LERROR 0
#define LOGL(level, fmt, ...) tlog(level, __FILENAME__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__)
#define LOG(fmt, ...) LOGL(LINFO, fmt, ##__VA_ARGS__)
#define LOG_S(fmt, ...) slog(__FILENAME__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__)
#define GI2P(x) GINT_TO_POINTER((x))
#define GP2I(x) GPOINTER_TO_INT((x))
#define DO_PRAGMA(x) _Pragma(#x)
#define TODO(x) DO_PRAGMA(message "TODO: " #x)
#define DEBUGEX(fmt, ...) LOGL(LDEBUGEX, fmt, ##__VA_ARGS__)
#define DEBUG(fmt, ...) LOGL(LDEBUG, fmt, ##__VA_ARGS__)
#define INFO(fmt, ...) LOGL(LINFO, fmt, ##__VA_ARGS__)
#define ERR(exit_code, fmt, ...) \
do { \
char *err_str = strerror(errno);\
LOGL(LERROR, fmt ": %s", ##__VA_ARGS__, err_str); \
exit(exit_code); \
} while (0)
#define ERRX(exit_code, fmt, ...) \
do { \
LOGL(LERROR, fmt, ##__VA_ARGS__); \
exit(exit_code); \
} while (0)
#define WARN(fmt, ...) \
do { \
char *err_str = strerror(errno);\
LOGL(LWARN, fmt": [%d] %s", ##__VA_ARGS__, errno, err_str); \
} while (0)
#define WARNX(fmt, ...) \
do { \
LOGL(LWARN, fmt, ##__VA_ARGS__); \
} while (0)
#ifdef DEV
#define mfree(p) {DEBUGEX("FREE: [%#lX]", p); free((p));}
#define mfree_s(p) {LOG_S("*** [DEBUG] FREE: [%#lX]", (p)); free((p));}
#define mmalloc(size) ({void *_nptr_ = malloc((size)); DEBUGEX("MALLOC: [%#lX], size %ld", _nptr_, (size)); _nptr_; })
#define mcalloc(nmemb, size) ({void *_nptr_ = calloc((nmemb), (size)); DEBUGEX("CALLOC: [%#lX], nmemb %ld, size %ld", _nptr_, (nmemb), (size)); _nptr_; })
#define mrealloc(ptr, size) ({ void *_nptr_; DEBUGEX("REALLOC before: [%#lX]", (ptr)); \
_nptr_ = realloc((ptr), (size)); DEBUGEX("REALLOC after: [%#lX], size [%ld]", _nptr_, (size)); _nptr_; })
#else
#define mfree(p) free((p))
#define mfree_s(p) free((p))
#define mmalloc(size) malloc((size))
#define mcalloc(nmemb, size) calloc((nmemb), (size))
#define mrealloc(ptr, size) realloc((ptr), (size))
#endif
#define nmemb 1
#define size 32
int main()
{
logfd = STDOUT_FILENO;
void *_nptr_
= calloc((nmemb
), (size
)); LOGL(LDEBUGEX, "CALLOC: %#lX nmemb %ld, size %ld", _nptr_, (nmemb), (size));
return 0;
}
I2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzeXNleGl0cy5oPgojaW5jbHVkZSA8ZGlyZW50Lmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CgojZGVmaW5lIERFVgoKc3RhdGljIGNoYXIgKmxvZ19sZXZlbF9uYW1lc1tdID0gewogICAgIkVSUk9SIiwKICAgICJXQVJOIiwKICAgICJJTkZPIiwKICAgICJMMyIsCiAgICAiTDQiLAogICAgIkw1IiwKICAgICJMNiIsCiAgICAiTDciLAogICAgIkRFQlVHIiwKICAgICJERUJVR0VYVCIKfTsKCmludCBnX2xvZ19sZXZlbCA9IDEwOwppbnQgbG9nZmQ7Cgpjb25zdCBjaGFyICpnZXRfbG9nX2xldmVsX25hbWUoaW50IGxvZ19sZXZlbCkKewogICAgcmV0dXJuIGxvZ19sZXZlbF9uYW1lc1tsb2dfbGV2ZWxdOwp9Cgp2b2lkIHRsb2coaW50IGxldmVsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKewogICAgdmFfbGlzdCBhcmdzOwoKICAgIGlmIChsZXZlbCA+IGdfbG9nX2xldmVsKQogICAgICAgIHJldHVybjsKCiAgICBjaGFyIHRpbWVidWZbNjRdID0gImVycm9yPyI7CiAgICBzdHJ1Y3QgdG0gY3Q7CiAgICBzdHJ1Y3QgdGltZXZhbCB0diA9IHswLCAwfTsKCiAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKICAgIGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZjdCk7CgogICAgaWYgKGxvZ2ZkIDw9IDApCiAgICAgICAgcmV0dXJuOwoKICAgIGNoYXIgbG9nbGluZVsyMDQ4XTsKCiAgICBzdHJmdGltZSh0aW1lYnVmLCBzaXplb2YodGltZWJ1ZiksICIlSDolTTolUyIsICZjdCk7CgogICAgaWYgKGZ1bikKICAgICAgICBzbnByaW50Zihsb2dsaW5lLCBzaXplb2YobG9nbGluZSkgLSAxLCAiWyVzLiUwNmx1XSAlczolZDolcyBbJXNdICIsIHRpbWVidWYsIHR2LnR2X3VzZWMsIGZpbGUsIGxpbmUsIGZ1biwgZ2V0X2xvZ19sZXZlbF9uYW1lKGxldmVsKSk7CiAgICBlbHNlCiAgICAgICAgc25wcmludGYobG9nbGluZSwgc2l6ZW9mKGxvZ2xpbmUpIC0gMSwgIlslcy4lMDZsdV0gWyVzXSAiLCB0aW1lYnVmLCB0di50dl91c2VjLCBnZXRfbG9nX2xldmVsX25hbWUobGV2ZWwpKTsKCiAgICBpbnQgbGluZV9sZW4gPSBzdHJsZW4obG9nbGluZSk7CgogICAgdmFfc3RhcnQoYXJncywgZm10KTsKICAgIHZzbnByaW50Zihsb2dsaW5lICsgbGluZV9sZW4sIHNpemVvZihsb2dsaW5lKSAtIGxpbmVfbGVuIC0gMiwgZm10LCBhcmdzKTsKICAgIHZhX2VuZChhcmdzKTsKCiAgICBsaW5lX2xlbiA9IHN0cmxlbihsb2dsaW5lKTsKCiAgICBsb2dsaW5lW2xpbmVfbGVuKytdID0gJ1xuJzsKCiAgICAvKiBEaXNhYmxlIHRoZSB3YXJuaW5nIGxvY2FsbHkgKi8KI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCiNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtcmVzdWx0IgogICAgd3JpdGUobG9nZmQsIGxvZ2xpbmUsIGxpbmVfbGVuKTsKI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKfQoKI2lmbmRlZiBfX0ZJTEVOQU1FX18KI2RlZmluZSBfX0ZJTEVOQU1FX18gX19GSUxFX18KI2VuZGlmCgojZGVmaW5lIExERUJVR0VYICAgIDkKI2RlZmluZSBMREVCVUcgICAgICA4CgojZGVmaW5lIExJTkZPICAgICAgIDIKI2RlZmluZSBMV0FSTiAgICAgICAxCiNkZWZpbmUgTEVSUk9SICAgICAgMAoKI2RlZmluZSBMT0dMKGxldmVsLCBmbXQsIC4uLikgdGxvZyhsZXZlbCwgX19GSUxFTkFNRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fLCBmbXQsICMjX19WQV9BUkdTX18pCgojZGVmaW5lIExPRyhmbXQsIC4uLikgICBMT0dMKExJTkZPLCBmbXQsICMjX19WQV9BUkdTX18pCiNkZWZpbmUgTE9HX1MoZm10LCAuLi4pICBzbG9nKF9fRklMRU5BTUVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXywgZm10LCAjI19fVkFfQVJHU19fKQoKI2RlZmluZSBHSTJQKHgpIEdJTlRfVE9fUE9JTlRFUigoeCkpCiNkZWZpbmUgR1AySSh4KSBHUE9JTlRFUl9UT19JTlQoKHgpKQoKI2RlZmluZSBET19QUkFHTUEoeCkgX1ByYWdtYSgjeCkKI2RlZmluZSBUT0RPKHgpIERPX1BSQUdNQShtZXNzYWdlICJUT0RPOiAiICN4KQoKI2RlZmluZSBERUJVR0VYKGZtdCwgLi4uKSBMT0dMKExERUJVR0VYLCBmbXQsICMjX19WQV9BUkdTX18pCiNkZWZpbmUgREVCVUcoZm10LCAuLi4pIExPR0woTERFQlVHLCBmbXQsICMjX19WQV9BUkdTX18pCiNkZWZpbmUgSU5GTyhmbXQsIC4uLikgIExPR0woTElORk8sIGZtdCwgIyNfX1ZBX0FSR1NfXykKI2RlZmluZSBFUlIoZXhpdF9jb2RlLCBmbXQsIC4uLikgXAogICAgZG8geyBcCiAgICAgICAgY2hhciAqZXJyX3N0ciA9IHN0cmVycm9yKGVycm5vKTtcCiAgICAgICAgTE9HTChMRVJST1IsIGZtdCAiOiAlcyIsICMjX19WQV9BUkdTX18sIGVycl9zdHIpOyAgIFwKICAgICAgICBleGl0KGV4aXRfY29kZSk7IFwKICAgIH0gd2hpbGUgKDApCiNkZWZpbmUgRVJSWChleGl0X2NvZGUsIGZtdCwgLi4uKSBcCiAgICBkbyB7IFwKICAgICAgICBMT0dMKExFUlJPUiwgZm10LCAjI19fVkFfQVJHU19fKTsgICBcCiAgICAgICAgZXhpdChleGl0X2NvZGUpOyBcCiAgICB9IHdoaWxlICgwKQojZGVmaW5lIFdBUk4oZm10LCAuLi4pIFwKICAgIGRvIHsgXAogICAgICAgIGNoYXIgKmVycl9zdHIgPSBzdHJlcnJvcihlcnJubyk7XAogICAgICAgIExPR0woTFdBUk4sIGZtdCI6IFslZF0gJXMiLCAjI19fVkFfQVJHU19fLCBlcnJubywgZXJyX3N0cik7ICAgXAogICAgfSB3aGlsZSAoMCkKI2RlZmluZSBXQVJOWChmbXQsIC4uLikgXAogICAgZG8geyBcCiAgICAgICAgTE9HTChMV0FSTiwgZm10LCAjI19fVkFfQVJHU19fKTsgICBcCiAgICB9IHdoaWxlICgwKQoKCiNpZmRlZiBERVYKI2RlZmluZSBtZnJlZShwKSB7REVCVUdFWCgiRlJFRTogWyUjbFhdIiwgcCk7IGZyZWUoKHApKTt9CiNkZWZpbmUgbWZyZWVfcyhwKSB7TE9HX1MoIioqKiBbREVCVUddIEZSRUU6IFslI2xYXSIsIChwKSk7IGZyZWUoKHApKTt9CiNkZWZpbmUgbW1hbGxvYyhzaXplKSAoe3ZvaWQgKl9ucHRyXyA9IG1hbGxvYygoc2l6ZSkpOyBERUJVR0VYKCJNQUxMT0M6IFslI2xYXSwgc2l6ZSAlbGQiLCBfbnB0cl8sIChzaXplKSk7IF9ucHRyXzsgfSkKI2RlZmluZSBtY2FsbG9jKG5tZW1iLCBzaXplKSAoe3ZvaWQgKl9ucHRyXyA9IGNhbGxvYygobm1lbWIpLCAoc2l6ZSkpOyBERUJVR0VYKCJDQUxMT0M6IFslI2xYXSwgbm1lbWIgJWxkLCBzaXplICVsZCIsIF9ucHRyXywgKG5tZW1iKSwgKHNpemUpKTsgX25wdHJfOyB9KQojZGVmaW5lIG1yZWFsbG9jKHB0ciwgc2l6ZSkgKHsgdm9pZCAqX25wdHJfOyBERUJVR0VYKCJSRUFMTE9DIGJlZm9yZTogWyUjbFhdIiwgKHB0cikpOyBcCiAgICAgICAgX25wdHJfID0gcmVhbGxvYygocHRyKSwgKHNpemUpKTsgREVCVUdFWCgiUkVBTExPQyBhZnRlcjogWyUjbFhdLCBzaXplIFslbGRdIiwgX25wdHJfLCAoc2l6ZSkpOyBfbnB0cl87IH0pCiNlbHNlCiNkZWZpbmUgbWZyZWUocCkgZnJlZSgocCkpCiNkZWZpbmUgbWZyZWVfcyhwKSBmcmVlKChwKSkKI2RlZmluZSBtbWFsbG9jKHNpemUpIG1hbGxvYygoc2l6ZSkpCiNkZWZpbmUgbWNhbGxvYyhubWVtYiwgc2l6ZSkgY2FsbG9jKChubWVtYiksIChzaXplKSkKI2RlZmluZSBtcmVhbGxvYyhwdHIsIHNpemUpICByZWFsbG9jKChwdHIpLCAoc2l6ZSkpCiNlbmRpZgoKI2RlZmluZSBubWVtYiAgIDEKI2RlZmluZSBzaXplICAgIDMyCmludCBtYWluKCkKewogICAgbG9nZmQgPSBTVERPVVRfRklMRU5POwogICAgdm9pZCAqX25wdHJfID0gY2FsbG9jKChubWVtYiksIChzaXplKSk7CiAgICBMT0dMKExERUJVR0VYLCAiQ0FMTE9DOiAlI2xYIG5tZW1iICVsZCwgc2l6ZSAlbGQiLCBfbnB0cl8sIChubWVtYiksIChzaXplKSk7CiAgICBmcmVlKF9ucHRyXyk7CgogICAgcmV0dXJuIDA7Cn0K