diff options
Diffstat (limited to 'parse-events.c')
-rw-r--r-- | parse-events.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/parse-events.c b/parse-events.c index 53dc8ad..b6abd51 100644 --- a/parse-events.c +++ b/parse-events.c | |||
@@ -2180,6 +2180,7 @@ process_dynamic_array(struct event_format *event, struct print_arg *arg, char ** | |||
2180 | if (read_expected(EVENT_DELIM, ")") < 0) | 2180 | if (read_expected(EVENT_DELIM, ")") < 0) |
2181 | goto out_free; | 2181 | goto out_free; |
2182 | 2182 | ||
2183 | free_token(token); | ||
2183 | type = read_token_item(&token); | 2184 | type = read_token_item(&token); |
2184 | *tok = token; | 2185 | *tok = token; |
2185 | if (type != EVENT_OP || strcmp(token, "[") != 0) | 2186 | if (type != EVENT_OP || strcmp(token, "[") != 0) |
@@ -2887,7 +2888,9 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg | |||
2887 | case PRINT_FUNC: { | 2888 | case PRINT_FUNC: { |
2888 | struct trace_seq s; | 2889 | struct trace_seq s; |
2889 | trace_seq_init(&s); | 2890 | trace_seq_init(&s); |
2890 | return process_defined_func(&s, data, size, event, arg); | 2891 | val = process_defined_func(&s, data, size, event, arg); |
2892 | trace_seq_destroy(&s); | ||
2893 | return val; | ||
2891 | } | 2894 | } |
2892 | case PRINT_OP: | 2895 | case PRINT_OP: |
2893 | if (strcmp(arg->op.op, "[") == 0) { | 2896 | if (strcmp(arg->op.op, "[") == 0) { |
@@ -3220,6 +3223,7 @@ process_defined_func(struct trace_seq *s, void *data, int size, | |||
3220 | string->next = strings; | 3223 | string->next = strings; |
3221 | string->str = strdup(str.buffer); | 3224 | string->str = strdup(str.buffer); |
3222 | strings = string; | 3225 | strings = string; |
3226 | trace_seq_destroy(&str); | ||
3223 | break; | 3227 | break; |
3224 | default: | 3228 | default: |
3225 | /* | 3229 | /* |
@@ -3314,6 +3318,8 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc | |||
3314 | ~3); | 3318 | ~3); |
3315 | switch (ls) { | 3319 | switch (ls) { |
3316 | case 0: | 3320 | case 0: |
3321 | ls = 4; | ||
3322 | break; | ||
3317 | case 1: | 3323 | case 1: |
3318 | ls = pevent->long_size; | 3324 | ls = pevent->long_size; |
3319 | break; | 3325 | break; |
@@ -3879,6 +3885,11 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s, | |||
3879 | usecs = record->ts - secs * NSECS_PER_SEC; | 3885 | usecs = record->ts - secs * NSECS_PER_SEC; |
3880 | usecs = (usecs + 500) / NSECS_PER_USEC; | 3886 | usecs = (usecs + 500) / NSECS_PER_USEC; |
3881 | 3887 | ||
3888 | if (record->size < 0) { | ||
3889 | do_warning("ug! negative record size %d", record->size); | ||
3890 | return; | ||
3891 | } | ||
3892 | |||
3882 | type = trace_parse_common_type(pevent, data); | 3893 | type = trace_parse_common_type(pevent, data); |
3883 | 3894 | ||
3884 | event = pevent_find_event(pevent, type); | 3895 | event = pevent_find_event(pevent, type); |
@@ -4090,6 +4101,7 @@ static void print_args(struct print_arg *args) | |||
4090 | trace_seq_init(&s); | 4101 | trace_seq_init(&s); |
4091 | print_fields(&s, args->flags.flags); | 4102 | print_fields(&s, args->flags.flags); |
4092 | trace_seq_do_printf(&s); | 4103 | trace_seq_do_printf(&s); |
4104 | trace_seq_destroy(&s); | ||
4093 | printf(")"); | 4105 | printf(")"); |
4094 | break; | 4106 | break; |
4095 | case PRINT_SYMBOL: | 4107 | case PRINT_SYMBOL: |
@@ -4099,6 +4111,7 @@ static void print_args(struct print_arg *args) | |||
4099 | trace_seq_init(&s); | 4111 | trace_seq_init(&s); |
4100 | print_fields(&s, args->symbol.symbols); | 4112 | print_fields(&s, args->symbol.symbols); |
4101 | trace_seq_do_printf(&s); | 4113 | trace_seq_do_printf(&s); |
4114 | trace_seq_destroy(&s); | ||
4102 | printf(")"); | 4115 | printf(")"); |
4103 | break; | 4116 | break; |
4104 | case PRINT_STRING: | 4117 | case PRINT_STRING: |
@@ -4441,6 +4454,56 @@ int get_field_val(struct trace_seq *s, struct format_field *field, | |||
4441 | } | 4454 | } |
4442 | 4455 | ||
4443 | /** | 4456 | /** |
4457 | * pevent_get_field_raw - return the raw pointer into the data field | ||
4458 | * @s: The seq to print to on error | ||
4459 | * @event: the event that the field is for | ||
4460 | * @name: The name of the field | ||
4461 | * @record: The record with the field name. | ||
4462 | * @len: place to store the field length. | ||
4463 | * @err: print default error if failed. | ||
4464 | * | ||
4465 | * Returns a pointer into record->data of the field and places | ||
4466 | * the length of the field in @len. | ||
4467 | * | ||
4468 | * On failure, it returns NULL. | ||
4469 | */ | ||
4470 | void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event, | ||
4471 | const char *name, struct record *record, | ||
4472 | int *len, int err) | ||
4473 | { | ||
4474 | struct format_field *field; | ||
4475 | void *data = record->data; | ||
4476 | unsigned offset; | ||
4477 | int dummy; | ||
4478 | |||
4479 | if (!event) | ||
4480 | return NULL; | ||
4481 | |||
4482 | field = pevent_find_field(event, name); | ||
4483 | |||
4484 | if (!field) { | ||
4485 | if (err) | ||
4486 | trace_seq_printf(s, "<CANT FIND FIELD %s>", name); | ||
4487 | return NULL; | ||
4488 | } | ||
4489 | |||
4490 | /* Allow @len to be NULL */ | ||
4491 | if (!len) | ||
4492 | len = &dummy; | ||
4493 | |||
4494 | offset = field->offset; | ||
4495 | if (field->flags & FIELD_IS_DYNAMIC) { | ||
4496 | offset = pevent_read_number(event->pevent, | ||
4497 | data + offset, field->size); | ||
4498 | *len = offset >> 16; | ||
4499 | offset &= 0xffff; | ||
4500 | } else | ||
4501 | *len = field->size; | ||
4502 | |||
4503 | return data + offset; | ||
4504 | } | ||
4505 | |||
4506 | /** | ||
4444 | * pevent_get_field_val - find a field and return its value | 4507 | * pevent_get_field_val - find a field and return its value |
4445 | * @s: The seq to print to on error | 4508 | * @s: The seq to print to on error |
4446 | * @event: the event that the field is for | 4509 | * @event: the event that the field is for |
@@ -4457,6 +4520,9 @@ int pevent_get_field_val(struct trace_seq *s, struct event_format *event, | |||
4457 | { | 4520 | { |
4458 | struct format_field *field; | 4521 | struct format_field *field; |
4459 | 4522 | ||
4523 | if (!event) | ||
4524 | return -1; | ||
4525 | |||
4460 | field = pevent_find_field(event, name); | 4526 | field = pevent_find_field(event, name); |
4461 | 4527 | ||
4462 | return get_field_val(s, field, name, record, val, err); | 4528 | return get_field_val(s, field, name, record, val, err); |
@@ -4479,6 +4545,9 @@ int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event, | |||
4479 | { | 4545 | { |
4480 | struct format_field *field; | 4546 | struct format_field *field; |
4481 | 4547 | ||
4548 | if (!event) | ||
4549 | return -1; | ||
4550 | |||
4482 | field = pevent_find_common_field(event, name); | 4551 | field = pevent_find_common_field(event, name); |
4483 | 4552 | ||
4484 | return get_field_val(s, field, name, record, val, err); | 4553 | return get_field_val(s, field, name, record, val, err); |
@@ -4501,6 +4570,9 @@ int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event, | |||
4501 | { | 4570 | { |
4502 | struct format_field *field; | 4571 | struct format_field *field; |
4503 | 4572 | ||
4573 | if (!event) | ||
4574 | return -1; | ||
4575 | |||
4504 | field = pevent_find_any_field(event, name); | 4576 | field = pevent_find_any_field(event, name); |
4505 | 4577 | ||
4506 | return get_field_val(s, field, name, record, val, err); | 4578 | return get_field_val(s, field, name, record, val, err); |