Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / tools / testing / selftests / bpf / test_libbpf_open.c
blob8fcd1c076add0baf5f15a617a192afe269aa97c8
1 /* SPDX-License-Identifier: GPL-2.0
2 * Copyright (c) 2018 Jesper Dangaard Brouer, Red Hat Inc.
3 */
4 static const char *__doc__ =
5 "Libbpf test program for loading BPF ELF object files";
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <stdarg.h>
11 #include <bpf/libbpf.h>
12 #include <getopt.h>
14 static const struct option long_options[] = {
15 {"help", no_argument, NULL, 'h' },
16 {"debug", no_argument, NULL, 'D' },
17 {"quiet", no_argument, NULL, 'q' },
18 {0, 0, NULL, 0 }
21 static void usage(char *argv[])
23 int i;
25 printf("\nDOCUMENTATION:\n%s\n\n", __doc__);
26 printf(" Usage: %s (options-see-below) BPF_FILE\n", argv[0]);
27 printf(" Listing options:\n");
28 for (i = 0; long_options[i].name != 0; i++) {
29 printf(" --%-12s", long_options[i].name);
30 printf(" short-option: -%c",
31 long_options[i].val);
32 printf("\n");
34 printf("\n");
37 #define DEFINE_PRINT_FN(name, enabled) \
38 static int libbpf_##name(const char *fmt, ...) \
39 { \
40 va_list args; \
41 int ret; \
43 va_start(args, fmt); \
44 if (enabled) { \
45 fprintf(stderr, "[" #name "] "); \
46 ret = vfprintf(stderr, fmt, args); \
47 } \
48 va_end(args); \
49 return ret; \
51 DEFINE_PRINT_FN(warning, 1)
52 DEFINE_PRINT_FN(info, 1)
53 DEFINE_PRINT_FN(debug, 1)
55 #define EXIT_FAIL_LIBBPF EXIT_FAILURE
56 #define EXIT_FAIL_OPTION 2
58 int test_walk_progs(struct bpf_object *obj, bool verbose)
60 struct bpf_program *prog;
61 int cnt = 0;
63 bpf_object__for_each_program(prog, obj) {
64 cnt++;
65 if (verbose)
66 printf("Prog (count:%d) section_name: %s\n", cnt,
67 bpf_program__title(prog, false));
69 return 0;
72 int test_walk_maps(struct bpf_object *obj, bool verbose)
74 struct bpf_map *map;
75 int cnt = 0;
77 bpf_map__for_each(map, obj) {
78 cnt++;
79 if (verbose)
80 printf("Map (count:%d) name: %s\n", cnt,
81 bpf_map__name(map));
83 return 0;
86 int test_open_file(char *filename, bool verbose)
88 struct bpf_object *bpfobj = NULL;
89 long err;
91 if (verbose)
92 printf("Open BPF ELF-file with libbpf: %s\n", filename);
94 /* Load BPF ELF object file and check for errors */
95 bpfobj = bpf_object__open(filename);
96 err = libbpf_get_error(bpfobj);
97 if (err) {
98 char err_buf[128];
99 libbpf_strerror(err, err_buf, sizeof(err_buf));
100 if (verbose)
101 printf("Unable to load eBPF objects in file '%s': %s\n",
102 filename, err_buf);
103 return EXIT_FAIL_LIBBPF;
105 test_walk_progs(bpfobj, verbose);
106 test_walk_maps(bpfobj, verbose);
108 if (verbose)
109 printf("Close BPF ELF-file with libbpf: %s\n",
110 bpf_object__name(bpfobj));
111 bpf_object__close(bpfobj);
113 return 0;
116 int main(int argc, char **argv)
118 char filename[1024] = { 0 };
119 bool verbose = 1;
120 int longindex = 0;
121 int opt;
123 libbpf_set_print(libbpf_warning, libbpf_info, NULL);
125 /* Parse commands line args */
126 while ((opt = getopt_long(argc, argv, "hDq",
127 long_options, &longindex)) != -1) {
128 switch (opt) {
129 case 'D':
130 libbpf_set_print(libbpf_warning, libbpf_info,
131 libbpf_debug);
132 break;
133 case 'q': /* Use in scripting mode */
134 verbose = 0;
135 break;
136 case 'h':
137 default:
138 usage(argv);
139 return EXIT_FAIL_OPTION;
142 if (optind >= argc) {
143 usage(argv);
144 printf("ERROR: Expected BPF_FILE argument after options\n");
145 return EXIT_FAIL_OPTION;
147 snprintf(filename, sizeof(filename), "%s", argv[optind]);
149 return test_open_file(filename, verbose);