.nlh = {
.nlmsg_len = sizeof(req),
.nlmsg_type = SOCK_DIAG_BY_FAMILY,
- .nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST
+ .nlmsg_flags = NLM_F_REQUEST
},
.udr = {
.sdiag_family = AF_UNIX,
.udiag_ino = inode,
.udiag_states = -1,
- .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER
+ .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER,
+ .udiag_cookie = { ~0U, ~0U }
}
};
struct iovec iov = {
#endif
static void
-send_query(const int fd, const int family, const int proto)
+send_query(const int fd, const unsigned int inode)
{
struct sockaddr_nl nladdr = {
.nl_family = AF_NETLINK
.nlh = {
.nlmsg_len = sizeof(req),
.nlmsg_type = SOCK_DIAG_BY_FAMILY,
- .nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST
+ .nlmsg_flags = NLM_F_REQUEST
},
.udr = {
- .sdiag_family = family,
- .sdiag_protocol = proto,
+ .sdiag_family = AF_UNIX,
+ .udiag_ino = inode,
.udiag_states = -1,
- .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER
+ .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER,
+ .udiag_cookie = { ~0U, ~0U }
}
};
struct iovec iov = {
}
static void
-check_responses(const int fd)
+check_responses(const int fd, const unsigned int inode)
{
static char buf[8192];
struct sockaddr_nl nladdr = {
const struct unix_diag_msg *diag = NLMSG_DATA(h);
if (h->nlmsg_len < NLMSG_LENGTH(sizeof(*diag)))
error_msg_and_skip("short response");
+ if (diag->udiag_ino != inode)
+ error_msg_and_skip("inode mismatch");
}
#define SUN_PATH "netlink_unix_diag_socket"
if (socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG) != 1)
perror_msg_and_skip("socket AF_NETLINK");
- send_query(1, AF_UNIX, 0);
- check_responses(1);
+ unsigned int inode = inode_of_sockfd(0);
+ send_query(1, inode);
+ check_responses(1, inode);
return 0;
}