Commit 0478c3bf authored by Benjamin Poirier's avatar Benjamin Poirier Committed by Daniel Borkmann

bpftool: Use print_entry_error() in case of ENOENT when dumping

Commit bf598a8f ("bpftool: Improve handling of ENOENT on map dumps")
used print_entry_plain() in case of ENOENT. However, that commit introduces
dead code. Per-cpu maps are zero-filled. When reading them, it's all or
nothing. There will never be a case where some cpus have an entry and
others don't.

The truth is that ENOENT is an error case. Use print_entry_error() to
output the desired message. That function's "value" parameter is also
renamed to indicate that we never use it for an actual map value.

The output format is unchanged.
Signed-off-by: default avatarBenjamin Poirier <bpoirier@suse.com>
Reviewed-by: default avatarQuentin Monnet <quentin.monnet@netronome.com>
Reviewed-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 25df480d
...@@ -261,20 +261,20 @@ static void print_entry_json(struct bpf_map_info *info, unsigned char *key, ...@@ -261,20 +261,20 @@ static void print_entry_json(struct bpf_map_info *info, unsigned char *key,
} }
static void print_entry_error(struct bpf_map_info *info, unsigned char *key, static void print_entry_error(struct bpf_map_info *info, unsigned char *key,
const char *value) const char *error_msg)
{ {
int value_size = strlen(value); int msg_size = strlen(error_msg);
bool single_line, break_names; bool single_line, break_names;
break_names = info->key_size > 16 || value_size > 16; break_names = info->key_size > 16 || msg_size > 16;
single_line = info->key_size + value_size <= 24 && !break_names; single_line = info->key_size + msg_size <= 24 && !break_names;
printf("key:%c", break_names ? '\n' : ' '); printf("key:%c", break_names ? '\n' : ' ');
fprint_hex(stdout, key, info->key_size, " "); fprint_hex(stdout, key, info->key_size, " ");
printf(single_line ? " " : "\n"); printf(single_line ? " " : "\n");
printf("value:%c%s", break_names ? '\n' : ' ', value); printf("value:%c%s", break_names ? '\n' : ' ', error_msg);
printf("\n"); printf("\n");
} }
...@@ -298,11 +298,7 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, ...@@ -298,11 +298,7 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,
if (info->value_size) { if (info->value_size) {
printf("value:%c", break_names ? '\n' : ' '); printf("value:%c", break_names ? '\n' : ' ');
if (value) fprint_hex(stdout, value, info->value_size, " ");
fprint_hex(stdout, value, info->value_size,
" ");
else
printf("<no entry>");
} }
printf("\n"); printf("\n");
...@@ -321,11 +317,8 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, ...@@ -321,11 +317,8 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
printf("value (CPU %02d):%c", printf("value (CPU %02d):%c",
i, info->value_size > 16 ? '\n' : ' '); i, info->value_size > 16 ? '\n' : ' ');
if (value) fprint_hex(stdout, value + i * step,
fprint_hex(stdout, value + i * step, info->value_size, " ");
info->value_size, " ");
else
printf("<no entry>");
printf("\n"); printf("\n");
} }
} }
...@@ -722,11 +715,13 @@ static int dump_map_elem(int fd, void *key, void *value, ...@@ -722,11 +715,13 @@ static int dump_map_elem(int fd, void *key, void *value,
jsonw_string_field(json_wtr, "error", strerror(lookup_errno)); jsonw_string_field(json_wtr, "error", strerror(lookup_errno));
jsonw_end_object(json_wtr); jsonw_end_object(json_wtr);
} else { } else {
const char *msg = NULL;
if (errno == ENOENT) if (errno == ENOENT)
print_entry_plain(map_info, key, NULL); msg = "<no entry>";
else
print_entry_error(map_info, key, print_entry_error(map_info, key,
strerror(lookup_errno)); msg ? : strerror(lookup_errno));
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment