summaryrefslogtreecommitdiff
path: root/package/uci/patches
diff options
context:
space:
mode:
Diffstat (limited to 'package/uci/patches')
-rw-r--r--package/uci/patches/120-uci_trigger.patch168
1 files changed, 0 insertions, 168 deletions
diff --git a/package/uci/patches/120-uci_trigger.patch b/package/uci/patches/120-uci_trigger.patch
deleted file mode 100644
index 0b63435..0000000
--- a/package/uci/patches/120-uci_trigger.patch
+++ /dev/null
@@ -1,168 +0,0 @@
---- /dev/null
-+++ b/trigger/uci_trigger.c
-@@ -0,0 +1,132 @@
-+#include <sys/types.h>
-+#include <sys/time.h>
-+#include <stdbool.h>
-+#include <string.h>
-+#include <stdio.h>
-+#include <lualib.h>
-+#include <lauxlib.h>
-+#include "uci.h"
-+
-+// #define DEBUG
-+
-+static int refcount = 0;
-+static lua_State *gL = NULL;
-+static bool prepared = false;
-+
-+struct trigger_set_op {
-+ struct uci_package *p;
-+ struct uci_delta *h;
-+};
-+
-+static int trigger_set(lua_State *L)
-+{
-+ struct trigger_set_op *so =
-+ (struct trigger_set_op *)lua_touserdata(L, 1);
-+ struct uci_package *p = so->p;
-+ struct uci_delta *h = so->h;
-+ struct uci_context *ctx = p->ctx;
-+
-+ /* ignore non-standard savedirs/configdirs
-+ * in order to not trigger events on uci state changes */
-+ if (strcmp(ctx->savedir, UCI_SAVEDIR) ||
-+ strcmp(ctx->confdir, UCI_CONFDIR))
-+ return 0;
-+
-+ if (!prepared) {
-+ lua_getglobal(L, "require");
-+ lua_pushstring(L, "uci.trigger");
-+ lua_call(L, 1, 0);
-+
-+ lua_getglobal(L, "uci");
-+ lua_getfield(L, -1, "trigger");
-+ lua_getfield(L, -1, "load_modules");
-+ lua_call(L, 0, 0);
-+ prepared = true;
-+ } else {
-+ lua_getglobal(L, "uci");
-+ lua_getfield(L, -1, "trigger");
-+ }
-+
-+ lua_getfield(L, -1, "set");
-+ lua_createtable(L, 4, 0);
-+
-+ lua_pushstring(L, p->e.name);
-+ lua_rawseti(L, -2, 1);
-+ if (h->section) {
-+ lua_pushstring(L, h->section);
-+ lua_rawseti(L, -2, 2);
-+ }
-+ if (h->e.name) {
-+ lua_pushstring(L, h->e.name);
-+ lua_rawseti(L, -2, 3);
-+ }
-+ if (h->value) {
-+ lua_pushstring(L, h->value);
-+ lua_rawseti(L, -2, 4);
-+ }
-+ lua_call(L, 1, 0);
-+ lua_pop(L, 2);
-+ return 0;
-+}
-+
-+#ifdef DEBUG
-+
-+static int report (lua_State *L, int status) {
-+ if (status && !lua_isnil(L, -1)) {
-+ const char *msg = lua_tostring(L, -1);
-+ if (msg == NULL) msg = "(error object is not a string)";
-+ fprintf(stderr, "ERROR: %s\n", msg);
-+ lua_pop(L, 1);
-+ }
-+ return status;
-+}
-+
-+#else
-+
-+static inline int report(lua_State *L, int status) {
-+ return status;
-+}
-+
-+#endif
-+
-+static void trigger_set_hook(const struct uci_hook_ops *ops, struct uci_package *p, struct uci_delta *h)
-+{
-+ struct trigger_set_op so;
-+
-+ so.p = p;
-+ so.h = h;
-+ report(gL, lua_cpcall(gL, &trigger_set, &so));
-+}
-+
-+static struct uci_hook_ops hook = {
-+ .set = trigger_set_hook,
-+};
-+
-+static int trigger_attach(struct uci_context *ctx)
-+{
-+ if (!gL) {
-+ gL = luaL_newstate();
-+ if (!gL)
-+ return -1;
-+ luaL_openlibs(gL);
-+
-+ refcount++;
-+ }
-+ uci_add_hook(ctx, &hook);
-+ return 0;
-+}
-+
-+static void trigger_detach(struct uci_context *ctx)
-+{
-+ if (gL && (--refcount <= 0)) {
-+ lua_close(gL);
-+ gL = NULL;
-+ refcount = 0;
-+ prepared = false;
-+ }
-+}
-+
-+struct uci_plugin_ops uci_plugin = {
-+ .attach = trigger_attach,
-+ .detach = trigger_detach,
-+};
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -35,6 +35,7 @@ ADD_EXECUTABLE(ucimap-example ucimap-exa
- TARGET_LINK_LIBRARIES(ucimap-example uci-static ucimap dl)
-
- ADD_SUBDIRECTORY(lua)
-+ADD_SUBDIRECTORY(trigger)
-
- INSTALL(FILES uci.h uci_config.h ucimap.h
- DESTINATION include/libubox
---- /dev/null
-+++ b/trigger/CMakeLists.txt
-@@ -0,0 +1,19 @@
-+cmake_minimum_required(VERSION 2.6)
-+
-+PROJECT(uci C)
-+
-+SET(CMAKE_INSTALL_PREFIX /)
-+
-+ADD_DEFINITIONS(-Os -Wall -Werror --std=gnu99 -g3 -I..)
-+
-+IF(APPLE)
-+ SET(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "${CMAKE_SHARED_MODULE_CREATE_C_FLAGS} -undefined dynamic_lookup")
-+ENDIF(APPLE)
-+
-+ADD_LIBRARY(uci_trigger MODULE uci_trigger.c)
-+SET_TARGET_PROPERTIES(uci_trigger PROPERTIES
-+ OUTPUT_NAME uci_trigger
-+ PREFIX ""
-+)
-+TARGET_LINK_LIBRARIES(uci_trigger uci)
-+
-