OSDN Git Service

tools: bpftool: refactor argument parsing for prog load
authorJakub Kicinski <jakub.kicinski@netronome.com>
Tue, 10 Jul 2018 21:42:57 +0000 (14:42 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 11 Jul 2018 20:13:33 +0000 (22:13 +0200)
Add a new macro for printing more informative message than straight
usage() when parameters are missing, and use it for prog do_load().
Save the object and pin path argument to variables for clarity.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
tools/bpf/bpftool/main.h
tools/bpf/bpftool/prog.c

index d39f7ef..15b6c49 100644 (file)
 #define NEXT_ARG()     ({ argc--; argv++; if (argc < 0) usage(); })
 #define NEXT_ARGP()    ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); })
 #define BAD_ARG()      ({ p_err("what is '%s'?", *argv); -1; })
+#define GET_ARG()      ({ argc--; *argv++; })
+#define REQ_ARGS(cnt)                                                  \
+       ({                                                              \
+               int _cnt = (cnt);                                       \
+               bool _res;                                              \
+                                                                       \
+               if (argc < _cnt) {                                      \
+                       p_err("'%s' needs at least %d arguments, %d found", \
+                             argv[-1], _cnt, argc);                    \
+                       _res = false;                                   \
+               } else {                                                \
+                       _res = true;                                    \
+               }                                                       \
+               _res;                                                   \
+       })
 
 #define ERR_MAX_LEN    1024
 
index a740da9..a5ef46c 100644 (file)
@@ -681,18 +681,21 @@ static int do_pin(int argc, char **argv)
 
 static int do_load(int argc, char **argv)
 {
+       const char *objfile, *pinfile;
        struct bpf_object *obj;
        int prog_fd;
 
-       if (argc != 2)
-               usage();
+       if (!REQ_ARGS(2))
+               return -1;
+       objfile = GET_ARG();
+       pinfile = GET_ARG();
 
-       if (bpf_prog_load(argv[0], BPF_PROG_TYPE_UNSPEC, &obj, &prog_fd)) {
+       if (bpf_prog_load(objfile, BPF_PROG_TYPE_UNSPEC, &obj, &prog_fd)) {
                p_err("failed to load program");
                return -1;
        }
 
-       if (do_pin_fd(prog_fd, argv[1]))
+       if (do_pin_fd(prog_fd, pinfile))
                goto err_close_obj;
 
        if (json_output)