X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=system.c;h=4b3b82c55b0b71fd4b71e3b0fb90c96fe2f47f05;hp=29ca656aeb12daa407014879b99dbefbb093c884;hb=2c8176385a4f62b536303912ba508b9dc7931fad;hpb=b76eda6cd8ba061f49af4074838e6a42ae94144c diff --git a/system.c b/system.c index 29ca656..4b3b82c 100644 --- a/system.c +++ b/system.c @@ -38,7 +38,7 @@ static int system_board(struct ubus_context *ctx, struct ubus_object *obj, { void *c; char line[256]; - char *key, *val; + char *key, *val, *next; struct utsname utsname; FILE *f; @@ -111,24 +111,53 @@ static int system_board(struct ubus_context *ctx, struct ubus_object *obj, while (fgets(line, sizeof(line), f)) { - key = strtok(line, "=\""); - val = strtok(NULL, "\"\n"); + char *dest; + char ch; - if (!key || !val) + key = line; + val = strchr(line, '='); + if (!val) continue; + *(val++) = 0; + if (!strcasecmp(key, "DISTRIB_ID")) - blobmsg_add_string(&b, "distribution", val); + key = "distribution"; else if (!strcasecmp(key, "DISTRIB_RELEASE")) - blobmsg_add_string(&b, "version", val); + key = "version"; else if (!strcasecmp(key, "DISTRIB_REVISION")) - blobmsg_add_string(&b, "revision", val); + key = "revision"; else if (!strcasecmp(key, "DISTRIB_CODENAME")) - blobmsg_add_string(&b, "codename", val); + key = "codename"; else if (!strcasecmp(key, "DISTRIB_TARGET")) - blobmsg_add_string(&b, "target", val); + key = "target"; else if (!strcasecmp(key, "DISTRIB_DESCRIPTION")) - blobmsg_add_string(&b, "description", val); + key = "description"; + else + continue; + + dest = blobmsg_alloc_string_buffer(&b, key, strlen(val)); + while (val && (ch = *(val++)) != 0) { + switch (ch) { + case '\'': + case '"': + next = strchr(val, ch); + if (next) + *next = 0; + + strcpy(dest, val); + + if (next) + val = next + 1; + + dest += strlen(dest); + break; + case '\\': + *(dest++) = *(val++); + break; + } + } + blobmsg_add_string_buffer(&b); } blobmsg_close_array(&b, c); @@ -287,21 +316,21 @@ static int proc_signal(struct ubus_context *ctx, struct ubus_object *obj, } enum { - NAND_FOLDER, + NAND_PATH, __NAND_MAX }; static const struct blobmsg_policy nand_policy[__NAND_MAX] = { - [NAND_FOLDER] = { .name = "folder", .type = BLOBMSG_TYPE_STRING }, + [NAND_PATH] = { .name = "path", .type = BLOBMSG_TYPE_STRING }, }; static void -procd_spawn_upgraded(char *folder) +procd_spawn_upgraded(char *path) { char *wdt_fd = watchdog_fd(); char *argv[] = { "/tmp/upgraded", NULL, NULL}; - argv[1] = folder; + argv[1] = path; DEBUG(2, "Exec to upgraded now\n"); if (wdt_fd) { @@ -321,10 +350,10 @@ static int nand_set(struct ubus_context *ctx, struct ubus_object *obj, return UBUS_STATUS_INVALID_ARGUMENT; blobmsg_parse(nand_policy, __NAND_MAX, tb, blob_data(msg), blob_len(msg)); - if (!tb[NAND_FOLDER]) + if (!tb[NAND_PATH]) return UBUS_STATUS_INVALID_ARGUMENT; - procd_spawn_upgraded(blobmsg_get_string(tb[NAND_FOLDER])); + procd_spawn_upgraded(blobmsg_get_string(tb[NAND_PATH])); fprintf(stderr, "Yikees, something went wrong. no /sbin/upgraded ?\n"); return 0; }