Skip to content

Commit

Permalink
tools: bpftool: turn err() and info() macros into functions
Browse files Browse the repository at this point in the history
Turn err() and info() macros into functions.

In order to avoid naming conflicts with variables in the code, rename
them as p_err() and p_info() respectively.

The behavior of these functions is similar to the one of the macros for
plain output. However, when JSON output is requested, these macros
return a JSON-formatted "error" object instead of printing a message to
stderr.

To handle error messages correctly with JSON, a modification was brought
to their behavior nonetheless: the functions now append a end-of-line
character at the end of the message. This way, we can remove end-of-line
characters at the end of the argument strings, and not have them in the
JSON output.

All error messages are formatted to hold in a single call to p_err(), in
order to produce a single JSON field.

Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
qmonnet authored and davem330 committed Oct 24, 2017
1 parent 3aaca6b commit 9a5ab8b
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 91 deletions.
26 changes: 13 additions & 13 deletions tools/bpf/bpftool/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type)

fd = bpf_obj_get(path);
if (fd < 0) {
err("bpf obj get (%s): %s\n", path,
errno == EACCES && !is_bpffs(dirname(path)) ?
p_err("bpf obj get (%s): %s", path,
errno == EACCES && !is_bpffs(dirname(path)) ?
"directory not in bpf file system (bpffs)" :
strerror(errno));
return -1;
Expand All @@ -79,7 +79,7 @@ int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type)
return type;
}
if (type != exp_type) {
err("incorrect object type: %s\n", get_fd_type_name(type));
p_err("incorrect object type: %s", get_fd_type_name(type));
close(fd);
return -1;
}
Expand All @@ -95,14 +95,14 @@ int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32))
int fd;

if (!is_prefix(*argv, "id")) {
err("expected 'id' got %s\n", *argv);
p_err("expected 'id' got %s", *argv);
return -1;
}
NEXT_ARG();

id = strtoul(*argv, &endptr, 0);
if (*endptr) {
err("can't parse %s as ID\n", *argv);
p_err("can't parse %s as ID", *argv);
return -1;
}
NEXT_ARG();
Expand All @@ -112,15 +112,15 @@ int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32))

fd = get_fd_by_id(id);
if (fd < 0) {
err("can't get prog by id (%u): %s\n", id, strerror(errno));
p_err("can't get prog by id (%u): %s", id, strerror(errno));
return -1;
}

err = bpf_obj_pin(fd, *argv);
close(fd);
if (err) {
err("can't pin the object (%s): %s\n", *argv,
errno == EACCES && !is_bpffs(dirname(*argv)) ?
p_err("can't pin the object (%s): %s", *argv,
errno == EACCES && !is_bpffs(dirname(*argv)) ?
"directory not in bpf file system (bpffs)" :
strerror(errno));
return -1;
Expand Down Expand Up @@ -153,11 +153,11 @@ int get_fd_type(int fd)

n = readlink(path, buf, sizeof(buf));
if (n < 0) {
err("can't read link type: %s\n", strerror(errno));
p_err("can't read link type: %s", strerror(errno));
return -1;
}
if (n == sizeof(path)) {
err("can't read link type: path too long!\n");
p_err("can't read link type: path too long!");
return -1;
}

Expand All @@ -181,7 +181,7 @@ char *get_fdinfo(int fd, const char *key)

fdi = fopen(path, "r");
if (!fdi) {
err("can't open fdinfo: %s\n", strerror(errno));
p_err("can't open fdinfo: %s", strerror(errno));
return NULL;
}

Expand All @@ -196,7 +196,7 @@ char *get_fdinfo(int fd, const char *key)

value = strchr(line, '\t');
if (!value || !value[1]) {
err("malformed fdinfo!?\n");
p_err("malformed fdinfo!?");
free(line);
return NULL;
}
Expand All @@ -209,7 +209,7 @@ char *get_fdinfo(int fd, const char *key)
return line;
}

err("key '%s' not found in fdinfo\n", key);
p_err("key '%s' not found in fdinfo", key);
free(line);
fclose(fdi);
return NULL;
Expand Down
16 changes: 8 additions & 8 deletions tools/bpf/bpftool/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,20 +158,20 @@ static int do_batch(int argc, char **argv)
int i;

if (argc < 2) {
err("too few parameters for batch\n");
p_err("too few parameters for batch");
return -1;
} else if (!is_prefix(*argv, "file")) {
err("expected 'file', got: %s\n", *argv);
p_err("expected 'file', got: %s", *argv);
return -1;
} else if (argc > 2) {
err("too many parameters for batch\n");
p_err("too many parameters for batch");
return -1;
}
NEXT_ARG();

fp = fopen(*argv, "r");
if (!fp) {
err("Can't open file (%s): %s\n", *argv, strerror(errno));
p_err("Can't open file (%s): %s", *argv, strerror(errno));
return -1;
}

Expand All @@ -189,8 +189,8 @@ static int do_batch(int argc, char **argv)
while (n_argv[n_argc]) {
n_argc++;
if (n_argc == ARRAY_SIZE(n_argv)) {
err("line %d has too many arguments, skip\n",
lines);
p_err("line %d has too many arguments, skip",
lines);
n_argc = 0;
break;
}
Expand Down Expand Up @@ -225,7 +225,7 @@ static int do_batch(int argc, char **argv)
perror("reading batch file failed");
err = -1;
} else {
info("processed %d lines\n", lines);
p_info("processed %d lines", lines);
err = 0;
}
err_close:
Expand Down Expand Up @@ -279,7 +279,7 @@ int main(int argc, char **argv)
if (json_output) {
json_wtr = jsonw_new(stdout);
if (!json_wtr) {
err("failed to create JSON writer\n");
p_err("failed to create JSON writer");
return -1;
}
jsonw_pretty(json_wtr, pretty_output);
Expand Down
37 changes: 32 additions & 5 deletions tools/bpf/bpftool/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,11 @@

#include "json_writer.h"

#define err(msg...) fprintf(stderr, "Error: " msg)
#define warn(msg...) fprintf(stderr, "Warning: " msg)
#define info(msg...) fprintf(stderr, msg)

#define ptr_to_u64(ptr) ((__u64)(unsigned long)(ptr))

#define NEXT_ARG() ({ argc--; argv++; if (argc < 0) usage(); })
#define NEXT_ARGP() ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); })
#define BAD_ARG() ({ err("what is '%s'?\n", *argv); -1; })
#define BAD_ARG() ({ p_err("what is '%s'?\n", *argv); -1; })

#define BPF_TAG_FMT "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"

Expand Down Expand Up @@ -97,4 +93,35 @@ int prog_parse_fd(int *argc, char ***argv);
void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes);
void print_hex_data_json(uint8_t *data, size_t len);

static inline void p_err(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
if (json_output) {
jsonw_start_object(json_wtr);
jsonw_name(json_wtr, "error");
jsonw_vprintf_enquote(json_wtr, fmt, ap);
jsonw_end_object(json_wtr);
} else {
fprintf(stderr, "Error: ");
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
}
va_end(ap);
}

static inline void p_info(const char *fmt, ...)
{
va_list ap;

if (json_output)
return;

va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
va_end(ap);
}

#endif
Loading

0 comments on commit 9a5ab8b

Please sign in to comment.