return 0;
}
+static int handle_log_groups(lua_State *L, void (*action)(log_groups_t grp))
+{
+ if (lua_gettop(L) != 1 || (!lua_isstring(L, 1) && !lua_istable(L, 1)))
+ lua_error_p(L, "takes string or table of strings");
+
+ if (lua_isstring(L, 1)) {
+ log_groups_t grp = kr_log_name2grp(lua_tostring(L, 1));
+ if (grp == 0)
+ lua_error_p(L, "unknown group");
+ action(grp);
+ }
+
+ if (lua_istable(L, 1)) {
+ int idx = 1;
+ log_groups_t grp;
+ lua_pushnil(L);
+ while (lua_next(L, 1) != 0) {
+ if (!lua_isstring(L, -1))
+ lua_error_p(L, "wrong value at index %d, must be string", idx);
+ grp = kr_log_name2grp(lua_tostring(L, -1));
+ if (grp == 0)
+ lua_error_p(L, "unknown group \"%s\", type add_log_group() for help.", lua_tostring(L, -1));
+
+ action(grp);
+ ++idx;
+ lua_pop(L, 1);
+ }
+ }
+
+ return 0;
+}
+
+static int l_add_log_group(lua_State *L)
+{
+ return handle_log_groups(L, kr_log_add_group);
+}
+
+static int l_del_log_group(lua_State *L)
+{
+ return handle_log_groups(L, kr_log_del_group);
+}
+
char *engine_get_hostname(struct engine *engine) {
static char hostname_str[KNOT_DNAME_MAXLEN];
if (!engine) {
lua_setglobal(engine->L, "set_log_level");
lua_pushcfunction(engine->L, l_get_log_level);
lua_setglobal(engine->L, "get_log_level");
+ lua_pushcfunction(engine->L, l_add_log_group);
+ lua_setglobal(engine->L, "add_log_group");
+ lua_pushcfunction(engine->L, l_del_log_group);
+ lua_setglobal(engine->L, "del_log_group");
lua_pushcfunction(engine->L, l_setuser);
lua_setglobal(engine->L, "user");
lua_pushcfunction(engine->L, l_hint_root_file);
log_target_t kr_log_target = LOG_TARGET_STDOUT;
log_groups_t kr_log_groups = 0;
+log_group_names_t log_group_names[] = {
+ { "system", LOG_GRP_SYSTEM },
+ { "cache", LOG_GRP_CACHE },
+ { "io", LOG_GRP_IO },
+ { "network", LOG_GRP_NETWORK },
+ { "ta", LOG_GRP_TA },
+ { "tls", LOG_GRP_TLS },
+ { "gnutls", LOG_GRP_GNUTLS },
+ { "tlsclient", LOG_GRP_TLSCLIENT },
+ { "xdp", LOG_GRP_XDP },
+ { "zimport", LOG_GRP_ZIMPORT },
+ { "zscanner", LOG_GRP_ZSCANNER },
+ { "doh", LOG_GRP_DOH },
+ { "dnssec", LOG_GRP_DNSSEC },
+ { "hint", LOG_GRP_HINT },
+ { NULL, -1 },
+};
+
#ifndef SYSLOG_NAMES
syslog_code_t prioritynames[] = {
{ "alert", LOG_ALERT },
return -1;
}
+char *kr_log_grp2name(log_groups_t group)
+{
+ for (int i = 0; log_group_names[i].g_val != -1; ++i)
+ {
+ if (log_group_names[i].g_val == group)
+ return log_group_names[i].g_name;
+ }
+
+ return NULL;
+}
+
+log_groups_t kr_log_name2grp(const char *name)
+{
+ if (!name)
+ return 0;
+
+ for (int i = 0; log_group_names[i].g_name; ++i)
+ {
+ if (strcmp(log_group_names[i].g_name, name) == 0)
+ return log_group_names[i].g_val;
+ }
+
+ return 0;
+}
+
+
+
int kr_log_level_set(log_level_t level)
{
if (level < LOG_CRIT || level > LOG_DEBUG)
/* Targets */
-typedef int log_level_t;
typedef enum {
LOG_TARGET_SYSLOG = 0,
LOG_TARGET_STDERR = 1,
/* Groups */
typedef uint32_t log_groups_t;
+typedef struct {
+ char *g_name;
+ log_groups_t g_val;
+} log_group_names_t;
/* Don't forget add name to log_group_names[] (log.c) */
#define LOG_GRP_SYSTEM (1 << 1)
KR_EXPORT
extern log_groups_t kr_log_groups;
KR_EXPORT
+int group_is_set(log_groups_t group);
+KR_EXPORT
void kr_log_add_group(log_groups_t mask);
KR_EXPORT
void kr_log_del_group(log_groups_t mask);
+KR_EXPORT
+char *kr_log_grp2name(log_groups_t group);
+KR_EXPORT
+log_groups_t kr_log_name2grp(const char *name);
/* Log */
+typedef int log_level_t;
+
KR_EXPORT
extern log_level_t kr_log_level;
KR_EXPORT