#include "procd.h"
#include "watchdog.h"
+#include "hotplug.h"
#define HOSTNAME_PATH "/proc/sys/kernel/hostname"
return 0;
}
+static int system_upgrade(struct ubus_context *ctx, struct ubus_object *obj,
+ struct ubus_request_data *req, const char *method,
+ struct blob_attr *msg)
+{
+ procd_reconnect_ubus(0);
+ log_shutdown();
+ hotplug_shutdown();
+
+ return 0;
+}
+
enum {
WDT_FREQUENCY,
WDT_TIMEOUT,
+ WDT_STOP,
__WDT_MAX
};
static const struct blobmsg_policy watchdog_policy[__WDT_MAX] = {
[WDT_FREQUENCY] = { .name = "frequency", .type = BLOBMSG_TYPE_INT32 },
[WDT_TIMEOUT] = { .name = "timeout", .type = BLOBMSG_TYPE_INT32 },
+ [WDT_STOP] = { .name = "stop", .type = BLOBMSG_TYPE_BOOL },
};
static int watchdog_set(struct ubus_context *ctx, struct ubus_object *obj,
struct blob_attr *msg)
{
struct blob_attr *tb[__WDT_MAX];
+ const char *status;
if (!msg)
return UBUS_STATUS_INVALID_ARGUMENT;
watchdog_timeout(timeout);
}
+ if (tb[WDT_STOP])
+ watchdog_set_stopped(blobmsg_get_bool(tb[WDT_STOP]));
+
+ if (watchdog_fd() < 0)
+ status = "offline";
+ else if (watchdog_get_stopped())
+ status = "stopped";
+ else
+ status = "running";
+
blob_buf_init(&b, 0);
- blobmsg_add_string(&b, "status", (watchdog_fd() >= 0) ? ("running") : ("offline"));
+ blobmsg_add_string(&b, "status", status);
blobmsg_add_u32(&b, "timeout", watchdog_timeout(0));
blobmsg_add_u32(&b, "frequency", watchdog_frequency(0));
ubus_send_reply(ctx, req, b.head);
static const struct ubus_method system_methods[] = {
UBUS_METHOD_NOARG("info", system_info),
+ UBUS_METHOD_NOARG("upgrade", system_upgrade),
UBUS_METHOD("watchdog", watchdog_set, watchdog_policy),
};