aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-04-05 01:57:58 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-04-05 01:57:58 +0100
commitc6cfb1fa571f03fae3fd7e1f274c9b9c24e68174 (patch)
tree4a1531c64ad20a06bb40341e537c7b4251d23e50 /src
parent8b01c72fc883bf50d8827763b4ad3d793f8a176d (diff)
downloadrspamd-c6cfb1fa571f03fae3fd7e1f274c9b9c24e68174.tar.gz
rspamd-c6cfb1fa571f03fae3fd7e1f274c9b9c24e68174.zip
Fix issues in logger functions.
Diffstat (limited to 'src')
-rw-r--r--src/lua/lua_logger.c70
1 files changed, 57 insertions, 13 deletions
diff --git a/src/lua/lua_logger.c b/src/lua/lua_logger.c
index 559a2a0f8..eff7df3fe 100644
--- a/src/lua/lua_logger.c
+++ b/src/lua/lua_logger.c
@@ -160,7 +160,7 @@ lua_logger_out_num (lua_State *L, gint pos, gchar *outbuf, gsize len)
if ((gdouble)(glong)num == num) {
inum = num;
- r = rspamd_snprintf (outbuf, len, "%ld", inum);
+ r = rspamd_snprintf (outbuf, len, "%l", inum);
}
else {
r = rspamd_snprintf (outbuf, len, "%f", num);
@@ -188,42 +188,65 @@ lua_logger_out_table (lua_State *L, gint pos, gchar *outbuf, gsize len)
gchar *d = outbuf;
gsize remain = len, r;
gboolean first = TRUE;
+ gint i;
if (!lua_istable (L, pos)) {
return 0;
}
lua_pushvalue (L, pos);
- r = rspamd_snprintf (outbuf, remain, "{");
+ r = rspamd_snprintf (d, remain, "{");
+ remain -= r;
+ d += r;
+
+ /* Get numeric keys (ipairs) */
+ for (i = 1; ; i ++) {
+ lua_rawgeti (L, -1, i);
+
+ if (lua_isnil (L, -1)) {
+ lua_pop (L, 1);
+ break;
+ }
- for (lua_pushnil (L); lua_next (L, -2) && remain > 0; lua_pop (L, 1)) {
- /* 'key' is at index -2 and 'value' is at index -1 */
if (!first) {
r = rspamd_snprintf (d, remain, ", ");
+ MOVE_BUF(d, remain, r);
}
+ r = rspamd_snprintf (d, remain, "[%d] = ", i);
MOVE_BUF(d, remain, r);
+ r = lua_logger_out_type (L, -1, d, remain);
+ MOVE_BUF(d, remain, r);
+
+ first = FALSE;
+ lua_pop (L, 1);
+ }
+
+ /* Get string keys (pairs) */
+ for (lua_pushnil (L); lua_next (L, -2) && remain > 0; lua_pop (L, 1)) {
+ /* 'key' is at index -2 and 'value' is at index -1 */
if (lua_type (L, -2) == LUA_TNUMBER) {
- r = rspamd_snprintf (d, remain, "[%d] = ",
- lua_tonumber (L, -2));
- }
- else if (lua_type (L, -2) == LUA_TSTRING) {
- r = rspamd_snprintf (d, remain, "[%s] = ",
- lua_tostring (L, -2));
+ continue;
}
- else {
- g_assert (0);
+
+ if (!first) {
+ r = rspamd_snprintf (d, remain, ", ");
+ MOVE_BUF(d, remain, r);
}
+ r = rspamd_snprintf (d, remain, "[%s] = ",
+ lua_tostring (L, -2));
MOVE_BUF(d, remain, r);
r = lua_logger_out_type (L, -1, d, remain);
MOVE_BUF(d, remain, r);
+
+ first = FALSE;
}
lua_pop (L, 1);
- r = rspamd_snprintf (outbuf, remain, "}");
+ r = rspamd_snprintf (d, remain, "}");
d += r;
return (d - outbuf);
@@ -331,6 +354,27 @@ lua_logger_logx (lua_State *L, GLogLevelFlags level, gboolean is_string)
}
}
+ if (state == parse_arg_num) {
+ arg_num = strtoul (c, NULL, 10);
+
+ if (arg_num < 1 || arg_num > (guint)lua_gettop (L) + 1) {
+ msg_err ("wrong argument number: %ud", arg_num);
+
+ if (is_string) {
+ lua_pushnil (L);
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+
+ r = lua_logger_out_type (L, arg_num + 1, d, remain);
+ g_assert (r <= remain);
+ remain -= r;
+ d += r;
+ }
+
if (is_string) {
lua_pushlstring (L, logbuf, sizeof (logbuf) - remain);
return 1;