aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-06-17 16:20:46 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-06-17 16:20:46 -0400
commit11c82fa61b369684e8d4761c82712d8c7de978b7 (patch)
tree16b0b75e936e80e4f6231840d44b034e3f7b533a
parent315ff6f8c9e9e899d655d75d5f5203c8b0047b0b (diff)
parse-events: Use all the printf fields of a %s
If a %s has options like %8.2s, we still want to process it. Pass the format off to the string processing to do so. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--parse-events.c61
1 files changed, 33 insertions, 28 deletions
diff --git a/parse-events.c b/parse-events.c
index c0118aa..082fe3b 100644
--- a/parse-events.c
+++ b/parse-events.c
@@ -3041,15 +3041,23 @@ static unsigned long long eval_flag(const char *flag)
3041 return 0; 3041 return 0;
3042} 3042}
3043 3043
3044static void print_str_to_seq(struct trace_seq *s, const char *format,
3045 int len_arg, const char *str)
3046{
3047 if (len_arg >= 0)
3048 trace_seq_printf(s, format, len_arg, str);
3049 else
3050 trace_seq_printf(s, format, str);
3051}
3052
3044static void print_str_arg(struct trace_seq *s, void *data, int size, 3053static void print_str_arg(struct trace_seq *s, void *data, int size,
3045 struct event_format *event, 3054 struct event_format *event, const char *format,
3046 int len_arg, struct print_arg *arg) 3055 int len_arg, struct print_arg *arg)
3047{ 3056{
3048 struct pevent *pevent = event->pevent; 3057 struct pevent *pevent = event->pevent;
3049 struct print_flag_sym *flag; 3058 struct print_flag_sym *flag;
3050 unsigned long long val, fval; 3059 unsigned long long val, fval;
3051 unsigned long addr; 3060 unsigned long addr;
3052 int len_as_arg = len_arg >= 0;
3053 char *str; 3061 char *str;
3054 int print; 3062 int print;
3055 int len; 3063 int len;
@@ -3059,7 +3067,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
3059 /* ?? */ 3067 /* ?? */
3060 return; 3068 return;
3061 case PRINT_ATOM: 3069 case PRINT_ATOM:
3062 trace_seq_puts(s, arg->atom.atom); 3070 print_str_to_seq(s, format, len_arg, arg->atom.atom);
3063 return; 3071 return;
3064 case PRINT_FIELD: 3072 case PRINT_FIELD:
3065 if (!arg->field.field) { 3073 if (!arg->field.field) {
@@ -3084,10 +3092,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
3084 str = malloc_or_die(len + 1); 3092 str = malloc_or_die(len + 1);
3085 memcpy(str, data + arg->field.field->offset, len); 3093 memcpy(str, data + arg->field.field->offset, len);
3086 str[len] = 0; 3094 str[len] = 0;
3087 if (len_as_arg) 3095 print_str_to_seq(s, format, len_arg, str);
3088 trace_seq_printf(s, "%.*s", len_arg, str);
3089 else
3090 trace_seq_puts(s, str);
3091 free(str); 3096 free(str);
3092 break; 3097 break;
3093 case PRINT_FLAGS: 3098 case PRINT_FLAGS:
@@ -3096,19 +3101,13 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
3096 for (flag = arg->flags.flags; flag; flag = flag->next) { 3101 for (flag = arg->flags.flags; flag; flag = flag->next) {
3097 fval = eval_flag(flag->value); 3102 fval = eval_flag(flag->value);
3098 if (!val && !fval) { 3103 if (!val && !fval) {
3099 if (len_as_arg) 3104 print_str_to_seq(s, format, len_arg, flag->str);
3100 trace_seq_printf(s, "%.*s", len_arg, flag->str);
3101 else
3102 trace_seq_puts(s, flag->str);
3103 break; 3105 break;
3104 } 3106 }
3105 if (fval && (val & fval) == fval) { 3107 if (fval && (val & fval) == fval) {
3106 if (print && arg->flags.delim) 3108 if (print && arg->flags.delim)
3107 trace_seq_puts(s, arg->flags.delim); 3109 trace_seq_puts(s, arg->flags.delim);
3108 if (len_as_arg) 3110 print_str_to_seq(s, format, len_arg, flag->str);
3109 trace_seq_printf(s, "%.*s", len_arg, flag->str);
3110 else
3111 trace_seq_puts(s, flag->str);
3112 print = 1; 3111 print = 1;
3113 val &= ~fval; 3112 val &= ~fval;
3114 } 3113 }
@@ -3119,10 +3118,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
3119 for (flag = arg->symbol.symbols; flag; flag = flag->next) { 3118 for (flag = arg->symbol.symbols; flag; flag = flag->next) {
3120 fval = eval_flag(flag->value); 3119 fval = eval_flag(flag->value);
3121 if (val == fval) { 3120 if (val == fval) {
3122 if (len_as_arg) 3121 print_str_to_seq(s, format, len_arg, flag->str);
3123 trace_seq_printf(s, "%.*s", len_arg, flag->str);
3124 else
3125 trace_seq_puts(s, flag->str);
3126 break; 3122 break;
3127 } 3123 }
3128 } 3124 }
@@ -3141,10 +3137,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
3141 } 3137 }
3142 str_offset = data2host4(pevent, data + arg->string.offset); 3138 str_offset = data2host4(pevent, data + arg->string.offset);
3143 str_offset &= 0xffff; 3139 str_offset &= 0xffff;
3144 if (len_as_arg) 3140 print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
3145 trace_seq_printf(s, "%.*s", len_arg, ((char *)data) + str_offset);
3146 else
3147 trace_seq_puts(s, ((char *)data) + str_offset);
3148 break; 3141 break;
3149 } 3142 }
3150 case PRINT_OP: 3143 case PRINT_OP:
@@ -3155,9 +3148,11 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
3155 return; 3148 return;
3156 val = eval_num_arg(data, size, event, arg->op.left); 3149 val = eval_num_arg(data, size, event, arg->op.left);
3157 if (val) 3150 if (val)
3158 print_str_arg(s, data, size, event, len_arg, arg->op.right->op.left); 3151 print_str_arg(s, data, size, event,
3152 format, len_arg, arg->op.right->op.left);
3159 else 3153 else
3160 print_str_arg(s, data, size, event, len_arg, arg->op.right->op.right); 3154 print_str_arg(s, data, size, event,
3155 format, len_arg, arg->op.right->op.right);
3161 break; 3156 break;
3162 case PRINT_FUNC: 3157 case PRINT_FUNC:
3163 process_defined_func(s, data, size, event, arg); 3158 process_defined_func(s, data, size, event, arg);
@@ -3202,7 +3197,7 @@ process_defined_func(struct trace_seq *s, void *data, int size,
3202 break; 3197 break;
3203 case PEVENT_FUNC_ARG_STRING: 3198 case PEVENT_FUNC_ARG_STRING:
3204 trace_seq_init(&str); 3199 trace_seq_init(&str);
3205 print_str_arg(&str, data, size, event, -1, farg); 3200 print_str_arg(&str, data, size, event, "%s", -1, farg);
3206 trace_seq_terminate(&str); 3201 trace_seq_terminate(&str);
3207 string = malloc_or_die(sizeof(*string)); 3202 string = malloc_or_die(sizeof(*string));
3208 string->next = strings; 3203 string->next = strings;
@@ -3612,7 +3607,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event
3612 (unsigned long)saveptr; 3607 (unsigned long)saveptr;
3613 3608
3614 /* should never happen */ 3609 /* should never happen */
3615 if (len > 32) 3610 if (len > 31)
3616 die("bad format!"); 3611 die("bad format!");
3617 3612
3618 memcpy(format, saveptr, len); 3613 memcpy(format, saveptr, len);
@@ -3671,9 +3666,19 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event
3671 if (!arg) 3666 if (!arg)
3672 die("no matching argument"); 3667 die("no matching argument");
3673 3668
3669 len = ((unsigned long)ptr + 1) -
3670 (unsigned long)saveptr;
3671
3672 /* should never happen */
3673 if (len > 31)
3674 die("bad format!");
3675
3676 memcpy(format, saveptr, len);
3677 format[len] = 0;
3674 if (!len_as_arg) 3678 if (!len_as_arg)
3675 len_arg = -1; 3679 len_arg = -1;
3676 print_str_arg(s, data, size, event, len_arg, arg); 3680 print_str_arg(s, data, size, event,
3681 format, len_arg, arg);
3677 arg = arg->next; 3682 arg = arg->next;
3678 break; 3683 break;
3679 default: 3684 default: