diff mbox

Allow specifying bridge port STP state by name rather than number.

Message ID 20150219192726.GA17950@alexpilon.ca
State Accepted, archived
Delegated to: stephen hemminger
Headers show

Commit Message

Alex Pilon Feb. 19, 2015, 7:27 p.m. UTC
The existing behaviour forces one to memorize the integer constants for
STP port states.

    # bridge link set dev dummy0 state 3

This patch makes it possible to use the lowercased port state name.

    # bridge link set dev dummy0 state forwarding

Invalid non-integer inputs now cause exit with status -1.

Signed-off-by: Alex Pilon <alp@alexpilon.ca>
---
 bridge/link.c     | 14 +++++++++++++-
 man/man8/bridge.8 |  4 +++-
 2 files changed, 16 insertions(+), 2 deletions(-)

Comments

Jonathon Reinhart Feb. 20, 2015, 2 a.m. UTC | #1
Please don't pass -1 to exit().  It is outside the acceptable range (0 to 255)
of exit status values:

https://www.gnu.org/software/libc/manual/html_node/Exit-Status.html

Most programs exit(1) when presented with invalid user input.

On Thu, Feb 19, 2015 at 2:27 PM, Alex Pilon <alp@alexpilon.ca> wrote:
> The existing behaviour forces one to memorize the integer constants for
> STP port states.
>
>     # bridge link set dev dummy0 state 3
>
> This patch makes it possible to use the lowercased port state name.
>
>     # bridge link set dev dummy0 state forwarding
>
> Invalid non-integer inputs now cause exit with status -1.
>
> Signed-off-by: Alex Pilon <alp@alexpilon.ca>
> ---
>  bridge/link.c     | 14 +++++++++++++-
>  man/man8/bridge.8 |  4 +++-
>  2 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/bridge/link.c b/bridge/link.c
> index c8555f8..a7bd85f 100644
> --- a/bridge/link.c
> +++ b/bridge/link.c
> @@ -316,7 +316,19 @@ static int brlink_modify(int argc, char **argv)
>                         priority = atoi(*argv);
>                 } else if (strcmp(*argv, "state") == 0) {
>                         NEXT_ARG();
> -                       state = atoi(*argv);
> +                       char *endptr;
> +                       size_t nstates = sizeof(port_states) / sizeof(*port_states);
> +                       state = strtol(*argv, &endptr, 10);
> +                       if (!(**argv != '\0' && *endptr == '\0')) {
> +                               for (state = 0; state < nstates; state++)
> +                                       if (strcmp(port_states[state], *argv) == 0)
> +                                               break;
> +                               if (state == nstates) {
> +                                       fprintf(stderr,
> +                                               "Error: invalid STP port state\n");
> +                                       exit(-1);
> +                               }
> +                       }
>                 } else if (strcmp(*argv, "hwmode") == 0) {
>                         NEXT_ARG();
>                         flags = BRIDGE_FLAGS_SELF;
> diff --git a/man/man8/bridge.8 b/man/man8/bridge.8
> index e344db2..68ad71e 100644
> --- a/man/man8/bridge.8
> +++ b/man/man8/bridge.8
> @@ -207,7 +207,9 @@ droot port selectio algorithms.
>  .TP
>  .BI state " STATE "
>  the operation state of the port.  This is primarily used by user space STP/RSTP
> -implementation.  The following is a list of valid values:
> +implementation.  One may enter a lowercased port state name, or one of the
> +numbers below.  Negative inputs are ignored, and unrecognized names return an
> +error.
>
>  .B 0
>  - port is DISABLED.  Make this port completely inactive.
> --
> 2.3.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alex Pilon Feb. 20, 2015, 4:57 a.m. UTC | #2
On Thu, Feb 19, 2015 at 09:00:23PM -0500, Jonathon Reinhart wrote:
> Please don't pass -1 to exit().  It is outside the acceptable range (0 to 255)
> of exit status values:
>
> https://www.gnu.org/software/libc/manual/html_node/Exit-Status.html
>
> Most programs exit(1) when presented with invalid user input.

I was being consistent with nearby code, and the dominant style.  But if
that's the case, then there's a few hundred such mistakes that need
correcting.  Should I fix all of them, and if so, should that be a
single patch, or multiple?

There's also only a few instances of EXIT_{SUCCESS,FAILURE}, so I took
it wasn't the style to use that.

Regards,

Alex Pilon
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jonathon Reinhart Feb. 20, 2015, 2:40 p.m. UTC | #3
Sorry, I only looked at your patch, and not the surrounding code. In that
case, I would probably stick with the existing style.

I'm just a casual passer-by, but I would like to hear others' opinion on this,
as I find exit(-1) to always be incorrect. The problem is that, per the man
page:

> The exit() function causes normal process termination and the value
> of status & 0377 is returned to the parent (see wait(2)).

So when -1 is passed to exit(), the parent will see it as 255. Why not
return a value that could be found in the source by grepping for it?

On Thu, Feb 19, 2015 at 11:57 PM, Alex Pilon <alp@alexpilon.ca> wrote:
> On Thu, Feb 19, 2015 at 09:00:23PM -0500, Jonathon Reinhart wrote:
>> Please don't pass -1 to exit().  It is outside the acceptable range (0 to 255)
>> of exit status values:
>>
>> https://www.gnu.org/software/libc/manual/html_node/Exit-Status.html
>>
>> Most programs exit(1) when presented with invalid user input.
>
> I was being consistent with nearby code, and the dominant style.  But if
> that's the case, then there's a few hundred such mistakes that need
> correcting.  Should I fix all of them, and if so, should that be a
> single patch, or multiple?
>
> There's also only a few instances of EXIT_{SUCCESS,FAILURE}, so I took
> it wasn't the style to use that.
>
> Regards,
>
> Alex Pilon
diff mbox

Patch

diff --git a/bridge/link.c b/bridge/link.c
index c8555f8..a7bd85f 100644
--- a/bridge/link.c
+++ b/bridge/link.c
@@ -316,7 +316,19 @@  static int brlink_modify(int argc, char **argv)
 			priority = atoi(*argv);
 		} else if (strcmp(*argv, "state") == 0) {
 			NEXT_ARG();
-			state = atoi(*argv);
+			char *endptr;
+			size_t nstates = sizeof(port_states) / sizeof(*port_states);
+			state = strtol(*argv, &endptr, 10);
+			if (!(**argv != '\0' && *endptr == '\0')) {
+				for (state = 0; state < nstates; state++)
+					if (strcmp(port_states[state], *argv) == 0)
+						break;
+				if (state == nstates) {
+					fprintf(stderr,
+						"Error: invalid STP port state\n");
+					exit(-1);
+				}
+			}
 		} else if (strcmp(*argv, "hwmode") == 0) {
 			NEXT_ARG();
 			flags = BRIDGE_FLAGS_SELF;
diff --git a/man/man8/bridge.8 b/man/man8/bridge.8
index e344db2..68ad71e 100644
--- a/man/man8/bridge.8
+++ b/man/man8/bridge.8
@@ -207,7 +207,9 @@  droot port selectio algorithms.
 .TP
 .BI state " STATE "
 the operation state of the port.  This is primarily used by user space STP/RSTP
-implementation.  The following is a list of valid values:
+implementation.  One may enter a lowercased port state name, or one of the
+numbers below.  Negative inputs are ignored, and unrecognized names return an
+error.
 
 .B 0
 - port is DISABLED.  Make this port completely inactive.