* socketutils.c: (print_sockeaddr_by_inode): Call netlink_print. (netlink_send_query, netlink_parse_response, netlink_print): New functions. --- socketutils.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-)
diff --git a/socketutils.c b/socketutils.c index 8851198..9159842 100644 --- a/socketutils.c +++ b/socketutils.c @@ -34,7 +34,9 @@ #include <linux/sock_diag.h> #include <linux/inet_diag.h> #include <linux/unix_diag.h> +#include <linux/netlink_diag.h> #include <linux/rtnetlink.h> +# include "xlat/netlink_protocols.h" #if !defined NETLINK_SOCK_DIAG && defined NETLINK_INET_DIAG # define NETLINK_SOCK_DIAG NETLINK_INET_DIAG @@ -335,6 +337,60 @@ unix_parse_response(const char *proto_name, const void *data, } static bool +netlink_send_query(const int fd, const unsigned long inode) +{ + struct { + const struct nlmsghdr nlh; + const struct netlink_diag_req idr; + } req = { + .nlh = { + .nlmsg_len = sizeof(req), + .nlmsg_type = SOCK_DIAG_BY_FAMILY, + .nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST + }, + .idr = { + .sdiag_family = AF_NETLINK, + .sdiag_protocol = NDIAG_PROTO_ALL, + .ndiag_ino = (unsigned) inode, + .ndiag_show = NDIAG_SHOW_MEMINFO + } + }; + return send_query(fd, &req, sizeof(req)); +} + +static int +netlink_parse_response(const char *proto_name, const void *data, + const int data_len, const unsigned long inode) +{ + const struct netlink_diag_msg *const diag_msg = data; + const char *netlink_proto; + char *details; + + if (data_len < (int) NLMSG_LENGTH(sizeof(*diag_msg))) + return -1; + if (diag_msg->ndiag_ino != inode) + return 0; + + if (diag_msg->ndiag_family != AF_NETLINK) + return -1; + + netlink_proto = xlookup(netlink_protocols, + diag_msg->ndiag_protocol); + + if (netlink_proto) { + if (asprintf(&details, "%s:[%s]", proto_name, + netlink_proto) < 0) + return -1; + } else { + if (asprintf(&details, "%s:[%u]", proto_name, + (unsigned) diag_msg->ndiag_protocol) < 0) + return -1; + } + + return cache_and_print_inode_details(inode, details); +} + +static bool unix_print(const int fd, const unsigned long inode) { return unix_send_query(fd, inode) @@ -365,6 +421,14 @@ udp_v6_print(const int fd, const unsigned long inode) return inet_print(fd, AF_INET6, IPPROTO_UDP, inode, "UDPv6"); } +static bool +netlink_print(const int fd, const unsigned long inode) +{ + return netlink_send_query(fd, inode) + && receive_responses(fd, inode, "NETLINK", + netlink_parse_response); +} + /* Given an inode number of a socket, print out the details * of the ip address and port. */ bool @@ -378,7 +442,8 @@ print_sockaddr_by_inode(const unsigned long inode, const char *const proto_name) { "UDP", udp_v4_print }, { "TCPv6", tcp_v6_print }, { "UDPv6", udp_v6_print }, - { "UNIX", unix_print } + { "UNIX", unix_print }, + { "NETLINK", netlink_print } }; const int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG); -- 2.8.0 ------------------------------------------------------------------------------ Mobile security can be enabling, not merely restricting. Employees who bring their own devices (BYOD) to work are irked by the imposition of MDM restrictions. Mobile Device Manager Plus allows you to control only the apps on BYO-devices by containerizing them, leaving personal data untouched! https://ad.doubleclick.net/ddm/clk/304595813;131938128;j _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel