util.c expand quit to show file/func/line
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
diff --git a/logging.h b/logging.h
index 0a9b464..fa2a747 100644
--- a/logging.h
+++ b/logging.h
@@ -30,6 +30,8 @@ extern int opt_log_level;
extern void _applog(int prio, const char *str);
+#define IN_FMT_FFL " in %s %s():%d"
+
#define applog(prio, fmt, ...) do { \
if (opt_debug || prio != LOG_DEBUG) { \
if (use_syslog || opt_log_output || prio <= opt_log_level) { \
@@ -49,6 +51,26 @@ extern void _applog(int prio, const char *str);
_quit(status); \
} while (0)
+#define quithere(status, fmt, ...) do { \
+ if (fmt) { \
+ char tmp42[LOGBUFSIZ]; \
+ snprintf(tmp42, sizeof(tmp42), fmt IN_FMT_FFL, \
+ ##__VA_ARGS__, __FILE__, __func__, __LINE__); \
+ _applog(LOG_ERR, tmp42); \
+ } \
+ _quit(status); \
+} while (0)
+
+#define quitfrom(status, _file, _func, _line, fmt, ...) do { \
+ if (fmt) { \
+ char tmp42[LOGBUFSIZ]; \
+ snprintf(tmp42, sizeof(tmp42), fmt IN_FMT_FFL, \
+ ##__VA_ARGS__, _file, _func, _line); \
+ _applog(LOG_ERR, tmp42); \
+ } \
+ _quit(status); \
+} while (0)
+
#ifdef HAVE_CURSES
#define wlog(fmt, ...) do { \
diff --git a/util.c b/util.c
index 82f6f37..2dc4ea4 100644
--- a/util.c
+++ b/util.c
@@ -564,7 +564,7 @@ char *get_proxy(char *url, struct pool *pool)
len = split - url;
pool->rpc_proxy = malloc(1 + len - plen);
if (!(pool->rpc_proxy))
- quit(1, "Failed to malloc rpc_proxy");
+ quithere(1, "Failed to malloc rpc_proxy");
strcpy(pool->rpc_proxy, url + plen);
pool->rpc_proxytype = proxynames[i].proxytype;
@@ -590,7 +590,7 @@ char *bin2hex(const unsigned char *p, size_t len)
slen += 4 - (slen % 4);
s = calloc(slen, 1);
if (unlikely(!s))
- quit(1, "Failed to calloc in bin2hex");
+ quithere(1, "Failed to calloc");
for (i = 0; i < len; i++)
sprintf(s + (i * 2), "%02x", (unsigned int) p[i]);
@@ -1090,7 +1090,7 @@ static void recalloc_sock(struct pool *pool, size_t len)
// applog(LOG_DEBUG, "Recallocing pool sockbuf to %d", new);
pool->sockbuf = realloc(pool->sockbuf, new);
if (!pool->sockbuf)
- quit(1, "Failed to realloc pool sockbuf in recalloc_sock");
+ quithere(1, "Failed to realloc pool sockbuf");
memset(pool->sockbuf + old, 0, new - old);
pool->sockbuf_size = new;
}
@@ -1578,7 +1578,7 @@ static bool setup_stratum_socket(struct pool *pool)
if (!pool->sockbuf) {
pool->sockbuf = calloc(RBUFSIZE, 1);
if (!pool->sockbuf)
- quit(1, "Failed to calloc pool sockbuf in initiate_stratum");
+ quithere(1, "Failed to calloc pool sockbuf");
pool->sockbuf_size = RBUFSIZE;
}
@@ -1830,7 +1830,7 @@ void *realloc_strcat(char *ptr, char *s)
ret = malloc(len);
if (unlikely(!ret))
- quit(1, "Failed to malloc in realloc_strcat");
+ quithere(1, "Failed to malloc");
sprintf(ret, "%s%s", ptr, s);
free(ptr);
@@ -1849,14 +1849,14 @@ void *str_text(char *ptr)
ret = strdup("(null)");
if (unlikely(!ret))
- quit(1, "Failed to malloc in text_str null");
+ quithere(1, "Failed to malloc null");
}
uptr = (unsigned char *)ptr;
ret = txt = malloc(strlen(ptr)*4+5); // Guaranteed >= needed
if (unlikely(!txt))
- quit(1, "Failed to malloc in text_str txt");
+ quithere(1, "Failed to malloc txt");
do {
if (*uptr < ' ' || *uptr > '~') {
@@ -1895,7 +1895,7 @@ void _cgsem_init(cgsem_t *cgsem, const char *file, const char *func, const int l
int flags, fd, i;
if (pipe(cgsem->pipefd) == -1)
- quit(1, "Failed pipe in cgsem_init");
+ quitfrom(1, file, func, line, "Failed pipe errno=%d", errno);
/* Make the pipes FD_CLOEXEC to allow them to close should we call
* execv on restart. */
@@ -1904,7 +1904,7 @@ void _cgsem_init(cgsem_t *cgsem, const char *file, const char *func, const int l
flags = fcntl(fd, F_GETFD, 0);
flags |= FD_CLOEXEC;
if (fcntl(fd, F_SETFD, flags) == -1)
- quit(1, "Failed to fcntl in cgsem_init errno=%d (%s %s():%d)", errno, file, func, line);
+ quitfrom(1, file, func, line, "Failed to fcntl errno=%d", errno);
}
}
@@ -1915,7 +1915,7 @@ void _cgsem_post(cgsem_t *cgsem, const char *file, const char *func, const int l
ret = write(cgsem->pipefd[1], &buf, 1);
if (unlikely(ret == 0))
- applog(LOG_WARNING, "Failed to write in cgsem_post errno=%d (%s %s():%d)", errno, file, func, line);
+ applog(LOG_WARNING, "Failed to write errno=%d" INFMTFFL, errno, file, func, line);
}
void _cgsem_wait(cgsem_t *cgsem, const char *file, const char *func, const int line)
@@ -1925,7 +1925,7 @@ void _cgsem_wait(cgsem_t *cgsem, const char *file, const char *func, const int l
ret = read(cgsem->pipefd[0], &buf, 1);
if (unlikely(ret == 0))
- applog(LOG_WARNING, "Failed to read in cgsem_wait errno=%d (%s %s():%d)", errno, file, func, line);
+ applog(LOG_WARNING, "Failed to read errno=%d" INFMTFFL, errno, file, func, line);
}
void _cgsem_destroy(cgsem_t *cgsem)
@@ -1938,19 +1938,19 @@ void _cgsem_init(cgsem_t *cgsem, const char *file, const char *func, const int l
{
int ret;
if ((ret = sem_init(cgsem, 0, 0)))
- quit(1, "Failed to sem_init in cgsem_init ret=%d errno=%d (%s %s():%d)", ret, errno, file, func, line);
+ quitfrom(1, file, func, line, "Failed to sem_init ret=%d errno=%d", ret, errno);
}
void _cgsem_post(cgsem_t *cgsem, const char *file, const char *func, const int line)
{
if (unlikely(sem_post(cgsem)))
- quit(1, "Failed to sem_post in cgsem_post errno=%d cgsem=0x%p (%s %s():%d)", errno, cgsem, file, func, line);
+ quitfrom(1, file, func, line, "Failed to sem_post errno=%d cgsem=0x%p", errno, cgsem);
}
void _cgsem_wait(cgsem_t *cgsem, const char *file, const char *func, const int line)
{
if (unlikely(sem_wait(cgsem)))
- quit(1, "Failed to sem_wait in cgsem_wait errno=%d cgsem=0x%p (%s %s():%d)", errno, cgsem, file, func, line);
+ quitfrom(1, file, func, line, "Failed to sem_wait errno=%d cgsem=0x%p", errno, cgsem);
}
void _cgsem_destroy(cgsem_t *cgsem)