1 /* SPDX-License-Identifier: GPL-2.0
2 * Copyright (c) 2018 Jesper Dangaard Brouer, Red Hat Inc.
4 static const char *__doc__
=
5 "Libbpf test program for loading BPF ELF object files";
11 #include <bpf/libbpf.h>
14 #include "bpf_rlimit.h"
16 static const struct option long_options
[] = {
17 {"help", no_argument
, NULL
, 'h' },
18 {"debug", no_argument
, NULL
, 'D' },
19 {"quiet", no_argument
, NULL
, 'q' },
23 static void usage(char *argv
[])
27 printf("\nDOCUMENTATION:\n%s\n\n", __doc__
);
28 printf(" Usage: %s (options-see-below) BPF_FILE\n", argv
[0]);
29 printf(" Listing options:\n");
30 for (i
= 0; long_options
[i
].name
!= 0; i
++) {
31 printf(" --%-12s", long_options
[i
].name
);
32 printf(" short-option: -%c",
39 static bool debug
= 0;
40 static int libbpf_debug_print(enum libbpf_print_level level
,
41 const char *fmt
, va_list args
)
43 if (level
== LIBBPF_DEBUG
&& !debug
)
46 fprintf(stderr
, "[%d] ", level
);
47 return vfprintf(stderr
, fmt
, args
);
50 #define EXIT_FAIL_LIBBPF EXIT_FAILURE
51 #define EXIT_FAIL_OPTION 2
53 int test_walk_progs(struct bpf_object
*obj
, bool verbose
)
55 struct bpf_program
*prog
;
58 bpf_object__for_each_program(prog
, obj
) {
61 printf("Prog (count:%d) section_name: %s\n", cnt
,
62 bpf_program__title(prog
, false));
67 int test_walk_maps(struct bpf_object
*obj
, bool verbose
)
72 bpf_object__for_each_map(map
, obj
) {
75 printf("Map (count:%d) name: %s\n", cnt
,
81 int test_open_file(char *filename
, bool verbose
)
83 struct bpf_object
*bpfobj
= NULL
;
87 printf("Open BPF ELF-file with libbpf: %s\n", filename
);
89 /* Load BPF ELF object file and check for errors */
90 bpfobj
= bpf_object__open(filename
);
91 err
= libbpf_get_error(bpfobj
);
94 libbpf_strerror(err
, err_buf
, sizeof(err_buf
));
96 printf("Unable to load eBPF objects in file '%s': %s\n",
98 return EXIT_FAIL_LIBBPF
;
100 test_walk_progs(bpfobj
, verbose
);
101 test_walk_maps(bpfobj
, verbose
);
104 printf("Close BPF ELF-file with libbpf: %s\n",
105 bpf_object__name(bpfobj
));
106 bpf_object__close(bpfobj
);
111 int main(int argc
, char **argv
)
113 char filename
[1024] = { 0 };
118 libbpf_set_print(libbpf_debug_print
);
120 /* Parse commands line args */
121 while ((opt
= getopt_long(argc
, argv
, "hDq",
122 long_options
, &longindex
)) != -1) {
127 case 'q': /* Use in scripting mode */
133 return EXIT_FAIL_OPTION
;
136 if (optind
>= argc
) {
138 printf("ERROR: Expected BPF_FILE argument after options\n");
139 return EXIT_FAIL_OPTION
;
141 snprintf(filename
, sizeof(filename
), "%s", argv
[optind
]);
143 return test_open_file(filename
, verbose
);