]> code.delx.au - monosys/blobdiff - xfce4-genmon-script.c
aur-check-updates: don't complain if a newer version is installed locally
[monosys] / xfce4-genmon-script.c
index 4a02e355bf79c507e874bf62d6be5ee3910e6e20..c86426fb97d6a7d1ac3d9f9c6d84d9f27f774018 100644 (file)
@@ -49,13 +49,13 @@ char* read_file(char* filename) {
     }
 }
 
-int parse_int(char* s) {
+long parse_int(char* s) {
     if (s == NULL) {
         return -1;
     }
 
     errno = 0;
-    int value = strtol(s, NULL, 10);
+    long value = strtol(s, NULL, 10);
     if (errno != 0) {
         fprintf(stderr, "Failed to parse string: %s -- %s\n", strerror(errno), s);
         return -1;
@@ -133,13 +133,16 @@ int read_cpu_percent() {
     return 100 - (int)round(idle_jiffys_per_cpu_second);
 }
 
-int read_mem_free_mibis() {
+int read_meminfo(int* mem_free_mibis, int* mem_total_mibis) {
     char* meminfo = read_file("/proc/meminfo");
     if (meminfo == NULL) {
         fprintf(stderr, "Failed reading file /proc/meminfo: %s\n", strerror(errno));
         return -1;
     }
 
+    *mem_free_mibis = -1;
+    *mem_total_mibis = -1;
+
     while (*meminfo) {
         char* line = read_next_line(&meminfo);
         if (line == NULL) {
@@ -156,12 +159,21 @@ int read_mem_free_mibis() {
 
         if (strcmp(key, "MemAvailable") == 0) {
             int mem_available = parse_int(value_str);
-            return (int)round((double)mem_available / 1024);
+            *mem_free_mibis = (int)round((double)mem_available / 1024);
+        }
+
+        if (strcmp(key, "MemTotal") == 0) {
+            int mem_available = parse_int(value_str);
+            *mem_total_mibis = (int)round((double)mem_available / 1024);
         }
     }
 
-    fprintf(stderr, "Failed to find MemAvailable in /proc/meminfo\n");
-    return -1;
+    if (*mem_free_mibis < 0 || *mem_total_mibis < 0) {
+        fprintf(stderr, "Failed to find field in /proc/meminfo\n");
+        return -1;
+    } else {
+        return 0;
+    }
 }
 
 int read_zfs_arc_used_mibis() {
@@ -186,7 +198,7 @@ int read_zfs_arc_used_mibis() {
         }
 
         if (strcmp(key, "size") == 0) {
-            int arc_used = parse_int(value_str);
+            long arc_used = parse_int(value_str);
             return (int)round((double)arc_used / 1024 / 1024);
         }
     }
@@ -229,18 +241,22 @@ void print_red_threshold(
     }
 
     printf(
-        "%s <span color='%s'>%d</span>%s  ",
+        "%s <span color='%s'>%d</span>%s\n",
         name, color, value, units
     );
 }
 
 int main(int argc, char** argv) {
     char* show_flags = "cmb";
-    if (argc == 2) {
+    char* top_padding = "0";
+    if (argc >= 2) {
         show_flags = argv[1];
     }
+    if (argc >= 3) {
+        top_padding = argv[2];
+    }
 
-    printf("<txt>");
+    printf("<txt><span size=\"%s\">\n</span>", top_padding);
 
     if (strchr(show_flags, 'c')) {
         print_red_threshold(
@@ -251,10 +267,12 @@ int main(int argc, char** argv) {
     }
 
     if (strchr(show_flags, 'm')) {
+        int mem_free_mibis, mem_total_mibis;
+        read_meminfo(&mem_free_mibis, &mem_total_mibis);
         print_red_threshold(
             "mem", " MiB",
-            read_mem_free_mibis() + read_zfs_arc_used_mibis(),
-            0, 512
+            mem_free_mibis + read_zfs_arc_used_mibis(),
+            0, mem_total_mibis / 10
         );
     }