diff options
-rw-r--r-- | tools/lib/traceevent/event-parse.h | 6 | ||||
-rw-r--r-- | tools/lib/traceevent/event-plugin.c | 60 |
2 files changed, 59 insertions, 7 deletions
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h index 8bd7c6a4cbd7..8ca1b8ee50da 100644 --- a/tools/lib/traceevent/event-parse.h +++ b/tools/lib/traceevent/event-parse.h | |||
@@ -116,7 +116,7 @@ struct pevent_plugin_option { | |||
116 | char *name; | 116 | char *name; |
117 | char *plugin_alias; | 117 | char *plugin_alias; |
118 | char *description; | 118 | char *description; |
119 | char *value; | 119 | const char *value; |
120 | void *priv; | 120 | void *priv; |
121 | int set; | 121 | int set; |
122 | }; | 122 | }; |
@@ -154,6 +154,10 @@ struct pevent_plugin_option { | |||
154 | * .plugin_alias is used to give a shorter name to access | 154 | * .plugin_alias is used to give a shorter name to access |
155 | * the vairable. Useful if a plugin handles more than one event. | 155 | * the vairable. Useful if a plugin handles more than one event. |
156 | * | 156 | * |
157 | * If .value is not set, then it is considered a boolean and only | ||
158 | * .set will be processed. If .value is defined, then it is considered | ||
159 | * a string option and .set will be ignored. | ||
160 | * | ||
157 | * PEVENT_PLUGIN_ALIAS: (optional) | 161 | * PEVENT_PLUGIN_ALIAS: (optional) |
158 | * The name to use for finding options (uses filename if not defined) | 162 | * The name to use for finding options (uses filename if not defined) |
159 | */ | 163 | */ |
diff --git a/tools/lib/traceevent/event-plugin.c b/tools/lib/traceevent/event-plugin.c index 136162c03af1..a16756ae3526 100644 --- a/tools/lib/traceevent/event-plugin.c +++ b/tools/lib/traceevent/event-plugin.c | |||
@@ -18,6 +18,7 @@ | |||
18 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 18 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #include <ctype.h> | ||
21 | #include <stdio.h> | 22 | #include <stdio.h> |
22 | #include <string.h> | 23 | #include <string.h> |
23 | #include <dlfcn.h> | 24 | #include <dlfcn.h> |
@@ -49,6 +50,52 @@ struct plugin_list { | |||
49 | void *handle; | 50 | void *handle; |
50 | }; | 51 | }; |
51 | 52 | ||
53 | static void lower_case(char *str) | ||
54 | { | ||
55 | if (!str) | ||
56 | return; | ||
57 | for (; *str; str++) | ||
58 | *str = tolower(*str); | ||
59 | } | ||
60 | |||
61 | static int update_option_value(struct pevent_plugin_option *op, const char *val) | ||
62 | { | ||
63 | char *op_val; | ||
64 | |||
65 | if (!val) { | ||
66 | /* toggle, only if option is boolean */ | ||
67 | if (op->value) | ||
68 | /* Warn? */ | ||
69 | return 0; | ||
70 | op->set ^= 1; | ||
71 | return 0; | ||
72 | } | ||
73 | |||
74 | /* | ||
75 | * If the option has a value then it takes a string | ||
76 | * otherwise the option is a boolean. | ||
77 | */ | ||
78 | if (op->value) { | ||
79 | op->value = val; | ||
80 | return 0; | ||
81 | } | ||
82 | |||
83 | /* Option is boolean, must be either "1", "0", "true" or "false" */ | ||
84 | |||
85 | op_val = strdup(val); | ||
86 | if (!op_val) | ||
87 | return -1; | ||
88 | lower_case(op_val); | ||
89 | |||
90 | if (strcmp(val, "1") == 0 || strcmp(val, "true") == 0) | ||
91 | op->set = 1; | ||
92 | else if (strcmp(val, "0") == 0 || strcmp(val, "false") == 0) | ||
93 | op->set = 0; | ||
94 | free(op_val); | ||
95 | |||
96 | return 0; | ||
97 | } | ||
98 | |||
52 | /** | 99 | /** |
53 | * traceevent_plugin_list_options - get list of plugin options | 100 | * traceevent_plugin_list_options - get list of plugin options |
54 | * | 101 | * |
@@ -120,6 +167,7 @@ update_option(const char *file, struct pevent_plugin_option *option) | |||
120 | { | 167 | { |
121 | struct trace_plugin_options *op; | 168 | struct trace_plugin_options *op; |
122 | char *plugin; | 169 | char *plugin; |
170 | int ret = 0; | ||
123 | 171 | ||
124 | if (option->plugin_alias) { | 172 | if (option->plugin_alias) { |
125 | plugin = strdup(option->plugin_alias); | 173 | plugin = strdup(option->plugin_alias); |
@@ -144,9 +192,10 @@ update_option(const char *file, struct pevent_plugin_option *option) | |||
144 | if (strcmp(op->option, option->name) != 0) | 192 | if (strcmp(op->option, option->name) != 0) |
145 | continue; | 193 | continue; |
146 | 194 | ||
147 | option->value = op->value; | 195 | ret = update_option_value(option, op->value); |
148 | option->set ^= 1; | 196 | if (ret) |
149 | goto out; | 197 | goto out; |
198 | break; | ||
150 | } | 199 | } |
151 | 200 | ||
152 | /* first look for unnamed options */ | 201 | /* first look for unnamed options */ |
@@ -156,14 +205,13 @@ update_option(const char *file, struct pevent_plugin_option *option) | |||
156 | if (strcmp(op->option, option->name) != 0) | 205 | if (strcmp(op->option, option->name) != 0) |
157 | continue; | 206 | continue; |
158 | 207 | ||
159 | option->value = op->value; | 208 | ret = update_option_value(option, op->value); |
160 | option->set ^= 1; | ||
161 | break; | 209 | break; |
162 | } | 210 | } |
163 | 211 | ||
164 | out: | 212 | out: |
165 | free(plugin); | 213 | free(plugin); |
166 | return 0; | 214 | return ret; |
167 | } | 215 | } |
168 | 216 | ||
169 | /** | 217 | /** |