+
+ if (uname(&utsname) >= 0)
+ {
+ blobmsg_add_string(&b, "kernel", utsname.release);
+ blobmsg_add_string(&b, "hostname", utsname.nodename);
+ }
+
+ if ((f = fopen("/proc/cpuinfo", "r")) != NULL)
+ {
+ while(fgets(line, sizeof(line), f))
+ {
+ key = strtok(line, "\t:");
+ val = strtok(NULL, "\t\n");
+
+ if (!key || !val)
+ continue;
+
+ if (!strcasecmp(key, "system type") ||
+ !strcasecmp(key, "processor") ||
+ !strcasecmp(key, "model name"))
+ {
+ strtoul(val + 2, &key, 0);
+
+ if (key == (val + 2) || *key != 0)
+ {
+ blobmsg_add_string(&b, "system", val + 2);
+ break;
+ }
+ }
+ }
+
+ fclose(f);
+ }
+
+ if ((f = fopen("/tmp/sysinfo/model", "r")) != NULL ||
+ (f = fopen("/proc/device-tree/model", "r")) != NULL)
+ {
+ if (fgets(line, sizeof(line), f))
+ {
+ val = strtok(line, "\t\n");
+
+ if (val)
+ blobmsg_add_string(&b, "model", val);
+ }
+
+ fclose(f);
+ }
+ else if ((f = fopen("/proc/cpuinfo", "r")) != NULL)
+ {
+ while(fgets(line, sizeof(line), f))
+ {
+ key = strtok(line, "\t:");
+ val = strtok(NULL, "\t\n");
+
+ if (!key || !val)
+ continue;
+
+ if (!strcasecmp(key, "machine") ||
+ !strcasecmp(key, "hardware"))
+ {
+ blobmsg_add_string(&b, "model", val + 2);
+ break;
+ }
+ }
+
+ 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);