diff mbox series

[ubus,2/2] lua: Implement object removal

Message ID mailman.29944.1735822308.1089.openwrt-devel@lists.openwrt.org
State New
Headers show
Series None | expand

Commit Message

Ernestas Kulik Jan. 2, 2025, 12:48 p.m. UTC
The sender domain has a DMARC Reject/Quarantine policy which disallows
sending mailing list messages using the original "From" header.

To mitigate this problem, the original message has been wrapped
automatically by the mailing list software.
When implementing services in Lua, some objects on the bus might need to
disappear, but there is no way to disappear them with the current
implementation.

Signed-off-by: Ernestas Kulik <ernestas.k@iconn-networks.com>
---
 lua/ubus.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)
diff mbox series

Patch

diff --git a/lua/ubus.c b/lua/ubus.c
index cf2b555..a866195 100644
--- a/lua/ubus.c
+++ b/lua/ubus.c
@@ -588,6 +588,54 @@  static int ubus_lua_add(lua_State *L)
 	return 0;
 }
 
+static int ubus_lua_remove(lua_State *L)
+{
+	struct ubus_lua_connection *c = NULL;
+	struct ubus_object *obj = NULL;
+	struct ubus_lua_object *lua_obj = NULL;
+
+	c = luaL_checkudata(L, 1, METANAME);
+
+	luaL_checktype(L, 2, LUA_TTABLE);
+
+	lua_pushstring(L, "__ubusobj");
+	if (lua_gettable(L, -2) != LUA_TLIGHTUSERDATA) {
+		lua_pushstring(L, "not a ubus object");
+		return lua_error(L);
+	}
+
+	obj = lua_touserdata(L, -1);
+
+	ubus_remove_object(c->ctx, obj);
+
+	/* Reset light user data pointer. */
+	lua_pushstring(L, "__ubusobj");
+	lua_pushnil(L);
+	lua_settable(L, 2);
+
+	/* Free allocated resources. */
+	free(obj->type);
+	free((struct ubus_method *)obj->methods);
+
+	lua_obj = container_of(obj, struct ubus_lua_object, o);
+
+	if (lua_obj->rsubscriber) {
+		lua_getglobal(L, "__ubus_cb_publisher");
+		lua_rawgeti(L, -1, lua_obj->rsubscriber);
+		luaL_unref(L, -2, lua_obj->rsubscriber);
+		lua_pop(L, 2);
+	}
+
+	lua_getglobal(L, "__ubus_cb");
+	lua_rawgeti(L, -1, lua_obj->r);
+	luaL_unref(L, -2, lua_obj->r);
+	lua_pop(L, 2);
+
+	free(lua_obj);
+
+	return 0;
+}
+
 static int
 ubus_lua_notify( lua_State *L )
 {
@@ -949,6 +997,7 @@  static const luaL_Reg ubus[] = {
 	{ "connect", ubus_lua_connect },
 	{ "objects", ubus_lua_objects },
 	{ "add", ubus_lua_add },
+	{ "remove", ubus_lua_remove },
 	{ "notify", ubus_lua_notify },
 	{ "reply", ubus_lua_reply },
 	{ "defer_request", ubus_lua_defer_request },