+ long total;
+ FILE *fp = fopen("/proc/meminfo", "r");
+
+ if (fp == NULL) {
+ warn("Error opening meminfo file");
+ return smprintf(UNKNOWN_STR);
+ }
+
+ fscanf(fp, "MemTotal: %ld kB\n", &total);
+ fclose(fp);
+
+ return smprintf("%f", (float)total / 1024 / 1024);
+}
+
+static char *
+ram_used(void)
+{
+ long free, total, buffers, cached, used;
+ FILE *fp = fopen("/proc/meminfo", "r");
+
+ if (fp == NULL) {
+ warn("Error opening meminfo file");
+ return smprintf(UNKNOWN_STR);
+ }
+
+ fscanf(fp, "MemTotal: %ld kB\n", &total);
+ fscanf(fp, "MemFree: %ld kB\n", &free);
+ fscanf(fp, "MemAvailable: %ld kB\nBuffers: %ld kB\n", &buffers, &buffers);
+ fscanf(fp, "Cached: %ld kB\n", &cached);
+
+ fclose(fp);
+ used = total - free - buffers - cached;
+
+ return smprintf("%f", (float)used / 1024 / 1024);
+}
+
+static char *
+run_command(const char* command)
+{
+ int good;
+ FILE *fp = popen(command, "r");
+ char buffer[64] = "";
+
+ if (fp == NULL) {
+ warn("Could not get command output for: %s", command);
+ return smprintf(UNKNOWN_STR);
+ }
+
+ fgets(buffer, sizeof(buffer)-1, fp);
+ pclose(fp);
+ for (int i = 0 ; i != sizeof(buffer); i++) {
+ if (buffer[i] == '\0') {
+ good = 1;
+ break;
+ }
+ }
+ if (good)
+ buffer[strlen(buffer)-1] = '\0';
+
+ return smprintf("%s", buffer);
+}
+
+static char *
+temp(const char *file)
+{
+ int temperature;
+ FILE *fp = fopen(file, "r");
+
+ if (fp == NULL) {
+ warn("Could not open temperature file");
+ return smprintf(UNKNOWN_STR);
+ }
+
+ fscanf(fp, "%d", &temperature);
+ fclose(fp);
+
+ return smprintf("%d°C", temperature / 1000);
+}
+
+static char *
+uptime(void)
+{
+ struct sysinfo info;
+ int hours = 0;
+ int minutes = 0;
+
+ sysinfo(&info);
+ hours = info.uptime / 3600;
+ minutes = (info.uptime - hours * 3600 ) / 60;
+
+ return smprintf("%dh %dm", hours, minutes);
+}
+
+static char *
+username(void)
+{
+ uid_t uid = geteuid();
+ struct passwd *pw = getpwuid(uid);
+
+ if (pw == NULL) {
+ warn("Could not get username");
+ return smprintf(UNKNOWN_STR);