diff options
Diffstat (limited to 'trace-filter.c')
-rw-r--r-- | trace-filter.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/trace-filter.c b/trace-filter.c index 904c9cb..efdb5fa 100644 --- a/trace-filter.c +++ b/trace-filter.c | |||
@@ -2209,3 +2209,78 @@ int trace_filter_save_tasks(struct tracecmd_xml_handle *handle, | |||
2209 | { | 2209 | { |
2210 | return 0; | 2210 | return 0; |
2211 | } | 2211 | } |
2212 | |||
2213 | int trace_filter_load_events(struct event_filter *event_filter, | ||
2214 | struct tracecmd_xml_handle *handle, | ||
2215 | struct tracecmd_xml_system_node *node) | ||
2216 | { | ||
2217 | struct tracecmd_xml_system_node *child; | ||
2218 | const char *name; | ||
2219 | const char *system; | ||
2220 | const char *event; | ||
2221 | const char *value; | ||
2222 | char *buffer; | ||
2223 | |||
2224 | while (node) { | ||
2225 | name = tracecmd_xml_node_type(node); | ||
2226 | |||
2227 | if (strcmp(name, "System") == 0) { | ||
2228 | system = tracecmd_xml_node_value(handle, node); | ||
2229 | pevent_filter_add_filter_str(event_filter, | ||
2230 | system, NULL); | ||
2231 | } else if (strcmp(name, "Event") == 0) { | ||
2232 | system = NULL; | ||
2233 | event = NULL; | ||
2234 | value = NULL; | ||
2235 | child = tracecmd_xml_node_child(node); | ||
2236 | if (!child) | ||
2237 | return -1; | ||
2238 | do { | ||
2239 | name = tracecmd_xml_node_type(child); | ||
2240 | if (strcmp(name, "System") == 0) | ||
2241 | system = tracecmd_xml_node_value(handle, child); | ||
2242 | else if (strcmp(name, "Name") == 0) | ||
2243 | event = tracecmd_xml_node_value(handle, child); | ||
2244 | else if (strcmp(name, "Advanced") == 0) | ||
2245 | value = tracecmd_xml_node_value(handle, child); | ||
2246 | child = tracecmd_xml_node_next(child); | ||
2247 | } while (child); | ||
2248 | |||
2249 | if (event || system) { | ||
2250 | if (event && system) { | ||
2251 | if (value) { | ||
2252 | buffer = malloc_or_die(strlen(event) + | ||
2253 | strlen(system) + | ||
2254 | strlen(value) + 3); | ||
2255 | sprintf(buffer, "%s/%s:%s", | ||
2256 | system, event, value); | ||
2257 | } else { | ||
2258 | buffer = malloc_or_die(strlen(event) + | ||
2259 | strlen(system) + 2); | ||
2260 | sprintf(buffer, "%s/%s", | ||
2261 | system, event); | ||
2262 | } | ||
2263 | } else { | ||
2264 | if (!event) | ||
2265 | event = system; | ||
2266 | if (value) { | ||
2267 | buffer = malloc_or_die(strlen(event) + | ||
2268 | strlen(value) + 2); | ||
2269 | sprintf(buffer, "%s:%s", | ||
2270 | event, value); | ||
2271 | } else { | ||
2272 | buffer = malloc_or_die(strlen(event) + 1); | ||
2273 | sprintf(buffer, "%s", event); | ||
2274 | } | ||
2275 | } | ||
2276 | pevent_filter_add_filter_str(event_filter, | ||
2277 | buffer, NULL); | ||
2278 | free(buffer); | ||
2279 | } | ||
2280 | } | ||
2281 | |||
2282 | node = tracecmd_xml_node_next(node); | ||
2283 | } | ||
2284 | |||
2285 | return 0; | ||
2286 | } | ||