From patchwork Wed Jan 31 19:49:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 868052 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="vHf0a/nd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zWv3x3VL6z9sR8 for ; Thu, 1 Feb 2018 06:50:21 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751435AbeAaTuS (ORCPT ); Wed, 31 Jan 2018 14:50:18 -0500 Received: from mail-lf0-f66.google.com ([209.85.215.66]:39528 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751163AbeAaTuQ (ORCPT ); Wed, 31 Jan 2018 14:50:16 -0500 Received: by mail-lf0-f66.google.com with SMTP id w27so22559284lfd.6 for ; Wed, 31 Jan 2018 11:50:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=eaGjQtDGoJLnMou5+CAuF0s29xNbjgZ3xKJvMrCazhE=; b=vHf0a/ndzyukaQxeqpRgYyQp9nYLhtVXDmsrk7j8fGhBTK5DGQort3MNnm6KvWc4tf 6UKVBFu2GTintf19Z4kLTvFA3KAMGHeuvoG6dOS9xXjnqFemCtBbb/gCYO0VUJF9uHj/ heVeqJzQnuqnjBnUPzX7Joj+Hbm6HOXW9iU1ro+2K0WZ9ht3p2+QcxIvfnSMMH/W5s+A AMJLMu+gyFgjkPADeFhbYA+f8jjVsMU5eXnOSEdHG4GidNod6qzobYg5+gF4FKzBFZP3 4GALPVPo2y3bDeiFg2S1SoWer1pWtqjzsc9zJK5bGKsHAa2CzPZSDyNJyb5+3sPteWQv UdnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=eaGjQtDGoJLnMou5+CAuF0s29xNbjgZ3xKJvMrCazhE=; b=PVx7iEv7G1BcruUQTSotjYcQtsfgwPAnZdslu7OQfxFGfqLfXApL9p5iOk/ljAJP9a yueZcchZlQkqxJLV8k+oqVx5sw5ap+4PqXkp+HQ92LNNsaPJtzK08dbbHRq2kwIMzqAf cNHtNCnwwy4i2RNryAoljYLW04sl+NJdRS+F9yZJr9Q0QKEK3MgoGE9Xt5gv0L1xp13M USxaeJOgyJlAeFaIM5yf9A6PxhujgR9JrlNQsuqfoYRH1B2QRAF4zRci/gq2MIpxE+zp vizMmwg1jhiJlxNXWG9BYIkulRU9qk5ReRD3A17V6NN73IGu7VDTn+oapkgVWuybJFT7 LzKw== X-Gm-Message-State: AKwxytfnTb1GiEJpW5fFdwdw+RGAdBUTAuRG9nBbvpPZZ/p7aalRWe33 4sQ08hX9eNc3lSYzotMR05O2hA== X-Google-Smtp-Source: AH8x227i2P4F/iFTwYOxtFfjlAEGyGX/DYVMfv/0RlM+04ghrMitt8YDUSbRvRRzJtCRS+2JPpbzPw== X-Received: by 10.46.101.26 with SMTP id z26mr8660335ljb.37.1517428215221; Wed, 31 Jan 2018 11:50:15 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id q77sm4040318lfd.17.2018.01.31.11.50.14 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 31 Jan 2018 11:50:14 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next 1/4] utils: Introduce do_each_proc_net_dev() helper Date: Wed, 31 Jan 2018 21:49:46 +0200 Message-Id: <1517428189-29279-2-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1517428189-29279-1-git-send-email-serhe.popovych@gmail.com> References: <1517428189-29279-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org It is natural for ip(8) tool to access /proc/net/dev for various information and there at least two places implementing same iteration over lines in this file: iptunnel.c and ip6tunnel.c. To unify interface and avoid code duplication introduce helper that reads line from /proc/net/dev, passes it to given callback function that may return following three states to control do_each_proc_net_dev() behaviour: o PND_ERROR - stop reading lines and return -1 o PND_OK - stop reading lines and return 0 o PND_NEXT - continue by reading next line. Signed-off-by: Serhey Popovych --- include/utils.h | 10 ++++++++++ lib/utils.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/include/utils.h b/include/utils.h index 0394268..819b0ca 100644 --- a/include/utils.h +++ b/include/utils.h @@ -285,6 +285,16 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, int do_each_netns(int (*func)(char *nsname, void *arg), void *arg, bool show_label); +typedef enum { + PND_ERROR = -1, + PND_OK = 0, + PND_NEXT = 1 +} pnd_result_t; + +typedef pnd_result_t (pnd_func_t)(char *name, char *stats, void *arg); + +int do_each_proc_net_dev(pnd_func_t f, void *arg); + char *int_to_str(int val, char *buf); int get_guid(__u64 *guid, const char *arg); int get_real_family(int rtm_type, int rtm_family); diff --git a/lib/utils.c b/lib/utils.c index 8e15625..4f142d8 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -1375,6 +1375,57 @@ int do_each_netns(int (*func)(char *nsname, void *arg), void *arg, return netns_foreach(on_netns, &nsf); } +int do_each_proc_net_dev(pnd_func_t f, void *arg) +{ + static const char pnd[] = "/proc/net/dev"; + char buf[512]; + int err = -1; + FILE *fp; + + fp = fopen(pnd, "r"); + if (!fp) { + perror("fopen"); + return -1; + } + + /* skip two lines at the begenning of the file */ + if (!fgets(buf, sizeof(buf), fp) || + !fgets(buf, sizeof(buf), fp)) { + perror("fgets"); + goto end; + } + + while (fgets(buf, sizeof(buf), fp)) { + char *stats, *name = NULL; + pnd_result_t result; + + buf[sizeof(buf) - 1] = '\0'; + stats = strchr(buf, ':'); + if (stats) { + *stats++ = '\0'; + if (!check_ifname(buf)) + name = buf; + } + if (!name) { + fprintf(stderr, + "Wrong format for \"%s\". Giving up.\n", pnd); + goto end; + } + + result = f(name, stats, arg); + if (result == PND_NEXT) + continue; + if (result == PND_OK) + break; + goto end; + } + if (feof(fp)) + err = 0; +end: + fclose(fp); + return err; +} + char *int_to_str(int val, char *buf) { sprintf(buf, "%d", val); From patchwork Wed Jan 31 19:49:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 868055 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="gdmmY0g3"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zWv4D4ZP0z9sPk for ; Thu, 1 Feb 2018 06:50:36 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751553AbeAaTue (ORCPT ); Wed, 31 Jan 2018 14:50:34 -0500 Received: from mail-lf0-f65.google.com ([209.85.215.65]:33168 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750829AbeAaTuS (ORCPT ); Wed, 31 Jan 2018 14:50:18 -0500 Received: by mail-lf0-f65.google.com with SMTP id t139so22578616lff.0 for ; Wed, 31 Jan 2018 11:50:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=ES8LKyYk9bsMFOCl0YNDMbhTNXVCItkFZrRCnLZf+Ww=; b=gdmmY0g3M9EIlXgxisyjiNMWTuTg6yZ4i3T9JvVWCkPj6OKi8Z3LX0TSI2OsdpgG2L FYfC7uh9LhXrRB8EuKc7MHtGNvO6oaJ39yhtyylfCEtSgLnjEmknklpMx7T0/pKS3oq5 cIUVqiOC4BMGDVClrL7QhiEL2RANdefjYie7Qd7tMt+AwKy6HFyJV6flOQ/kcSe4Nd/s +4wK86Ftw78z5M1AEPIMT0XL7O2SwliaAcLabUAlWlhq+MKCwQNJecTp5jlPrMOtYsbm cROlhZxKUx7CPsu+HRSc8d/vDdKC5F36chyJHRmcBixixAXmzpMPJbSt3FL6VnladQnW luuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=ES8LKyYk9bsMFOCl0YNDMbhTNXVCItkFZrRCnLZf+Ww=; b=B0f1xHWUYjCkwUfYlOkjiGE6Ik9KOWJ0jvG0gXtf1Rp0VOMFZkqixLN9hWn4XhjcFR tRSUmNZC/SEbiCPsudDUpeq8YZCoSNI3vbv553GaGU/QJUcRLv7ldDMQkI3fhaRag03D xswCPI0ecgUYeDzxg1gmmLGbUPhgCKysXK6WMmGt9hJvNphDWSFBd4G/cbe/7PYffOTP fuEXQSoSVxPWNsLjcLvD7nGbzwc1b8NEbaYEAHxd+zovusiSwQRnkclKAprfpy9Sv+W1 +PAA6JX8j0k4w3DXUFuc/Rzp3BVrJ23vxfdyKZvlbcdfDYQugwFNmG4fH2tBL0v2BKnR bzeg== X-Gm-Message-State: AKwxyte9LlVs0wv76KcpYwaIw2+fRP7YyHIhGqHsYwzmf3AdqO4ms7uf WuKzCJ5yZOtRVls5mBX9ME0DEw== X-Google-Smtp-Source: AH8x226kYgTTgJ383EgF119Xlo9l9uqJ91pOt+FbrQOEdDJAg3PDLs+byKfX4xIzYQehEVptrWKSOA== X-Received: by 10.46.99.202 with SMTP id s71mr6203893lje.143.1517428216372; Wed, 31 Jan 2018 11:50:16 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id q77sm4040318lfd.17.2018.01.31.11.50.15 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 31 Jan 2018 11:50:15 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next 2/4] iptunnel: Use do_each_proc_net_dev() Date: Wed, 31 Jan 2018 21:49:47 +0200 Message-Id: <1517428189-29279-3-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1517428189-29279-1-git-send-email-serhe.popovych@gmail.com> References: <1517428189-29279-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now we have helper to iterate over entries in /proc/net/dev we can simplify and cleanup do_tunnels_list() in ip/iptunnel.c. While there replace printf("\n") with fputc('\n', stdout) and printf() with fputs() where string does not contain format specifiers. Also move tunnel parameter matching to new static helper function to match ip6tunnel.c. Signed-off-by: Serhey Popovych --- ip/iptunnel.c | 102 ++++++++++++++++++++++++++------------------------------- 1 file changed, 47 insertions(+), 55 deletions(-) diff --git a/ip/iptunnel.c b/ip/iptunnel.c index 0aa3b33..b60a7b7 100644 --- a/ip/iptunnel.c +++ b/ip/iptunnel.c @@ -373,66 +373,58 @@ static void print_tunnel(struct ip_tunnel_parm *p) printf("%s Checksum output packets.", _SL_); } -static int do_tunnels_list(struct ip_tunnel_parm *p) +/* + * @p1: user specified parameter + * @p2: database entry + */ +static int ip_tunnel_parm_match(const struct ip_tunnel_parm *p1, + const struct ip_tunnel_parm *p2) { - char buf[512]; - int err = -1; - FILE *fp = fopen("/proc/net/dev", "r"); + return ((!p1->link || p1->link == p2->link) && + (!p1->name[0] || strcmp(p1->name, p2->name) == 0) && + (!p1->iph.daddr || p1->iph.daddr == p2->iph.daddr) && + (!p1->iph.saddr || p1->iph.saddr == p2->iph.saddr) && + (!p1->i_key || p1->i_key == p2->i_key)); +} - if (fp == NULL) { - perror("fopen"); - return -1; - } +static pnd_result_t do_tunnels_list(char *name, char *stats, void *arg) +{ + struct ip_tunnel_parm p1, *p = arg; + int index, type; + + if (p->name[0] && strcmp(p->name, name)) + return PND_NEXT; - /* skip header lines */ - if (!fgets(buf, sizeof(buf), fp) || - !fgets(buf, sizeof(buf), fp)) { - fprintf(stderr, "/proc/net/dev read error\n"); - goto end; + index = ll_name_to_index(name); + if (index <= 0) + return PND_NEXT; + + type = ll_index_to_type(index); + if (type == -1) { + fprintf(stderr, "Failed to get type of \"%s\"\n", name); + return PND_NEXT; } - while (fgets(buf, sizeof(buf), fp) != NULL) { - char name[IFNAMSIZ]; - int index, type; - struct ip_tunnel_parm p1 = {}; - char *ptr; - - buf[sizeof(buf) - 1] = 0; - ptr = strchr(buf, ':'); - if (ptr == NULL || - (*ptr++ = 0, sscanf(buf, "%s", name) != 1)) { - fprintf(stderr, "Wrong format for /proc/net/dev. Giving up.\n"); - goto end; - } - if (p->name[0] && strcmp(p->name, name)) - continue; - index = ll_name_to_index(name); - if (index == 0) - continue; - type = ll_index_to_type(index); - if (type == -1) { - fprintf(stderr, "Failed to get type of \"%s\"\n", name); - continue; - } - if (type != ARPHRD_TUNNEL && type != ARPHRD_IPGRE && type != ARPHRD_SIT) - continue; - if (tnl_get_ioctl(name, &p1)) - continue; - if ((p->link && p1.link != p->link) || - (p->name[0] && strcmp(p1.name, p->name)) || - (p->iph.daddr && p1.iph.daddr != p->iph.daddr) || - (p->iph.saddr && p1.iph.saddr != p->iph.saddr) || - (p->i_key && p1.i_key != p->i_key)) - continue; - print_tunnel(&p1); - if (show_stats) - tnl_print_stats(ptr); - printf("\n"); + switch (type) { + case ARPHRD_TUNNEL: + case ARPHRD_IPGRE: + case ARPHRD_SIT: + return PND_NEXT; } - err = 0; - end: - fclose(fp); - return err; + + memset(&p1, 0, sizeof(p1)); + if (tnl_get_ioctl(name, &p1)) + return PND_NEXT; + + if (!ip_tunnel_parm_match(p, &p1)) + return PND_NEXT; + + print_tunnel(&p1); + if (show_stats) + tnl_print_stats(stats); + fputc('\n', stdout); + + return PND_NEXT; } static int do_show(int argc, char **argv) @@ -446,7 +438,7 @@ static int do_show(int argc, char **argv) basedev = tnl_defname(&p); if (!basedev) - return do_tunnels_list(&p); + return do_each_proc_net_dev(do_tunnels_list, &p); if (tnl_get_ioctl(p.name[0] ? p.name : basedev, &p)) return -1; From patchwork Wed Jan 31 19:49:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 868054 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="f+6lj0+J"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zWv432ysnz9sPk for ; Thu, 1 Feb 2018 06:50:27 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751516AbeAaTuY (ORCPT ); Wed, 31 Jan 2018 14:50:24 -0500 Received: from mail-lf0-f65.google.com ([209.85.215.65]:33175 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751405AbeAaTuT (ORCPT ); Wed, 31 Jan 2018 14:50:19 -0500 Received: by mail-lf0-f65.google.com with SMTP id t139so22578707lff.0 for ; Wed, 31 Jan 2018 11:50:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=GQb6yWaRcMki85yMY1/tyWIzKkYYdF9vrOPh5gMNd1s=; b=f+6lj0+J3/Vda5dp85XkVSN+iX4EkLpM/2IRWmd7oM5GszCMqV9d2lhwYpp1m2GYVx 5EdGQll8kSgcwHw/ak2B6CMGLJc1Y4dxzIgQhCpoCF4N78iXQuFUG0QKsEzM54dtQj0B 6s1LjBfiSsAXRbuf/+d+js+1MyUAl82TdRdIFDJfeRK9DEv7+6Xzi34/vwd77Kvfbzqn i7zc0KuQrRDJmJmtN38GMvhlr0/tgh3TUpL9gexleLhr/kHAMsyuEJZlAYtT9rC3eAs0 CFC0eFQNc855AfeYNjCG5QqI2TDk30JL46MhE7lr67Nd/DRH/IoZT3AYNxT+I0vRVyAQ eLEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=GQb6yWaRcMki85yMY1/tyWIzKkYYdF9vrOPh5gMNd1s=; b=TizBrtjnNpCiR0bYhViei0xz7b7h3JycnWwuflh7ztIinhIDx9JpZuZBjR9K5Shzw5 tb4RWTqdSeIRNjo5i6/TvcnmSReqM5RazHADycHVFAbF35H1YASZJ2yhbha3/TPxGN05 kuBLjeqpm7KuyZlbM8YEzOr3G4/RHUv7/KRH2wF/K1jCupSE6VmLq4yGAKzCZJ77j0Cg P/pt6qqZUeUYxJvMk6y8Gfe8ycSwu74eI/uvjZ8Jcmy5txuRfLLdIyyJDQiRJmSWtI+g blB4oolYtrciSfTznl7BayNmfyq+rWwuHjX/86ttgUCpqBeCw7/hDlHvHWaaTjtB+YSw sEUQ== X-Gm-Message-State: AKwxytfGMnz6P+eqCLrSv8i7cT2JJd1smrCfcGYe6A1IxT/cOji3qAZr KZxMG/fjbdUHfaO83jkzYsWKNQ== X-Google-Smtp-Source: AH8x227wddwHhP2xIzKCwHHmI300FzAJtoTX5SFEG3QnIdZddsvFJ4cDbOAtFQtFSdWHavuGRZcoTg== X-Received: by 10.46.50.21 with SMTP id y21mr19669939ljy.24.1517428217560; Wed, 31 Jan 2018 11:50:17 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id q77sm4040318lfd.17.2018.01.31.11.50.16 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 31 Jan 2018 11:50:16 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next 3/4] ip6tunnel: Use do_each_proc_net_dev() Date: Wed, 31 Jan 2018 21:49:48 +0200 Message-Id: <1517428189-29279-4-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1517428189-29279-1-git-send-email-serhe.popovych@gmail.com> References: <1517428189-29279-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now we have helper to iterate over entries in /proc/net/dev we can simplify and cleanup do_tunnels_list() in ip/iptunnel.c. While there replace printf("\n") with fputc('\n', stdout) and printf() with fputs() where string does not contain format specifiers. Signed-off-by: Serhey Popovych --- ip/ip6tunnel.c | 94 ++++++++++++++++++++++---------------------------------- 1 file changed, 37 insertions(+), 57 deletions(-) diff --git a/ip/ip6tunnel.c b/ip/ip6tunnel.c index 783e28a..ccd5603 100644 --- a/ip/ip6tunnel.c +++ b/ip/ip6tunnel.c @@ -336,68 +336,48 @@ static int ip6_tnl_parm_match(const struct ip6_tnl_parm2 *p1, (!p1->flags || (p1->flags & p2->flags))); } -static int do_tunnels_list(struct ip6_tnl_parm2 *p) +static pnd_result_t do_tunnels_list(char *name, char *stats, void *arg) { - char buf[512]; - int err = -1; - FILE *fp = fopen("/proc/net/dev", "r"); + struct ip6_tnl_parm2 p1, *p = arg; + int index, type; - if (fp == NULL) { - perror("fopen"); - return -1; - } + if (p->name[0] && strcmp(p->name, name)) + return PND_NEXT; + + index = ll_name_to_index(name); + if (index <= 0) + return PND_NEXT; - /* skip two lines at the begenning of the file */ - if (!fgets(buf, sizeof(buf), fp) || - !fgets(buf, sizeof(buf), fp)) { - fprintf(stderr, "/proc/net/dev read error\n"); - goto end; + type = ll_index_to_type(index); + if (type == -1) { + fprintf(stderr, "Failed to get type of \"%s\"\n", name); + return PND_NEXT; } - while (fgets(buf, sizeof(buf), fp) != NULL) { - char name[IFNAMSIZ]; - int index, type; - struct ip6_tnl_parm2 p1 = {}; - char *ptr; - - buf[sizeof(buf) - 1] = '\0'; - if ((ptr = strchr(buf, ':')) == NULL || - (*ptr++ = 0, sscanf(buf, "%s", name) != 1)) { - fprintf(stderr, "Wrong format for /proc/net/dev. Giving up.\n"); - goto end; - } - if (p->name[0] && strcmp(p->name, name)) - continue; - index = ll_name_to_index(name); - if (index == 0) - continue; - type = ll_index_to_type(index); - if (type == -1) { - fprintf(stderr, "Failed to get type of \"%s\"\n", name); - continue; - } - if (type != ARPHRD_TUNNEL6 && type != ARPHRD_IP6GRE) - continue; - ip6_tnl_parm_init(&p1, 0); - if (type == ARPHRD_IP6GRE) - p1.proto = IPPROTO_GRE; - strcpy(p1.name, name); - p1.link = ll_name_to_index(p1.name); - if (p1.link == 0) - continue; - if (tnl_get_ioctl(p1.name, &p1)) - continue; - if (!ip6_tnl_parm_match(p, &p1)) - continue; - print_tunnel(&p1); - if (show_stats) - tnl_print_stats(ptr); - printf("\n"); + switch (type) { + case ARPHRD_TUNNEL6: + case ARPHRD_IP6GRE: + return PND_NEXT; } - err = 0; - end: - fclose(fp); - return err; + + ip6_tnl_parm_init(&p1, 0); + if (type == ARPHRD_IP6GRE) + p1.proto = IPPROTO_GRE; + p1.link = index; + name = strcpy(p1.name, name); + + if (tnl_get_ioctl(name, &p1)) + return PND_NEXT; + + if (!ip6_tnl_parm_match(p, &p1)) + return PND_NEXT; + + print_tunnel(&p1); + if (show_stats) + tnl_print_stats(stats); + fputc('\n', stdout); + + return PND_NEXT; } static int do_show(int argc, char **argv) @@ -412,7 +392,7 @@ static int do_show(int argc, char **argv) return -1; if (!p.name[0] || show_stats) - do_tunnels_list(&p); + do_each_proc_net_dev(do_tunnels_list, &p); else { if (tnl_get_ioctl(p.name, &p)) return -1; From patchwork Wed Jan 31 19:49:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 868053 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="dsjA99uG"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zWv413L5fz9sPk for ; Thu, 1 Feb 2018 06:50:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751476AbeAaTuX (ORCPT ); Wed, 31 Jan 2018 14:50:23 -0500 Received: from mail-lf0-f66.google.com ([209.85.215.66]:35662 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751163AbeAaTuU (ORCPT ); Wed, 31 Jan 2018 14:50:20 -0500 Received: by mail-lf0-f66.google.com with SMTP id a204so22574172lfa.2 for ; Wed, 31 Jan 2018 11:50:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=bm93L6xu//QR6UBjmAMDNgahN4Ws+rIXxfy7QuB9/To=; b=dsjA99uGfgDJCDjmt21p/se4D+GIm97O6usUhR4QwNa5AV5NiUcBCGx9iCMVG08GUR rsN+EZbWmF48dwCBoQr/cdzCYVft4dJnPfA/dEAHsamwGJM5mKbf5ZkleZb+9G1w66rU Hg2wl2yM7kacnUGiUEdUnEqkAnZ6k3u/fMkdGY27RtLza2x14N6HWA46EUxjAjkLIwYd +5SdIGVEzPHQUeBKXBzen9tAXzckjwYF7BRZ7eMtRvhyHC1BHWFig82CZvyfR5kTvm+V LGJfe4AnkHOx8PaFV5MYrYB6096n0S2JvYnvO4AIBMAO2zZZuKgyzeBdSwajMWaXNFg6 oWtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=bm93L6xu//QR6UBjmAMDNgahN4Ws+rIXxfy7QuB9/To=; b=IUZC1WMhub+p72uFAaK9YkNTe0cSfsUKQmPF5Ek786hZGHW+J4l2HpCncxaOWgrGm8 gHi0NXoX+WNT6T7VkEpTvzZ+1gNCqDEYqWL0p14HZDCOymRmzx81CVKXWDvXeYpcSsOZ Wp8XQM0W0BGEeJfBoYhLS8eskfOLrmAHl2TQHh8WwpESW5GMS3BCg6Fp28m8xfZ6Fyjp OgfWZ+NGJ2+wy/DcH1QpWazb478scurMP9DuPgu/N/38KsYcHYUDssIEJHLB13BEdjV0 3Cfv/gp2g1i1FfURNxlWWe/2wqLFwRyeU44IOzA2/9qXxQBvAbA2bpYkL7NXpfyN5lzU gmkw== X-Gm-Message-State: AKwxytet1hP1MfmCfH9htFOtm+p4E6yIodFwrzWQ2QdYUeGvs4XoLJmq wRtQtq4X4zMxmeSk8cM38pNjqg== X-Google-Smtp-Source: AH8x224x2LFmLfu5rU0CuYrdWXVD9Pu78ETsPz3v1ifYtI6+ygFstWd4EhbOEjPm98ncNiV5e4xm3w== X-Received: by 10.46.64.219 with SMTP id r88mr196930lje.149.1517428218659; Wed, 31 Jan 2018 11:50:18 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id q77sm4040318lfd.17.2018.01.31.11.50.17 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 31 Jan 2018 11:50:17 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next 4/4] tuntap: Use do_each_proc_net_dev() Date: Wed, 31 Jan 2018 21:49:49 +0200 Message-Id: <1517428189-29279-5-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1517428189-29279-1-git-send-email-serhe.popovych@gmail.com> References: <1517428189-29279-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now we have helper to iterate over entries in /proc/net/dev we can simplify and cleanup do_tunnels_list() in ip/iptuntap.c. While there replace printf("\n") with fputc('\n', stdout) and printf() with fputs() where string does not contain format specifiers. Signed-off-by: Serhey Popovych --- ip/iptuntap.c | 59 ++++++++++++++++++++++++--------------------------------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/ip/iptuntap.c b/ip/iptuntap.c index 09f2be2..01b68ad 100644 --- a/ip/iptuntap.c +++ b/ip/iptuntap.c @@ -348,44 +348,35 @@ next: globfree(&globbuf); } - -static int do_show(int argc, char **argv) +static pnd_result_t do_tuntap_list(char *name, char *stats, void *arg) { - DIR *dir; - struct dirent *d; long flags, owner = -1, group = -1; - dir = opendir("/sys/class/net"); - if (!dir) { - perror("opendir"); - return -1; + if (read_prop(name, "tun_flags", &flags)) + return PND_NEXT; + + read_prop(name, "owner", &owner); + read_prop(name, "group", &group); + + printf("%s:", name); + print_flags(flags); + if (owner != -1) + printf(" user %ld", owner); + if (group != -1) + printf(" group %ld", group); + fputc('\n', stdout); + if (show_details) { + fputs("\tAttached to processes:", stdout); + show_processes(name); + fputc('\n', stdout); } - while ((d = readdir(dir))) { - if (d->d_name[0] == '.' && - (d->d_name[1] == 0 || d->d_name[1] == '.')) - continue; - - if (read_prop(d->d_name, "tun_flags", &flags)) - continue; - - read_prop(d->d_name, "owner", &owner); - read_prop(d->d_name, "group", &group); - - printf("%s:", d->d_name); - print_flags(flags); - if (owner != -1) - printf(" user %ld", owner); - if (group != -1) - printf(" group %ld", group); - printf("\n"); - if (show_details) { - printf("\tAttached to processes:"); - show_processes(d->d_name); - printf("\n"); - } - } - closedir(dir); - return 0; + + return PND_NEXT; +} + +static int do_show(int argc, char **argv) +{ + return do_each_proc_net_dev(do_tuntap_list, NULL); } int do_iptuntap(int argc, char **argv)