[iproute PATCH 05/12] ip{,6}tunnel: align do_tunnels_list() a bit

2015-11-13 Thread Phil Sutter
In iptunnel, declare loop variables inside the loop as done in
ip6tunnel.

Fix and simplify goto logic in ip6tunnel:
- Failure to read over header lines would have left fp opened.
- By returning directly upon fopen() failure, fp can be closed
  unconditionally in the end.

Use the same goto logic in iptunnel, as well.

Signed-off-by: Phil Sutter 
---
 ip/ip6tunnel.c |  8 +++-
 ip/iptunnel.c  | 25 +
 2 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/ip/ip6tunnel.c b/ip/ip6tunnel.c
index 410276f..ba92518 100644
--- a/ip/ip6tunnel.c
+++ b/ip/ip6tunnel.c
@@ -326,14 +326,14 @@ static int do_tunnels_list(struct ip6_tnl_parm2 *p)
FILE *fp = fopen("/proc/net/dev", "r");
if (fp == NULL) {
perror("fopen");
-   goto end;
+   return -1;
}
 
/* 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");
-   return -1;
+   goto end;
}
 
while (fgets(buf, sizeof(buf), fp) != NULL) {
@@ -395,10 +395,8 @@ static int do_tunnels_list(struct ip6_tnl_parm2 *p)
printf("\n");
}
err = 0;
-
  end:
-   if (fp)
-   fclose(fp);
+   fclose(fp);
return err;
 }
 
diff --git a/ip/iptunnel.c b/ip/iptunnel.c
index a547852..e323c1f 100644
--- a/ip/iptunnel.c
+++ b/ip/iptunnel.c
@@ -396,14 +396,8 @@ static void print_tunnel(struct ip_tunnel_parm *p)
 
 static int do_tunnels_list(struct ip_tunnel_parm *p)
 {
-   char name[IFNAMSIZ];
-   unsigned long  rx_bytes, rx_packets, rx_errs, rx_drops,
-   rx_fifo, rx_frame,
-   tx_bytes, tx_packets, tx_errs, tx_drops,
-   tx_fifo, tx_colls, tx_carrier, rx_multi;
-   struct ip_tunnel_parm p1;
-
char buf[512];
+   int err = -1;
FILE *fp = fopen("/proc/net/dev", "r");
if (fp == NULL) {
perror("fopen");
@@ -414,19 +408,24 @@ static int do_tunnels_list(struct ip_tunnel_parm *p)
if (!fgets(buf, sizeof(buf), fp) ||
!fgets(buf, sizeof(buf), fp)) {
fprintf(stderr, "/proc/net/dev read error\n");
-   fclose(fp);
-   return -1;
+   goto end;
}
 
while (fgets(buf, sizeof(buf), fp) != NULL) {
+   char name[IFNAMSIZ];
int index, type;
+   unsigned long rx_bytes, rx_packets, rx_errs, rx_drops,
+   rx_fifo, rx_frame,
+   tx_bytes, tx_packets, tx_errs, tx_drops,
+   tx_fifo, tx_colls, tx_carrier, rx_multi;
+   struct ip_tunnel_parm 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");
-   fclose(fp);
-   return -1;
+   goto end;
}
if (sscanf(ptr, "%ld%ld%ld%ld%ld%ld%ld%*d%ld%ld%ld%ld%ld%ld%ld",
   _bytes, _packets, _errs, _drops,
@@ -467,8 +466,10 @@ static int do_tunnels_list(struct ip_tunnel_parm *p)
}
printf("\n");
}
+   err = 0;
+ end:
fclose(fp);
-   return 0;
+   return err;
 }
 
 static int do_show(int argc, char **argv)
-- 
2.1.2

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [iproute PATCH 05/12] ip{,6}tunnel: align do_tunnels_list() a bit

2015-11-13 Thread David Laight
From: Phil Sutter
> Sent: 13 November 2015 17:09
> In iptunnel, declare loop variables inside the loop as done in
> ip6tunnel.
...
> @@ -396,14 +396,8 @@ static void print_tunnel(struct ip_tunnel_parm *p)
> 
>  static int do_tunnels_list(struct ip_tunnel_parm *p)
>  {
> - char name[IFNAMSIZ];
> - unsigned long  rx_bytes, rx_packets, rx_errs, rx_drops,
> - rx_fifo, rx_frame,
> - tx_bytes, tx_packets, tx_errs, tx_drops,
> - tx_fifo, tx_colls, tx_carrier, rx_multi;
> - struct ip_tunnel_parm p1;
> -
...
>   while (fgets(buf, sizeof(buf), fp) != NULL) {
> + char name[IFNAMSIZ];
>   int index, type;
> + unsigned long rx_bytes, rx_packets, rx_errs, rx_drops,
> + rx_fifo, rx_frame,
> + tx_bytes, tx_packets, tx_errs, tx_drops,
> + tx_fifo, tx_colls, tx_carrier, rx_multi;
> + struct ip_tunnel_parm p1;
>   char *ptr;
> +

Personally I find that just makes it harder to find where the
variables are defined.
Since the linux kernel cannot be compiled with -Wshadow declaring
variables in inner scopes can easily lead to very strange bugs.

David
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [iproute PATCH 05/12] ip{,6}tunnel: align do_tunnels_list() a bit

2015-11-13 Thread Phil Sutter
On Fri, Nov 13, 2015 at 05:30:10PM +, David Laight wrote:
> From: Phil Sutter
> > Sent: 13 November 2015 17:09
> > In iptunnel, declare loop variables inside the loop as done in
> > ip6tunnel.
> ...
> > @@ -396,14 +396,8 @@ static void print_tunnel(struct ip_tunnel_parm *p)
> > 
> >  static int do_tunnels_list(struct ip_tunnel_parm *p)
> >  {
> > -   char name[IFNAMSIZ];
> > -   unsigned long  rx_bytes, rx_packets, rx_errs, rx_drops,
> > -   rx_fifo, rx_frame,
> > -   tx_bytes, tx_packets, tx_errs, tx_drops,
> > -   tx_fifo, tx_colls, tx_carrier, rx_multi;
> > -   struct ip_tunnel_parm p1;
> > -
> ...
> > while (fgets(buf, sizeof(buf), fp) != NULL) {
> > +   char name[IFNAMSIZ];
> > int index, type;
> > +   unsigned long rx_bytes, rx_packets, rx_errs, rx_drops,
> > +   rx_fifo, rx_frame,
> > +   tx_bytes, tx_packets, tx_errs, tx_drops,
> > +   tx_fifo, tx_colls, tx_carrier, rx_multi;
> > +   struct ip_tunnel_parm p1;
> > char *ptr;
> > +
> 
> Personally I find that just makes it harder to find where the
> variables are defined.

Well, the above aligns the code with ip/ip6tunnel.c in that particular
matter. I'm neither a friend of the old nor the new version, so if
everyone thinks it is better without this patch, I'm fine with changing
ip/ip6tunnel.c accordingly as well.

Looking at the code again, maybe the better option overall would be to
export the whole file reading and stats printing code into a shared
function.

> Since the linux kernel cannot be compiled with -Wshadow declaring
> variables in inner scopes can easily lead to very strange bugs.

Well, since this is not kernel code but iproute2 one, we *could* compile
it with -Wshadow.

Thanks, Phil
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html