X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=system.c;h=54a84b468f50b10f2221a96d4d37288ae3d18c39;hp=c96cb632fec3bd6f5902608f9d28a59a9505d309;hb=315f04d8b823adda96041c17f6672b7790376ccb;hpb=f726e77701b2300ef71e6d62a715aab28d8927b0 diff --git a/system.c b/system.c index c96cb63..54a84b4 100644 --- a/system.c +++ b/system.c @@ -18,7 +18,7 @@ #include #include #include - +#include #include #include @@ -27,10 +27,10 @@ #include "watchdog.h" #include "hotplug.h" -#define HOSTNAME_PATH "/proc/sys/kernel/hostname" - static struct blob_buf b; +int upgrade_running = 0; + static int system_board(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) @@ -193,6 +193,8 @@ static int system_upgrade(struct ubus_context *ctx, struct ubus_object *obj, log_shutdown(); hotplug_shutdown(); + upgrade_running = 1; + return 0; } @@ -259,11 +261,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 =