diff --git a/libbpf b/libbpf index 8f8369223c327743277a8e4fcbf87c5d9d6f3c88..c91f1175e2273825767160fdc54448c19c97ba13 160000 --- a/libbpf +++ b/libbpf @@ -1 +1 @@ -Subproject commit 8f8369223c327743277a8e4fcbf87c5d9d6f3c88 +Subproject commit c91f1175e2273825767160fdc54448c19c97ba13 diff --git a/src/task_find.bpf.c b/src/task_find.bpf.c index 5f84a91552dd5ac9f71d34ce50feeb1e5cb6a7ca..85ded8dbdabc8f5332e6e3c6b88ab7cbfce890da 100644 --- a/src/task_find.bpf.c +++ b/src/task_find.bpf.c @@ -22,12 +22,39 @@ struct { __type(value, int); } dfd_map SEC(".maps"); +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, MAX_DEPTH); + __type(key, int); + __type(value, int); +} namelen_map SEC(".maps"); + void *u_descend; void *u_ascend; void *u_newline; +void *u_slash; void *u_iterdents64_buf; size_t root_namelen; +static long print_path(size_t depth) { + long err = 0; + for (int i = 0; i < MAX_DEPTH; i++) { + if (i > depth) { + break; + } + void *name_user = u_iterdents64_buf + i * PATHLEN; + int *namelen = bpf_map_lookup_elem(&namelen_map, &i); + if (!namelen) { + bpf_printk("Error: bpf_map_lookup_elem(&namelen_map, &%d)", i); + goto end; + } + write(STDOUT_FILENO, name_user, *namelen); + write(STDOUT_FILENO, u_slash, 1); + } +end: + return err; +} + static long iter_dir(size_t namelen) { long err = 0; @@ -55,6 +82,13 @@ static long iter_dir(size_t namelen) { goto end; } + /* Populate namelen map for print_path(). */ + err = bpf_map_update_elem(&namelen_map, &depth, &namelen, BPF_ANY); + if (err) { + bpf_printk("Error: bpf_map_update_elem(&namelen_map, ...)"); + goto end; + } + void *name_user = u_iterdents64_buf + depth * PATHLEN; int *parent_dfd = bpf_map_lookup_elem(&dfd_map, &depth); @@ -66,15 +100,12 @@ static long iter_dir(size_t namelen) { int dfd = openat(*parent_dfd, name_user, O_RDONLY | O_DIRECTORY, 0777); if (dfd < 0) { bpf_printk("file, depth = %d", depth); - write(STDOUT_FILENO, name_user, namelen); - write(STDOUT_FILENO, u_newline, 1); + print_path(depth); /* Not a directory, no need to iterate. */ goto end; } - bpf_printk("descend dir %d, depth = %d", dfd, depth); - write(STDOUT_FILENO, name_user, namelen); - write(STDOUT_FILENO, u_descend, 2); + print_path(depth); int child_depth = depth + 1; void *child_name_user = u_iterdents64_buf + child_depth * PATHLEN; diff --git a/src/task_find.c b/src/task_find.c index cd44ea4fb0e030096806b033847ce3bdd6da629f..24897ea4eca22422ad1091e4898d8528e4ca5920 100644 --- a/src/task_find.c +++ b/src/task_find.c @@ -170,6 +170,7 @@ static int bpf_find_by_name(const char *path, const char *name, bool debug) { skel->bss->u_newline = "\n"; skel->bss->u_descend = "/\n"; skel->bss->u_ascend = "..\n"; + skel->bss->u_slash = "/"; char iterdents64_buf[MAX_DEPTH * PATHLEN]; skel->bss->u_iterdents64_buf = iterdents64_buf;