Fix device name parsing for diskio variables.
[monky] / src / exec.c
index a8dfd0c..286079a 100644 (file)
@@ -10,7 +10,7 @@
  * Please see COPYING for details
  *
  * Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen
- * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al.
+ * Copyright (c) 2005-2010 Brenden Matthews, Philip Kovacs, et. al.
  *     (see AUTHORS)
  * All rights reserved.
  *
 #include "logging.h"
 #include "specials.h"
 #include "text_object.h"
+#include "timed_thread.h"
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <unistd.h>
 
 struct execi_data {
        double last_update;
@@ -44,6 +46,7 @@ struct execi_data {
        char *buffer;
        double data;
        timed_thread *p_timed_thread;
+       float barnum;
 };
 
 /* FIXME: this will probably not work, since the variable is being reused
@@ -234,6 +237,25 @@ void scan_execi_arg(struct text_object *obj, const char *arg)
        obj->data.opaque = ed;
 }
 
+#ifdef X11
+void scan_execgraph_arg(struct text_object *obj, const char *arg)
+{
+       struct execi_data *ed;
+       char *buf;
+
+       ed = malloc(sizeof(struct execi_data));
+       memset(ed, 0, sizeof(struct execi_data));
+
+       buf = scan_graph(obj, arg, 100);
+       if (!buf) {
+               NORM_ERR("missing command argument to execgraph object");
+               return;
+       }
+       ed->cmd = buf;
+       obj->data.opaque = ed;
+}
+#endif /* X11 */
+
 void print_exec(struct text_object *obj, char *p, int p_max_size)
 {
        read_exec(obj->data.s, p, p_max_size);
@@ -244,15 +266,20 @@ void print_execp(struct text_object *obj, char *p, int p_max_size)
 {
        struct information *tmp_info;
        struct text_object subroot;
+       char *buf;
 
-       read_exec(obj->data.s, p, p_max_size);
+       buf = malloc(text_buffer_size);
+       memset(buf, 0, text_buffer_size);
+
+       read_exec(obj->data.s, buf, text_buffer_size);
 
        tmp_info = malloc(sizeof(struct information));
        memcpy(tmp_info, &info, sizeof(struct information));
-       parse_conky_vars(&subroot, p, p, tmp_info);
+       parse_conky_vars(&subroot, buf, p, p_max_size, tmp_info);
 
        free_text_objects(&subroot, 1);
        free(tmp_info);
+       free(buf);
 }
 
 void print_execi(struct text_object *obj, char *p, int p_max_size)
@@ -271,7 +298,7 @@ void print_execi(struct text_object *obj, char *p, int p_max_size)
        snprintf(p, p_max_size, "%s", ed->buffer);
 }
 
-void print_execpi(struct text_object *obj, char *p)
+void print_execpi(struct text_object *obj, char *p, int p_max_size)
 {
        struct execi_data *ed = obj->data.opaque;
        struct text_object subroot;
@@ -283,9 +310,7 @@ void print_execpi(struct text_object *obj, char *p)
        tmp_info = malloc(sizeof(struct information));
        memcpy(tmp_info, &info, sizeof(struct information));
 
-       if (!time_to_update(ed)) {
-               parse_conky_vars(&subroot, ed->buffer, p, tmp_info);
-       } else {
+       if (time_to_update(ed)) {
                char *output;
                int length;
                FILE *fp = pid_popen(ed->cmd, "r", &childpid);
@@ -302,9 +327,9 @@ void print_execpi(struct text_object *obj, char *p)
                        output[length - 1] = '\0';
                }
 
-               parse_conky_vars(&subroot, ed->buffer, p, tmp_info);
                ed->last_update = current_update_time;
        }
+       parse_conky_vars(&subroot, ed->buffer, p, p_max_size, tmp_info);
        free_text_objects(&subroot, 1);
        free(tmp_info);
 }
@@ -336,7 +361,6 @@ void print_texeci(struct text_object *obj, char *p, int p_max_size)
        }
 }
 
-#ifdef X11
 void print_execgauge(struct text_object *obj, char *p, int p_max_size)
 {
        double barnum;
@@ -346,37 +370,24 @@ void print_execgauge(struct text_object *obj, char *p, int p_max_size)
 
        if (barnum >= 0.0) {
                barnum /= 100;
-               new_gauge(p, obj->a, obj->b, round_to_int(barnum * 255.0));
+               new_gauge(obj, p, p_max_size, round_to_int(barnum * 255.0));
        }
 }
 
