diff options
author | John Crispin <blogic@openwrt.org> | 2013-09-03 20:04:49 +0200 |
---|---|---|
committer | John Crispin <blogic@openwrt.org> | 2013-09-03 20:26:51 +0200 |
commit | 03aab02afbfe00f4ee767d3fbc234ea348a34179 (patch) | |
tree | 36558f10985fe3ab6ca1ad78e3f4c7a2182b2038 | |
parent | 64f8c21e5a670053ab9e4719cedbb2d963634c0c (diff) | |
download | unitd-03aab02afbfe00f4ee767d3fbc234ea348a34179.tar unitd-03aab02afbfe00f4ee767d3fbc234ea348a34179.zip |
add a ubus handler that allows sending signals to processes
Signed-off-by: John Crispin <blogic@openwrt.org>
-rw-r--r-- | system.c | 32 |
1 files changed, 31 insertions, 1 deletions
@@ -18,7 +18,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> - +#include <signal.h> #include <unistd.h> #include <libubox/uloop.h> @@ -257,11 +257,41 @@ static int watchdog_set(struct ubus_context *ctx, struct ubus_object *obj, return 0; } +enum { + SIGNAL_PID, + SIGNAL_NUM, + __SIGNAL_MAX +}; + +static const struct blobmsg_policy signal_policy[__WDT_MAX] = { + [SIGNAL_PID] = { .name = "pid", .type = BLOBMSG_TYPE_INT32 }, + [SIGNAL_NUM] = { .name = "signum", .type = BLOBMSG_TYPE_INT32 }, +}; + +static int proc_signal(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_attr *tb[__SIGNAL_MAX]; + + if (!msg) + return UBUS_STATUS_INVALID_ARGUMENT; + + blobmsg_parse(signal_policy, __SIGNAL_MAX, tb, blob_data(msg), blob_len(msg)); + if (!tb[SIGNAL_PID || !tb[SIGNAL_NUM]]) + return UBUS_STATUS_INVALID_ARGUMENT; + + kill(blobmsg_get_u32(tb[SIGNAL_PID]), blobmsg_get_u32(tb[SIGNAL_NUM])); + + return 0; +} + static const struct ubus_method system_methods[] = { UBUS_METHOD_NOARG("board", system_board), UBUS_METHOD_NOARG("info", system_info), UBUS_METHOD_NOARG("upgrade", system_upgrade), UBUS_METHOD("watchdog", watchdog_set, watchdog_policy), + UBUS_METHOD("signal", proc_signal, signal_policy), }; static struct ubus_object_type system_object_type = |