diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2010-02-15 22:54:44 -0500 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2010-02-15 22:54:44 -0500 |
| commit | 4c56b91a773279bedf4e9ec945cf7eca0959f976 (patch) | |
| tree | 169b16ce56430d4c3ddc9a00b5405941f4b22625 | |
| parent | 67add772f442fd05ca8f97dc7149f10a6846ba88 (diff) | |
parse-events: Make filter add just events without filter
Let the filter string contain just events. This will make all
records that have this event match.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
| -rw-r--r-- | parse-filter.c | 56 |
1 files changed, 43 insertions, 13 deletions
diff --git a/parse-filter.c b/parse-filter.c index 156b7e9..3cfcb4a 100644 --- a/parse-filter.c +++ b/parse-filter.c | |||
| @@ -518,18 +518,16 @@ process_not(struct event_format *event, struct filter_arg **parg, | |||
| 518 | return type; | 518 | return type; |
| 519 | } | 519 | } |
| 520 | 520 | ||
| 521 | static int filter_event(struct event_filter *filter, | 521 | static int |
| 522 | struct event_format *event, | 522 | process_event(struct event_format *event, const char *filter_str, |
| 523 | const char *filter_str, char **error_str) | 523 | struct filter_arg **parg, char **error_str) |
| 524 | { | 524 | { |
| 525 | struct filter_type *filter_type; | ||
| 526 | enum event_type type; | 525 | enum event_type type; |
| 527 | struct filter_arg *arg; | ||
| 528 | char *token; | 526 | char *token; |
| 529 | 527 | ||
| 530 | pevent_buffer_init(filter_str, strlen(filter_str)); | 528 | pevent_buffer_init(filter_str, strlen(filter_str)); |
| 531 | 529 | ||
| 532 | type = process_token(event, &arg, &token, error_str, 1); | 530 | type = process_token(event, parg, &token, error_str, 1); |
| 533 | 531 | ||
| 534 | if (type == EVENT_ERROR) | 532 | if (type == EVENT_ERROR) |
| 535 | return -1; | 533 | return -1; |
| @@ -539,9 +537,31 @@ static int filter_event(struct event_filter *filter, | |||
| 539 | "Expected end where %s was found", | 537 | "Expected end where %s was found", |
| 540 | token); | 538 | token); |
| 541 | free_token(token); | 539 | free_token(token); |
| 542 | free_arg(arg); | 540 | free_arg(*parg); |
| 541 | *parg = NULL; | ||
| 543 | return -1; | 542 | return -1; |
| 544 | } | 543 | } |
| 544 | return 0; | ||
| 545 | } | ||
| 546 | |||
| 547 | static int filter_event(struct event_filter *filter, | ||
| 548 | struct event_format *event, | ||
| 549 | const char *filter_str, char **error_str) | ||
| 550 | { | ||
| 551 | struct filter_type *filter_type; | ||
| 552 | struct filter_arg *arg; | ||
| 553 | int ret; | ||
| 554 | |||
| 555 | if (filter_str) { | ||
| 556 | ret = process_event(event, filter_str, &arg, error_str); | ||
| 557 | if (ret < 0) | ||
| 558 | return ret; | ||
| 559 | } else { | ||
| 560 | /* just add a TRUE arg */ | ||
| 561 | arg = allocate_arg(); | ||
| 562 | arg->type = FILTER_ARG_BOOLEAN; | ||
| 563 | arg->bool.value = FILTER_TRUE; | ||
| 564 | } | ||
| 545 | 565 | ||
| 546 | filter_type = add_filter_type(filter, event->id); | 566 | filter_type = add_filter_type(filter, event->id); |
| 547 | if (filter_type->filter) | 567 | if (filter_type->filter) |
| @@ -577,25 +597,35 @@ int pevent_filter_add_filter_str(struct event_filter *filter, | |||
| 577 | char *sys_name = NULL; | 597 | char *sys_name = NULL; |
| 578 | char *token; | 598 | char *token; |
| 579 | int rtn = 0; | 599 | int rtn = 0; |
| 600 | int len; | ||
| 580 | int ret; | 601 | int ret; |
| 581 | 602 | ||
| 582 | if (error_str) | 603 | if (error_str) |
| 583 | *error_str = NULL; | 604 | *error_str = NULL; |
| 584 | 605 | ||
| 585 | filter_start = strchr(filter_str, ':'); | 606 | filter_start = strchr(filter_str, ':'); |
| 586 | if (!filter_start) { | 607 | if (filter_start) { |
| 587 | show_error(error_str, "No filter found"); | 608 | len = filter_start - filter_str; |
| 588 | return -1; | 609 | filter_start++; |
| 589 | } | 610 | } else |
| 611 | len = strlen(filter_str); | ||
| 590 | 612 | ||
| 591 | pevent_buffer_init(filter_str, filter_start - filter_str); | 613 | pevent_buffer_init(filter_str, len); |
| 592 | 614 | ||
| 593 | again: | 615 | again: |
| 594 | type = read_token(&token); | 616 | type = read_token(&token); |
| 617 | if (type == EVENT_NONE) { | ||
| 618 | show_error(error_str, "No filter found"); | ||
| 619 | /* This can only happen when events is NULL, but still */ | ||
| 620 | free_events(events); | ||
| 621 | return -1; | ||
| 622 | } | ||
| 623 | |||
| 595 | if (type != EVENT_ITEM) { | 624 | if (type != EVENT_ITEM) { |
| 596 | show_error(error_str, "Expected an event name but got %s", | 625 | show_error(error_str, "Expected an event name but got %s", |
| 597 | token); | 626 | token); |
| 598 | free_token(token); | 627 | free_token(token); |
| 628 | free_events(events); | ||
| 599 | return -1; | 629 | return -1; |
| 600 | } | 630 | } |
| 601 | 631 | ||
| @@ -657,7 +687,7 @@ int pevent_filter_add_filter_str(struct event_filter *filter, | |||
| 657 | 687 | ||
| 658 | /* filter starts here */ | 688 | /* filter starts here */ |
| 659 | for (event = events; event; event = event->next) { | 689 | for (event = events; event; event = event->next) { |
| 660 | ret = filter_event(filter, event->event, filter_start + 1, | 690 | ret = filter_event(filter, event->event, filter_start, |
| 661 | error_str); | 691 | error_str); |
| 662 | /* Failures are returned if a parse error happened */ | 692 | /* Failures are returned if a parse error happened */ |
| 663 | if (ret < 0) | 693 | if (ret < 0) |