+#ifdef X11
 void print_execgraph(struct text_object *obj, char *p, int p_max_size)
 {
-       char showaslog = FALSE;
-       char tempgrad = FALSE;
        double barnum;
        struct execi_data *ed = obj->data.opaque;
-       char *cmd;
 
        if (!ed)
                return;
 
-       cmd = ed->cmd;
-
-       if (strstr(cmd, " "TEMPGRAD) && strlen(cmd) > strlen(" "TEMPGRAD)) {
-               tempgrad = TRUE;
-               cmd += strlen(" "TEMPGRAD);
-       }
-       if (strstr(cmd, " "LOGGRAPH) && strlen(cmd) > strlen(" "LOGGRAPH)) {
-               showaslog = TRUE;
-               cmd += strlen(" "LOGGRAPH);
-       }
-       read_exec(cmd, p, p_max_size);
+       read_exec(ed->cmd, p, p_max_size);
        barnum = get_barnum(p);
 
        if (barnum > 0) {
-               new_graph(p, obj->a, obj->b, obj->c, obj->d, round_to_int(barnum),
-                               100, 1, showaslog, tempgrad);
+               new_graph(obj, p, p_max_size, round_to_int(barnum));
        }
 }
 
@@ -389,30 +400,18 @@ void print_execigraph(struct text_object *obj, char *p, int p_max_size)
 
        if (time_to_update(ed)) {
                double barnum;
-               char showaslog = FALSE;
-               char tempgrad = FALSE;
-               char *cmd = ed->cmd;
 
-               if (strstr(cmd, " "TEMPGRAD) && strlen(cmd) > strlen(" "TEMPGRAD)) {
-                       tempgrad = TRUE;
-                       cmd += strlen(" "TEMPGRAD);
-               }
-               if (strstr(cmd, " "LOGGRAPH) && strlen(cmd) > strlen(" "LOGGRAPH)) {
-                       showaslog = TRUE;
-                       cmd += strlen(" "LOGGRAPH);
-               }
-               obj->char_a = showaslog;
-               obj->char_b = tempgrad;
-               read_exec(cmd, p, p_max_size);
+               read_exec(ed->cmd, p, p_max_size);
                barnum = get_barnum(p);
 
                if (barnum >= 0.0) {
-                       obj->f = barnum;
+                       ed->barnum = barnum;
                }
                ed->last_update = current_update_time;
        }
-       new_graph(p, obj->a, obj->b, obj->c, obj->d, (int) (obj->f), 100, 1, obj->char_a, obj->char_b);
+       new_graph(obj, p, p_max_size, (int) (ed->barnum));
 }
+#endif /* X11 */
 
 void print_execigauge(struct text_object *obj, char *p, int p_max_size)
 {
@@ -428,13 +427,12 @@ void print_execigauge(struct text_object *obj, char *p, int p_max_size)
                barnum = get_barnum(p);
 
                if (barnum >= 0.0) {
-                       obj->f = 255 * barnum / 100.0;
+                       ed->barnum = 255 * barnum / 100.0;
                }
                ed->last_update = current_update_time;
        }
-       new_gauge(p, obj->a, obj->b, round_to_int(obj->f));
+       new_gauge(obj, p, p_max_size, round_to_int(ed->barnum));
 }
-#endif /* X11 */
 
 void print_execbar(struct text_object *obj, char *p, int p_max_size)
 {
@@ -443,16 +441,8 @@ void print_execbar(struct text_object *obj, char *p, int p_max_size)
        barnum = get_barnum(p);
 
        if (barnum >= 0.0) {
-#ifdef X11
-               if(output_methods & TO_X) {
-                       barnum /= 100;
-                       new_bar(p, obj->a, obj->b, round_to_int(barnum * 255.0));
-               }else
-#endif /* X11 */
-               {
-                       if(!obj->a) obj->a = DEFAULT_BAR_WIDTH_NO_X;
-                       new_bar_in_shell(p, p_max_size, barnum, obj->a);
-               }
+               barnum /= 100;
+               new_bar(obj, p, p_max_size, round_to_int(barnum * 255.0));
        }
 }
 
@@ -469,19 +459,11 @@ void print_execibar(struct text_object *obj, char *p, int p_max_size)
                barnum = get_barnum(p);
 
                if (barnum >= 0.0) {
-                       obj->f = barnum;
+                       ed->barnum = barnum;
                }
                ed->last_update = current_update_time;
        }
-#ifdef X11
-       if(output_methods & TO_X) {
-               new_bar(p, obj->a, obj->b, round_to_int(obj->f * 2.55));
-       } else
-#endif /* X11 */
-       {
-               if(!obj->a) obj->a = DEFAULT_BAR_WIDTH_NO_X;
-               new_bar_in_shell(p, p_max_size, round_to_int(obj->f), obj->a);
-       }
+       new_bar(obj, p, p_max_size, round_to_int(ed->barnum * 2.55));
 }
 
 void free_exec(struct text_object *obj)