On Sat, 2024-04-13 at 23:39 +0200, Quentin Deslandes wrote: > Introduce the new print_strings flag in btf_dump_type_data_opts. If > enabled, libbpf will print character arrays as strings if they meet the > following conditions: > - Contains a nul-termination character ('\0') > - Contains only printable characters before the nul-termination character > > If print_strings is set to false (default value), the existing > behavior remains unchanged. > > With print_strings=false: > .str_array = (__u8[14])[ > 'H', > 'e', > 'l', > 'l', > 'o', > ], > > With print_strings=true: > .str_array = (__u8[14])"Hello", > > Signed-off-by: Quentin Deslandes <qde@xxxxxxxx> > --- Hi Quentin, Thank you for this patch, sorry for the delay reviewing it. Could you please also add a few tests in tools/testing/selftests/bpf/prog_tests/btf_dump.c ? [...] > @@ -2021,6 +2022,21 @@ static int btf_dump_var_data(struct btf_dump *d, > return btf_dump_dump_type_data(d, NULL, t, type_id, data, 0, 0); > } > > +static bool btf_dump_isprint_str(const char *data, unsigned int len) > +{ > + unsigned int i; > + > + for (i = 0; i < len; ++i) { > + if (data[i] == '\0') > + return true; > + > + if (!isprint(data[i])) > + return false; Would it make sense to use isprint_l() and specify something like C locale? > + } > + > + return false; > +} > + > static int btf_dump_array_data(struct btf_dump *d, > const struct btf_type *t, > __u32 id, > @@ -2047,8 +2063,14 @@ static int btf_dump_array_data(struct btf_dump *d, > * char arrays, so if size is 1 and element is > * printable as a char, we'll do that. > */ > - if (elem_size == 1) > + if (elem_size == 1) { > d->typed_dump->is_array_char = true; > + if (d->typed_dump->print_strings && > + btf_dump_isprint_str(data, array->nelems)) { > + btf_dump_type_values(d, "\"%s\"", data); Note: this would have to deal with escape sequences, otherwise strings containing '\' would be printed incorrectly. > + return 0; > + } > + } > } > > /* note that we increment depth before calling btf_dump_print() below; [...]