1b6c4e715SHengqi Chen /* SPDX-License-Identifier: GPL-2.0 */
2b6c4e715SHengqi Chen /* Copyright (c) 2021 Hengqi Chen */
3b6c4e715SHengqi Chen 
4b6c4e715SHengqi Chen #include "vmlinux.h"
5b6c4e715SHengqi Chen #include <bpf/bpf_helpers.h>
6b6c4e715SHengqi Chen #include <bpf/bpf_tracing.h>
7b6c4e715SHengqi Chen #include "bpf_tracing_net.h"
8b6c4e715SHengqi Chen 
9b6c4e715SHengqi Chen const volatile pid_t my_pid = 0;
10b6c4e715SHengqi Chen char path[256] = {};
11b6c4e715SHengqi Chen 
12b6c4e715SHengqi Chen SEC("fentry/unix_listen")
BPF_PROG(unix_listen,struct socket * sock,int backlog)13b6c4e715SHengqi Chen int BPF_PROG(unix_listen, struct socket *sock, int backlog)
14b6c4e715SHengqi Chen {
15b6c4e715SHengqi Chen 	pid_t pid = bpf_get_current_pid_tgid() >> 32;
16b6c4e715SHengqi Chen 	struct unix_sock *unix_sk;
17b6c4e715SHengqi Chen 	int i, len;
18b6c4e715SHengqi Chen 
19b6c4e715SHengqi Chen 	if (pid != my_pid)
20b6c4e715SHengqi Chen 		return 0;
21b6c4e715SHengqi Chen 
22b6c4e715SHengqi Chen 	unix_sk = (struct unix_sock *)bpf_skc_to_unix_sock(sock->sk);
23b6c4e715SHengqi Chen 	if (!unix_sk)
24b6c4e715SHengqi Chen 		return 0;
25b6c4e715SHengqi Chen 
26*5ce7ab49SKuniyuki Iwashima 	if (unix_sk->addr->name->sun_path[0])
27b6c4e715SHengqi Chen 		return 0;
28b6c4e715SHengqi Chen 
29b6c4e715SHengqi Chen 	len = unix_sk->addr->len - sizeof(short);
30b6c4e715SHengqi Chen 	path[0] = '@';
31b6c4e715SHengqi Chen 	for (i = 1; i < len; i++) {
32b6c4e715SHengqi Chen 		if (i >= sizeof(struct sockaddr_un))
33b6c4e715SHengqi Chen 			break;
34b6c4e715SHengqi Chen 
35b6c4e715SHengqi Chen 		path[i] = unix_sk->addr->name->sun_path[i];
36b6c4e715SHengqi Chen 	}
37b6c4e715SHengqi Chen 	return 0;
38b6c4e715SHengqi Chen }
39b6c4e715SHengqi Chen 
40b6c4e715SHengqi Chen char _license[] SEC("license") = "GPL";
41