aboutsummaryrefslogtreecommitdiffstats
path: root/parse-events.c
diff options
context:
space:
mode:
Diffstat (limited to 'parse-events.c')
-rw-r--r--parse-events.c74
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 */
4470void *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);