[PATCH v2 1/5] procd: add restart ubus call

Florian Eckert fe at dev.tdt.de
Thu Dec 17 04:35:33 EST 2020


To allow other services to respsond to a restart event from a procd initialised
service, a new ubus method "restart" in the ubus "service" path is needed
to trigger a ubus notify and also execute the installed service triggers.

Cc: Aaron Goodman <aaronjg at alumni.stanford.edu>
Signed-off-by: Florian Eckert <fe at dev.tdt.de>
The original implementation is by Aaron Goodman.
---
 .../patches/0010-add-restart-event.patch      | 64 +++++++++++++++++++
 1 file changed, 64 insertions(+)
 create mode 100644 package/system/procd/patches/0010-add-restart-event.patch

diff --git a/package/system/procd/patches/0010-add-restart-event.patch b/package/system/procd/patches/0010-add-restart-event.patch
new file mode 100644
index 0000000000..86ec3d38e1
--- /dev/null
+++ b/package/system/procd/patches/0010-add-restart-event.patch
@@ -0,0 +1,64 @@
+--- a/service/service.c
++++ b/service/service.c
+@@ -204,6 +204,17 @@ static const struct blobmsg_policy servi
+ };
+ 
+ enum {
++	SERVICE_RESTART_ATTR_NAME,
++	SERVICE_RESTART_ATTR_INSTANCE,
++	__SERVICE_RESTART_ATTR_MAX,
++};
++
++static const struct blobmsg_policy service_restart_attrs[__SERVICE_RESTART_ATTR_MAX] = {
++	[SERVICE_RESTART_ATTR_NAME] = { "name", BLOBMSG_TYPE_STRING },
++	[SERVICE_RESTART_ATTR_INSTANCE] = { "instance", BLOBMSG_TYPE_STRING },
++};
++
++enum {
+ 	SERVICE_DEL_ATTR_NAME,
+ 	SERVICE_DEL_ATTR_INSTANCE,
+ 	__SERVICE_DEL_ATTR_MAX,
+@@ -681,6 +692,35 @@ service_handle_update(struct ubus_contex
+ 	return 0;
+ }
+ 
++static int
++service_handle_restart(struct ubus_context *ctx, struct ubus_object *obj,
++		       struct ubus_request_data *req, const char *method,
++		       struct blob_attr *msg)
++{
++	struct blob_attr *tb[__SERVICE_RESTART_ATTR_MAX], *cur;
++	struct service *s = NULL;
++	const char *name;
++
++	blobmsg_parse(service_set_attrs, __SERVICE_RESTART_ATTR_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
++	cur = tb[SERVICE_RESTART_ATTR_NAME];
++	if (!cur)
++		return UBUS_STATUS_INVALID_ARGUMENT;
++
++	name = blobmsg_data(cur);
++
++	s = avl_find_element(&services, name, s, avl);
++	if (!s)
++		return UBUS_STATUS_INVALID_ARGUMENT;
++
++	blob_buf_init(&b, 0);
++	blobmsg_add_string(&b, "service", s->name);
++	trigger_event("service.restart", b.head);
++
++	service_event("service.restart", s->name, NULL);
++
++	return UBUS_STATUS_OK;
++}
++
+ static void ubus_event_bcast(const char *type, const char *param1, const char *val1,
+ 			     const char *param2, const char *val2)
+ {
+@@ -951,6 +991,7 @@ static struct ubus_method main_object_me
+ 	UBUS_METHOD("add", service_handle_set, service_set_attrs),
+ 	UBUS_METHOD("list", service_handle_list, service_list_attrs),
+ 	UBUS_METHOD("delete", service_handle_delete, service_del_attrs),
++	UBUS_METHOD("restart", service_handle_restart, service_restart_attrs),
+ 	UBUS_METHOD("signal", service_handle_signal, service_signal_attrs),
+ 	UBUS_METHOD("update_start", service_handle_update, service_attrs),
+ 	UBUS_METHOD("update_complete", service_handle_update, service_attrs),
-- 
2.20.1




More information about the openwrt-devel mailing list