]> source.dussan.org Git - rspamd.git/commitdiff
Fix issues in logger functions.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 5 Apr 2015 00:57:58 +0000 (01:57 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 5 Apr 2015 00:57:58 +0000 (01:57 +0100)
src/lua/lua_logger.c

index 559a2a0f800a9602eeb46fdbe44dc9b6813667c2..eff7df3fee96d7ec8743599e28f81dbd64822732 100644 (file)
@@ -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;