Re: [PATCH iproute2] ss: Use generic handle_netlink_request for packet
From: <hidden>
Date: 2014-10-30 17:20:26
On Thu, Oct 16, 2014 at 05:40:32PM +0300, Vadim Kochan wrote:
quoted hunk ↗ jump to hunk
Get rid of self-handling and creating of Netlink socket for show packet socket stats. Signed-off-by: Vadim Kochan <redacted> --- misc/ss.c | 80 +++------------------------------------------------------------ 1 file changed, 3 insertions(+), 77 deletions(-)diff --git a/misc/ss.c b/misc/ss.c index 2420b51..b3cc455 100644 --- a/misc/ss.c +++ b/misc/ss.c@@ -2777,17 +2777,11 @@ static int packet_show_sock(struct nlmsghdr *nlh, struct filter *f) static int packet_show_netlink(struct filter *f, FILE *dump_fp) { - int fd; struct { struct nlmsghdr nlh; struct packet_diag_req r; - } req; - char buf[8192]; - - if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_INET_DIAG)) < 0) - return -1; + } req = {}; - memset(&req, 0, sizeof(req)); req.nlh.nlmsg_len = sizeof(req); req.nlh.nlmsg_type = SOCK_DIAG_BY_FAMILY; req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;@@ -2796,76 +2790,8 @@ static int packet_show_netlink(struct filter *f, FILE *dump_fp) req.r.sdiag_family = AF_PACKET; req.r.pdiag_show = PACKET_SHOW_INFO | PACKET_SHOW_MEMINFO | PACKET_SHOW_FILTER; - if (send(fd, &req, sizeof(req), 0) < 0) { - close(fd); - return -1; - } - - while (1) { - ssize_t status; - struct nlmsghdr *h; - struct sockaddr_nl nladdr; - socklen_t slen = sizeof(nladdr); - - status = recvfrom(fd, buf, sizeof(buf), 0, - (struct sockaddr *) &nladdr, &slen); - if (status < 0) { - if (errno == EINTR) - continue; - perror("OVERRUN"); - continue; - } - if (status == 0) { - fprintf(stderr, "EOF on netlink\n"); - goto close_it; - } - - if (dump_fp) - fwrite(buf, 1, NLMSG_ALIGN(status), dump_fp); - - h = (struct nlmsghdr*)buf; - while (NLMSG_OK(h, status)) { - int err; - - if (h->nlmsg_seq != 123456) - goto skip_it; - - if (h->nlmsg_type == NLMSG_DONE) - goto close_it; - - if (h->nlmsg_type == NLMSG_ERROR) { - struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(h); - if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr))) { - fprintf(stderr, "ERROR truncated\n"); - } else { - errno = -err->error; - if (errno != ENOENT) - fprintf(stderr, "UDIAG answers %d\n", errno); - } - close(fd); - return -1; - } - if (!dump_fp) { - err = packet_show_sock(h, f); - if (err < 0) { - close(fd); - return err; - } - } - -skip_it: - h = NLMSG_NEXT(h, status); - } - - if (status) { - fprintf(stderr, "!!!Remnant of size %zd\n", status); - exit(1); - } - } - -close_it: - close(fd); - return 0; + return handle_netlink_request(f, dump_fp, &req.nlh, sizeof(req), + packet_show_sock); }-- 2.1.0
This patch conflicts with master branch, will re-send v2 later. Regards,