linux/tools/testing/selftests/bpf/test_libbpf_open.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0
   2 * Copyright (c) 2018 Jesper Dangaard Brouer, Red Hat Inc.
   3 */
   4static const char *__doc__ =
   5        "Libbpf test program for loading BPF ELF object files";
   6
   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>
  13
  14#include "bpf_rlimit.h"
  15
  16static const struct option long_options[] = {
  17        {"help",        no_argument,            NULL, 'h' },
  18        {"debug",       no_argument,            NULL, 'D' },
  19        {"quiet",       no_argument,            NULL, 'q' },
  20        {0, 0, NULL,  0 }
  21};
  22
  23static void usage(char *argv[])
  24{
  25        int i;
  26
  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",
  33                       long_options[i].val);
  34                printf("\n");
  35        }
  36        printf("\n");
  37}
  38
  39static bool debug = 0;
  40static int libbpf_debug_print(enum libbpf_print_level level,
  41                              const char *fmt, va_list args)
  42{
  43        if (level == LIBBPF_DEBUG && !debug)
  44                return 0;
  45
  46        fprintf(stderr, "[%d] ", level);
  47        return vfprintf(stderr, fmt, args);
  48}
  49
  50#define EXIT_FAIL_LIBBPF EXIT_FAILURE
  51#define EXIT_FAIL_OPTION 2
  52
  53int test_walk_progs(struct bpf_object *obj, bool verbose)
  54{
  55        struct bpf_program *prog;
  56        int cnt = 0;
  57
  58        bpf_object__for_each_program(prog, obj) {
  59                cnt++;
  60                if (verbose)
  61                        printf("Prog (count:%d) section_name: %s\n", cnt,
  62                               bpf_program__title(prog, false));
  63        }
  64        return 0;
  65}
  66
  67int test_walk_maps(struct bpf_object *obj, bool verbose)
  68{
  69        struct bpf_map *map;
  70        int cnt = 0;
  71
  72        bpf_object__for_each_map(map, obj) {
  73                cnt++;
  74                if (verbose)
  75                        printf("Map (count:%d) name: %s\n", cnt,
  76                               bpf_map__name(map));
  77        }
  78        return 0;
  79}
  80
  81int test_open_file(char *filename, bool verbose)
  82{
  83        struct bpf_object *bpfobj = NULL;
  84        long err;
  85
  86        if (verbose)
  87                printf("Open BPF ELF-file with libbpf: %s\n", filename);
  88
  89        /* Load BPF ELF object file and check for errors */
  90        bpfobj = bpf_object__open(filename);
  91        err = libbpf_get_error(bpfobj);
  92        if (err) {
  93                char err_buf[128];
  94                libbpf_strerror(err, err_buf, sizeof(err_buf));
  95                if (verbose)
  96                        printf("Unable to load eBPF objects in file '%s': %s\n",
  97                               filename, err_buf);
  98                return EXIT_FAIL_LIBBPF;
  99        }
 100        test_walk_progs(bpfobj, verbose);
 101        test_walk_maps(bpfobj, verbose);
 102
 103        if (verbose)
 104                printf("Close BPF ELF-file with libbpf: %s\n",
 105                       bpf_object__name(bpfobj));
 106        bpf_object__close(bpfobj);
 107
 108        return 0;
 109}
 110
 111int main(int argc, char **argv)
 112{
 113        char filename[1024] = { 0 };
 114        bool verbose = 1;
 115        int longindex = 0;
 116        int opt;
 117
 118        libbpf_set_print(libbpf_debug_print);
 119
 120        /* Parse commands line args */
 121        while ((opt = getopt_long(argc, argv, "hDq",
 122                                  long_options, &longindex)) != -1) {
 123                switch (opt) {
 124                case 'D':
 125                        debug = 1;
 126                        break;
 127                case 'q': /* Use in scripting mode */
 128                        verbose = 0;
 129                        break;
 130                case 'h':
 131                default:
 132                        usage(argv);
 133                        return EXIT_FAIL_OPTION;
 134                }
 135        }
 136        if (optind >= argc) {
 137                usage(argv);
 138                printf("ERROR: Expected BPF_FILE argument after options\n");
 139                return EXIT_FAIL_OPTION;
 140        }
 141        snprintf(filename, sizeof(filename), "%s", argv[optind]);
 142
 143        return test_open_file(filename, verbose);
 144}
 145