1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2 // Copyright (C) 2020 Facebook
7 #include <bpf/libbpf.h>
11 static int do_pin(int argc
, char **argv
)
13 DECLARE_LIBBPF_OPTS(bpf_iter_attach_opts
, iter_opts
);
14 union bpf_iter_link_info linfo
;
15 const char *objfile
, *path
;
16 struct bpf_program
*prog
;
17 struct bpf_object
*obj
;
18 struct bpf_link
*link
;
19 int err
= -1, map_fd
= -1;
27 /* optional arguments */
29 if (is_prefix(*argv
, "map")) {
33 p_err("incorrect map spec");
37 map_fd
= map_parse_fd(&argc
, &argv
);
41 memset(&linfo
, 0, sizeof(linfo
));
42 linfo
.map
.map_fd
= map_fd
;
43 iter_opts
.link_info
= &linfo
;
44 iter_opts
.link_info_len
= sizeof(linfo
);
48 obj
= bpf_object__open(objfile
);
50 p_err("can't open objfile %s", objfile
);
54 err
= bpf_object__load(obj
);
56 p_err("can't load objfile %s", objfile
);
60 prog
= bpf_program__next(NULL
, obj
);
62 p_err("can't find bpf program in objfile %s", objfile
);
66 link
= bpf_program__attach_iter(prog
, &iter_opts
);
69 p_err("attach_iter failed for program %s",
70 bpf_program__name(prog
));
74 err
= mount_bpffs_for_pin(path
);
78 err
= bpf_link__pin(link
, path
);
80 p_err("pin_iter failed for program %s to path %s",
81 bpf_program__name(prog
), path
);
86 bpf_link__destroy(link
);
88 bpf_object__close(obj
);
95 static int do_help(int argc
, char **argv
)
98 "Usage: %1$s %2$s pin OBJ PATH [map MAP]\n"
100 " " HELP_SPEC_MAP
"\n"
107 static const struct cmd cmds
[] = {
113 int do_iter(int argc
, char **argv
)
115 return cmd_select(cmds
, argc
, argv
, do_help
);