X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=system.c;h=151f613002369de61194434c692339aae8618aa9;hp=dc509ffb36e6dbcd63b6da7d74648c18a4dda30c;hb=32534f7058d23dcab44408506848cec199e57fbb;hpb=5b1fb35427ba36d20c9f2a6b9403d1545b3abee6 diff --git a/system.c b/system.c index dc509ff..151f613 100644 --- a/system.c +++ b/system.c @@ -28,6 +28,7 @@ #include #include "procd.h" +#include "sysupgrade.h" #include "watchdog.h" static struct blob_buf b; @@ -113,6 +114,40 @@ static int system_board(struct ubus_context *ctx, struct ubus_object *obj, fclose(f); } + if ((f = fopen("/tmp/sysinfo/board_name", "r")) != NULL) + { + if (fgets(line, sizeof(line), f)) + { + val = strtok(line, "\t\n"); + + if (val) + blobmsg_add_string(&b, "board_name", val); + } + + fclose(f); + } + else if ((f = fopen("/proc/device-tree/compatible", "r")) != NULL) + { + if (fgets(line, sizeof(line), f)) + { + val = strtok(line, "\t\n"); + + if (val) + { + next = val; + while ((next = strchr(next, ',')) != NULL) + { + *next = '-'; + next++; + } + + blobmsg_add_string(&b, "board_name", val); + } + } + + fclose(f); + } + if ((f = fopen("/etc/openwrt_release", "r")) != NULL) { c = blobmsg_open_table(&b, "release"); @@ -244,6 +279,7 @@ static int system_reboot(struct ubus_context *ctx, struct ubus_object *obj, enum { WDT_FREQUENCY, WDT_TIMEOUT, + WDT_MAGICCLOSE, WDT_STOP, __WDT_MAX }; @@ -251,6 +287,7 @@ enum { 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_MAGICCLOSE] = { .name = "magicclose", .type = BLOBMSG_TYPE_BOOL }, [WDT_STOP] = { .name = "stop", .type = BLOBMSG_TYPE_BOOL }, }; @@ -285,6 +322,9 @@ static int watchdog_set(struct ubus_context *ctx, struct ubus_object *obj, watchdog_timeout(timeout); } + if (tb[WDT_MAGICCLOSE]) + watchdog_set_magicclose(blobmsg_get_bool(tb[WDT_MAGICCLOSE])); + if (tb[WDT_STOP]) watchdog_set_stopped(blobmsg_get_bool(tb[WDT_STOP])); @@ -299,6 +339,7 @@ static int watchdog_set(struct ubus_context *ctx, struct ubus_object *obj, blobmsg_add_string(&b, "status", status); blobmsg_add_u32(&b, "timeout", watchdog_timeout(0)); blobmsg_add_u32(&b, "frequency", watchdog_frequency(0)); + blobmsg_add_u8(&b, "magicclose", watchdog_get_magicclose()); ubus_send_reply(ctx, req, b.head); return 0; @@ -346,34 +387,6 @@ static const struct blobmsg_policy sysupgrade_policy[__SYSUPGRADE_MAX] = { [SYSUPGRADE_COMMAND] = { .name = "command", .type = BLOBMSG_TYPE_STRING }, }; -static void -procd_exec_upgraded(const char *prefix, char *path, char *command) -{ - char *wdt_fd = watchdog_fd(); - char *argv[] = { "/sbin/upgraded", NULL, NULL, NULL}; - - if (chroot(prefix)) { - fprintf(stderr, "Failed to chroot for upgraded exec.\n"); - return; - } - - argv[1] = path; - argv[2] = command; - - DEBUG(2, "Exec to upgraded now\n"); - if (wdt_fd) { - watchdog_set_cloexec(false); - setenv("WDTFD", wdt_fd, 1); - } - execvp(argv[0], argv); - - /* Cleanup on failure */ - fprintf(stderr, "Failed to exec upgraded.\n"); - unsetenv("WDTFD"); - watchdog_set_cloexec(true); - chroot("."); -} - static int sysupgrade(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) @@ -387,10 +400,12 @@ static int sysupgrade(struct ubus_context *ctx, struct ubus_object *obj, if (!tb[SYSUPGRADE_PATH] || !tb[SYSUPGRADE_PREFIX]) return UBUS_STATUS_INVALID_ARGUMENT; - procd_exec_upgraded(blobmsg_get_string(tb[SYSUPGRADE_PREFIX]), - blobmsg_get_string(tb[SYSUPGRADE_PATH]), - tb[SYSUPGRADE_COMMAND] ? blobmsg_get_string(tb[SYSUPGRADE_COMMAND]) : NULL); - return 0; + sysupgrade_exec_upgraded(blobmsg_get_string(tb[SYSUPGRADE_PREFIX]), + blobmsg_get_string(tb[SYSUPGRADE_PATH]), + tb[SYSUPGRADE_COMMAND] ? blobmsg_get_string(tb[SYSUPGRADE_COMMAND]) : NULL); + + /* sysupgrade_exec_upgraded() will never return unless something has gone wrong */ + return UBUS_STATUS_UNKNOWN_ERROR; } static void