1 #define _GNU_SOURCE 2 3 #include <stdio.h> 4 #include <unistd.h> 5 #include <bpf/libbpf.h> 6 7 int main(int argc, char **argv) 8 { 9 struct bpf_link *link = NULL; 10 struct bpf_program *prog; 11 struct bpf_object *obj; 12 char filename[256]; 13 char command[256]; 14 int ret = 0; 15 FILE *f; 16 17 if (!argv[1]) { 18 fprintf(stderr, "ERROR: Run with the btrfs device argument!\n"); 19 return 0; 20 } 21 22 snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 23 obj = bpf_object__open_file(filename, NULL); 24 if (libbpf_get_error(obj)) { 25 fprintf(stderr, "ERROR: opening BPF object file failed\n"); 26 return 0; 27 } 28 29 prog = bpf_object__find_program_by_name(obj, "bpf_prog1"); 30 if (!prog) { 31 fprintf(stderr, "ERROR: finding a prog in obj file failed\n"); 32 goto cleanup; 33 } 34 35 /* load BPF program */ 36 if (bpf_object__load(obj)) { 37 fprintf(stderr, "ERROR: loading BPF object file failed\n"); 38 goto cleanup; 39 } 40 41 link = bpf_program__attach(prog); 42 if (libbpf_get_error(link)) { 43 fprintf(stderr, "ERROR: bpf_program__attach failed\n"); 44 link = NULL; 45 goto cleanup; 46 } 47 48 snprintf(command, 256, "mount %s tmpmnt/", argv[1]); 49 f = popen(command, "r"); 50 ret = pclose(f); 51 52 cleanup: 53 bpf_link__destroy(link); 54 bpf_object__close(obj); 55 return ret ? 0 : 1; 56 } 57