char                            *name;
        char                            *plugin_alias;
        char                            *description;
-       char                            *value;
+       const char                      *value;
        void                            *priv;
        int                             set;
 };
  *   .plugin_alias is used to give a shorter name to access
  *   the vairable. Useful if a plugin handles more than one event.
  *
+ *   If .value is not set, then it is considered a boolean and only
+ *   .set will be processed. If .value is defined, then it is considered
+ *   a string option and .set will be ignored.
+ *
  * PEVENT_PLUGIN_ALIAS: (optional)
  *   The name to use for finding options (uses filename if not defined)
  */
 
  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  */
 
+#include <ctype.h>
 #include <stdio.h>
 #include <string.h>
 #include <dlfcn.h>
        void                    *handle;
 };
 
+static void lower_case(char *str)
+{
+       if (!str)
+               return;
+       for (; *str; str++)
+               *str = tolower(*str);
+}
+
+static int update_option_value(struct pevent_plugin_option *op, const char *val)
+{
+       char *op_val;
+
+       if (!val) {
+               /* toggle, only if option is boolean */
+               if (op->value)
+                       /* Warn? */
+                       return 0;
+               op->set ^= 1;
+               return 0;
+       }
+
+       /*
+        * If the option has a value then it takes a string
+        * otherwise the option is a boolean.
+        */
+       if (op->value) {
+               op->value = val;
+               return 0;
+       }
+
+       /* Option is boolean, must be either "1", "0", "true" or "false" */
+
+       op_val = strdup(val);
+       if (!op_val)
+               return -1;
+       lower_case(op_val);
+
+       if (strcmp(val, "1") == 0 || strcmp(val, "true") == 0)
+               op->set = 1;
+       else if (strcmp(val, "0") == 0 || strcmp(val, "false") == 0)
+               op->set = 0;
+       free(op_val);
+
+       return 0;
+}
+
 /**
  * traceevent_plugin_list_options - get list of plugin options
  *
 {
        struct trace_plugin_options *op;
        char *plugin;
+       int ret = 0;
 
        if (option->plugin_alias) {
                plugin = strdup(option->plugin_alias);
                if (strcmp(op->option, option->name) != 0)
                        continue;
 
-               option->value = op->value;
-               option->set ^= 1;
-               goto out;
+               ret = update_option_value(option, op->value);
+               if (ret)
+                       goto out;
+               break;
        }
 
        /* first look for unnamed options */
                if (strcmp(op->option, option->name) != 0)
                        continue;
 
-               option->value = op->value;
-               option->set ^= 1;
+               ret = update_option_value(option, op->value);
                break;
        }
 
  out:
        free(plugin);
-       return 0;
+       return ret;
 }
 
 /**