/* * gcsd * * gcsd the generic command sequencer daemon can be used to serialize * commands sent over various paralell communication channels to a * single command output. It can be seen as a multiplexer for any * kind of communication between a single resource and various clients * which want to submit commands to it or query information from it. * gcsd is written in C and Lua. The goal is to provide an easy to * understand high level API based on Lua which can be used to * implement the business logic of the so formed multiplexer daemon. * * * Copyright (C) 2009-2010 Markus Grueneis * Christian Pointner * * This file is part of gcsd. * * gcsd is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * gcsd is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gcsd. If not, see . */ #include #include #include #include "datatypes.h" #include "log.h" #include "l_log.h" static int l_log_init(lua_State *L) { log_init(); return 0; } static int l_log_close(lua_State *L) { log_close(); return 0; } static int l_log_add_target(lua_State *L) { int ret = log_add_target(luaL_checkstring(L,1)); if(ret) { lua_pushboolean(L, 0); switch(ret) { case -2: lua_pushstring(L, "memory error at log_add_target"); break; case -3: lua_pushstring(L, "unknown log target"); break; case -4: lua_pushstring(L, "this log target is only allowed once"); break; default: lua_pushstring(L, "syntax error"); break; } return 2; } lua_pushboolean(L, 1); return 1; } static int l_log_printf(lua_State *L) { int numargs = lua_gettop(L); if(numargs < 2) return luaL_error(L, "log.printf too few arguments"); if(numargs > 2) { lua_getglobal(L, "string"); lua_pushliteral(L, "format"); lua_gettable(L, -2); lua_insert(L, 2); lua_remove(L, -1); lua_call(L, numargs - 1, 1); } log_prio_t prio = luaL_checkint(L,1); log_printf(prio, "%s", luaL_checkstring(L, 2)); return 0; } static const struct luaL_Reg log_funcs [] = { { "init", l_log_init }, { "close", l_log_close }, { "add_target", l_log_add_target }, { "printf", l_log_printf }, { NULL, NULL } }; LUALIB_API int luaopen_log(lua_State *L) { #if LUA_VERSION_NUM > 501 lua_newtable(L); luaL_setfuncs(L, log_funcs, 0); lua_pushvalue(L, -1); lua_setglobal(L, LUA_LOGLIBNAME); #else luaL_register(L, LUA_LOGLIBNAME, log_funcs); #endif lua_pushliteral(L, "ERROR"); lua_pushinteger(L, ERROR); lua_settable(L, -3); lua_pushliteral(L, "WARNING"); lua_pushinteger(L, WARNING); lua_settable(L, -3); lua_pushliteral(L, "NOTICE"); lua_pushinteger(L, NOTICE); lua_settable(L, -3); lua_pushliteral(L, "INFO"); lua_pushinteger(L, INFO); lua_settable(L, -3); lua_pushliteral(L, "DEBUG"); lua_pushinteger(L, DEBUG); lua_settable(L, -3); return 1; }