From 2e99d43846d41970e67d2299f46aa4723ad37ea0 Mon Sep 17 00:00:00 2001 From: Glenn L McGrath Date: Fri, 23 Jul 2004 01:49:46 +0000 Subject: Fix for a bug identied by Harald Kuthe, when using many interfaces (29 in this case) the order was incorrect and there were duplicate entries. --- libbb/interface.c | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) (limited to 'libbb/interface.c') diff --git a/libbb/interface.c b/libbb/interface.c index 2589eec49..f3655b0e0 100644 --- a/libbb/interface.c +++ b/libbb/interface.c @@ -15,7 +15,7 @@ * that either displays or sets the characteristics of * one or more of the system's networking interfaces. * - * Version: $Id: interface.c,v 1.22 2004/04/14 17:57:11 andersen Exp $ + * Version: $Id: interface.c,v 1.23 2004/07/23 01:49:46 bug1 Exp $ * * Author: Fred N. van Kempen, * and others. Copyright 1993 MicroWalt Corporation @@ -889,30 +889,25 @@ static int sockets_open(int family) } /* like strcmp(), but knows about numbers */ -static int nstrcmp(const char *astr, const char *b) +static int nstrcmp(const char *a, const char *b) { - const char *a = astr; + const char *a_ptr = a; + const char *b_ptr = b; while (*a == *b) { - if (*a == '\0') + if (*a == '\0') { return 0; + } + if (!isdigit(*a) && isdigit(*(a+1))) { + a_ptr = a+1; + b_ptr = b+1; + } a++; b++; } - if (isdigit(*a)) { - if (!isdigit(*b)) - return -1; - while (a > astr) { - a--; - if (!isdigit(*a)) { - a++; - break; - } - if (!isdigit(*b)) - return -1; - b--; - } - return atoi(a) > atoi(b) ? 1 : -1; + + if (isdigit(*a) && isdigit(*b)) { + return atoi(a_ptr) > atoi(b_ptr) ? 1 : -1; } return *a - *b; } -- cgit v1.2.3