diff --git a/src/task_find.bpf.c b/src/task_find.bpf.c index 13352a14babc8792453e6bae2c3bf37126d92e48..cbac40d8853893abf9bc1ef0b82016ce9d7a0e02 100644 --- a/src/task_find.bpf.c +++ b/src/task_find.bpf.c @@ -28,7 +28,7 @@ void *u_newline; void *u_iterdents64_buf; size_t root_namelen; -static long iter_dir(size_t namelen, bool print) { +static long iter_dir(uint32_t d_type, size_t namelen, bool print) { long err = 0; if (namelen + 1 > PATHLEN) { @@ -37,12 +37,6 @@ static long iter_dir(size_t namelen, bool print) { goto end; } - int *prog_fd = bpf_map_lookup_elem(&state_map, &PDPF_KEY); - if (!prog_fd) { - bpf_printk("Error: !bpf_map_lookup_elem(&state_map, &PDPF_KEY)"); - goto end; - } - int *curr_depth_p = bpf_map_lookup_elem(&state_map, &CURR_DEPTH_KEY); if (!curr_depth_p) { bpf_printk("Error: bpf_map_lookup_elem(&state_map, &CURR_DEPTH_KEY)"); @@ -56,6 +50,13 @@ static long iter_dir(size_t namelen, bool print) { } void *name_user = u_iterdents64_buf + depth * PATHLEN; + if (d_type != DT_DIR) { + if (print) { + write(STDOUT_FILENO, name_user, namelen); + write(STDOUT_FILENO, u_newline, 1); + } + goto end; + } int *parent_dfd = bpf_map_lookup_elem(&dfd_map, &depth); if (!parent_dfd) { @@ -65,10 +66,7 @@ static long iter_dir(size_t namelen, bool print) { int dfd = openat(*parent_dfd, name_user, O_RDONLY | O_DIRECTORY, 0777); if (dfd < 0) { - if (print) { - write(STDOUT_FILENO, name_user, namelen); - write(STDOUT_FILENO, u_newline, 1); - } + bpf_printk("Warning: openat failed, is someone modifying the tree?"); /* Not a directory, no need to iterate. */ goto end; } @@ -90,6 +88,12 @@ static long iter_dir(size_t namelen, bool print) { goto reset_depth; } + int *prog_fd = bpf_map_lookup_elem(&state_map, &PDPF_KEY); + if (!prog_fd) { + bpf_printk("Error: !bpf_map_lookup_elem(&state_map, &PDPF_KEY)"); + goto end; + } + err = bpf_task_iterdents64(dfd, *prog_fd, child_name_user, PATHLEN); if (err) { bpf_printk("Error: iterdents64(%d, %d) = %d", dfd, *prog_fd, err); @@ -116,7 +120,7 @@ int entry(void *ctx) { long err = 0; - err = iter_dir(root_namelen, false); + err = iter_dir(DT_DIR, root_namelen, false); if (err) { goto end; } @@ -143,7 +147,7 @@ int process_dirent(struct bpf_dirent64 *d) { } } - err = iter_dir(d->namelen, match); + err = iter_dir(d->d_type, d->namelen, match); if (err) { goto end; } diff --git a/src/task_lib.bpf.h b/src/task_lib.bpf.h index 84c7af24abbf97a2d84d04e71932f144611f6f33..7545e82bdc9e49af6d083725fbd7d394720dd5e3 100644 --- a/src/task_lib.bpf.h +++ b/src/task_lib.bpf.h @@ -65,6 +65,17 @@ typedef off64_t off_t; #define SEEK_DATA 3 /* Seek to next data. */ #define SEEK_HOLE 4 /* Seek to next hole. */ +/* these are defined by POSIX and also present in glibc's dirent.h */ +#define DT_UNKNOWN 0 +#define DT_FIFO 1 +#define DT_CHR 2 +#define DT_DIR 4 +#define DT_BLK 6 +#define DT_REG 8 +#define DT_LNK 10 +#define DT_SOCK 12 +#define DT_WHT 14 + /* Copied from man getdents64(2). */ struct linux_dirent64 { ino64_t d_ino; /* 64-bit inode number */