|
@@ -230,9 +230,36 @@ static int system_info(struct ubus_context *ctx, struct ubus_object *obj,
|
|
|
#ifdef linux
|
|
|
struct sysinfo info;
|
|
|
void *c;
|
|
|
+ char line[256];
|
|
|
+ char *key, *val;
|
|
|
+ unsigned long long available, cached;
|
|
|
+ FILE *f;
|
|
|
|
|
|
if (sysinfo(&info))
|
|
|
return UBUS_STATUS_UNKNOWN_ERROR;
|
|
|
+
|
|
|
+ if ((f = fopen("/proc/meminfo", "r")) == NULL)
|
|
|
+ return UBUS_STATUS_UNKNOWN_ERROR;
|
|
|
+
|
|
|
+ /* if linux < 3.14 MemAvailable is not in meminfo */
|
|
|
+ available = 0;
|
|
|
+ cached = 0;
|
|
|
+
|
|
|
+ while (fgets(line, sizeof(line), f))
|
|
|
+ {
|
|
|
+ key = strtok(line, " :");
|
|
|
+ val = strtok(NULL, " ");
|
|
|
+
|
|
|
+ if (!key || !val)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (!strcasecmp(key, "MemAvailable"))
|
|
|
+ available = 1024 * atoll(val);
|
|
|
+ else if (!strcasecmp(key, "Cached"))
|
|
|
+ cached = 1024 * atoll(val);
|
|
|
+ }
|
|
|
+
|
|
|
+ fclose(f);
|
|
|
#endif
|
|
|
|
|
|
now = time(NULL);
|
|
@@ -262,6 +289,8 @@ static int system_info(struct ubus_context *ctx, struct ubus_object *obj,
|
|
|
(uint64_t)info.mem_unit * (uint64_t)info.sharedram);
|
|
|
blobmsg_add_u64(&b, "buffered",
|
|
|
(uint64_t)info.mem_unit * (uint64_t)info.bufferram);
|
|
|
+ blobmsg_add_u64(&b, "available", available);
|
|
|
+ blobmsg_add_u64(&b, "cached", cached);
|
|
|
blobmsg_close_table(&b, c);
|
|
|
|
|
|
c = blobmsg_open_table(&b, "swap");
|