From: vadimk Date: Sat, 29 Nov 2014 21:44:32 +0000 (+0200) Subject: ss: Use generic handle_netlink_request for packet X-Git-Tag: v3.18.0~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b28be6e140e3fc2cf600f6508972afe56b4581c;p=thirdparty%2Fiproute2.git ss: Use generic handle_netlink_request for packet Get rid of self-handling and creating of Netlink socket for show packet socket stats. Signed-off-by: Vadim Kochan --- diff --git a/misc/ss.c b/misc/ss.c index 0526205cd..a99294dcd 100644 --- a/misc/ss.c +++ b/misc/ss.c @@ -2788,86 +2788,13 @@ static int packet_show_sock(struct nlmsghdr *nlh, struct filter *f) static int packet_show_netlink(struct filter *f, FILE *dump_fp) { - int fd; DIAG_REQUEST(req, struct packet_diag_req r); - char buf[16384]; - - if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_INET_DIAG)) < 0) - return -1; 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); }