summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archival/dpkg.c2
-rw-r--r--e2fsprogs/fsck.c4
-rw-r--r--include/libbb.h3
-rw-r--r--libbb/compare_string_array.c24
-rw-r--r--miscutils/devfsd.c8
-rw-r--r--networking/ip.c13
-rw-r--r--networking/libiproute/ipaddress.c19
-rw-r--r--networking/libiproute/iproute.c10
-rw-r--r--networking/libiproute/utils.c5
-rw-r--r--util-linux/mount.c6
10 files changed, 50 insertions, 44 deletions
diff --git a/archival/dpkg.c b/archival/dpkg.c
index 2b9c4b8..9024d41 100644
--- a/archival/dpkg.c
+++ b/archival/dpkg.c
@@ -644,7 +644,7 @@ static unsigned int fill_package_struct(char *control_buffer)
goto fill_package_struct_cleanup; /* Oh no, the dreaded goto statement ! */
}
- field_num = compare_string_array(field_names, field_name);
+ field_num = index_in_str_array(field_names, field_name);
switch (field_num) {
case 0: /* Package */
new_node->name = search_name_hashtable(field_value);
diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c
index 53657fb..66b78b6 100644
--- a/e2fsprogs/fsck.c
+++ b/e2fsprogs/fsck.c
@@ -996,11 +996,11 @@ static int ignore(struct fs_info *fs)
if (!fs_match(fs, &fs_type_compiled)) return 1;
/* Are we ignoring this type? */
- if(compare_string_array(ignored_types, fs->type) >= 0)
+ if (index_in_str_array(ignored_types, fs->type) >= 0)
return 1;
/* Do we really really want to check this fs? */
- wanted = compare_string_array(really_wanted, fs->type) >= 0;
+ wanted = index_in_str_array(really_wanted, fs->type) >= 0;
/* See if the <fsck.fs> program is available. */
s = find_fsck(fs->type);
diff --git a/include/libbb.h b/include/libbb.h
index 8c1d784..ce4b922 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -477,7 +477,8 @@ extern void setup_environment(const char *shell, int loginshell, int changeenv,
extern int correct_password(const struct passwd *pw);
extern char *pw_encrypt(const char *clear, const char *salt);
extern int obscure(const char *old, const char *newval, const struct passwd *pwdp);
-extern int compare_string_array(const char * const string_array[], const char *key);
+extern int index_in_str_array(const char * const string_array[], const char *key);
+extern int index_in_substr_array(const char * const string_array[], const char *key);
extern void print_login_issue(const char *issue_file, const char *tty);
extern void print_login_prompt(void);
#ifdef BB_NOMMU
diff --git a/libbb/compare_string_array.c b/libbb/compare_string_array.c
index cac93d9..d15578c 100644
--- a/libbb/compare_string_array.c
+++ b/libbb/compare_string_array.c
@@ -3,11 +3,11 @@
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
-#include <string.h>
#include "libbb.h"
-/* returns the array number of the string */
-int compare_string_array(const char * const string_array[], const char *key)
+/* returns the array index of the string */
+/* (index of first match is returned, or -1) */
+int index_in_str_array(const char * const string_array[], const char *key)
{
int i;
@@ -16,6 +16,22 @@ int compare_string_array(const char * const string_array[], const char *key)
return i;
}
}
- return -i;
+ return -1;
}
+/* returns the array index of the string, even if it matches only a beginning */
+/* (index of first match is returned, or -1) */
+int index_in_substr_array(const char * const string_array[], const char *key)
+{
+ int i;
+ int len = strlen(key);
+ if (!len)
+ return -1;
+
+ for (i = 0; string_array[i] != 0; i++) {
+ if (strncmp(string_array[i], key, len) == 0) {
+ return i;
+ }
+ }
+ return -1;
+}
diff --git a/miscutils/devfsd.c b/miscutils/devfsd.c
index 32973d6..de046e8 100644
--- a/miscutils/devfsd.c
+++ b/miscutils/devfsd.c
@@ -627,7 +627,7 @@ static void process_config_line (const char *line, unsigned long *event_mask)
when, name, what,
p[0], p[1], p[2], p[3], p[4], p[5], p[6]);
- i = compare_string_array(options, when );
+ i = index_in_str_array(options, when );
/*"CLEAR_CONFIG"*/
if( i == 0)
@@ -673,7 +673,7 @@ static void process_config_line (const char *line, unsigned long *event_mask)
goto process_config_line_err;
}
- i = compare_string_array(options, what );
+ i = index_in_str_array(options, what );
switch(i)
{
@@ -1313,8 +1313,8 @@ static const char *get_variable (const char *variable, void *info)
/* Here on error we should do exit(RV_SYS_ERROR), instead we do exit(EXIT_FAILURE) */
hostname[STRING_LENGTH - 1] = '\0';
- /* compare_string_array returns i>=0 */
- i=compare_string_array(field_names, variable);
+ /* index_in_str_array returns i>=0 */
+ i=index_in_str_array(field_names, variable);
if ( i > 6 || i < 0 || (i > 1 && gv_info == NULL))
return (NULL);
diff --git a/networking/ip.c b/networking/ip.c
index fe5714f..6363155 100644
--- a/networking/ip.c
+++ b/networking/ip.c
@@ -12,20 +12,11 @@
* Rani Assaf <rani@magic.metawire.com> 980929: resolve addresses
*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <fcntl.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <string.h>
+#include "busybox.h"
#include "libiproute/utils.h"
#include "libiproute/ip_common.h"
-#include "busybox.h"
-
int ip_main(int argc, char **argv)
{
int ret = EXIT_FAILURE;
@@ -57,5 +48,5 @@ int ip_main(int argc, char **argv)
if (ret) {
bb_show_usage();
}
- return(EXIT_SUCCESS);
+ return EXIT_SUCCESS;
}
diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c
index fdbe611..fc6cf7b 100644
--- a/networking/libiproute/ipaddress.c
+++ b/networking/libiproute/ipaddress.c
@@ -441,7 +441,7 @@ int ipaddr_list_or_flush(int argc, char **argv, int flush)
}
while (argc > 0) {
- const int option_num = compare_string_array(option, *argv);
+ const int option_num = index_in_str_array(option, *argv);
switch (option_num) {
case 0: /* to */
NEXT_ARG();
@@ -653,7 +653,7 @@ static int ipaddr_modify(int cmd, int argc, char **argv)
req.ifa.ifa_family = preferred_family;
while (argc > 0) {
- const int option_num = compare_string_array(option, *argv);
+ const int option_num = index_in_str_array(option, *argv);
switch (option_num) {
case 0: /* peer */
case 1: /* remote */
@@ -800,25 +800,24 @@ static int ipaddr_modify(int cmd, int argc, char **argv)
int do_ipaddr(int argc, char **argv)
{
static const char *const commands[] = {
- "add", "del", "delete", "list", "show", "lst", "flush", 0
+ "add", "delete", "list", "show", "lst", "flush", 0
};
int command_num = 2;
if (*argv) {
- command_num = compare_string_array(commands, *argv);
+ command_num = index_in_substr_array(commands, *argv);
}
switch (command_num) {
case 0: /* add */
return ipaddr_modify(RTM_NEWADDR, argc-1, argv+1);
- case 1: /* del */
- case 2: /* delete */
+ case 1: /* delete */
return ipaddr_modify(RTM_DELADDR, argc-1, argv+1);
- case 3: /* list */
- case 4: /* show */
- case 5: /* lst */
+ case 2: /* list */
+ case 3: /* show */
+ case 4: /* lst */
return ipaddr_list_or_flush(argc-1, argv+1, 0);
- case 6: /* flush */
+ case 5: /* flush */
return ipaddr_list_or_flush(argc-1, argv+1, 1);
}
bb_error_msg_and_die("unknown command %s", *argv);
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
index 3b2a677..9c3b870 100644
--- a/networking/libiproute/iproute.c
+++ b/networking/libiproute/iproute.c
@@ -670,7 +670,7 @@ static int iproute_get(int argc, char **argv)
req.r.rtm_tos = 0;
while (argc > 0) {
- switch (compare_string_array(options, *argv)) {
+ switch (index_in_str_array(options, *argv)) {
case 0: /* from */
{
inet_prefix addr;
@@ -811,14 +811,16 @@ static int iproute_get(int argc, char **argv)
int do_iproute(int argc, char **argv)
{
static const char * const ip_route_commands[] =
- { "add", "append", "change", "chg", "delete", "del", "get",
+ { "add", "append", "change", "chg", "delete", "get",
"list", "show", "prepend", "replace", "test", "flush", 0 };
- int command_num = 7;
+ int command_num = 6;
unsigned int flags = 0;
int cmd = RTM_NEWROUTE;
+ /* "Standard" 'ip r a' treats 'a' as 'add', not 'append' */
+ /* It probably means that it is using "first match" rule */
if (*argv) {
- command_num = compare_string_array(ip_route_commands, *argv);
+ command_num = index_in_substr_array(ip_route_commands, *argv);
}
switch (command_num) {
case 0: /* add*/
diff --git a/networking/libiproute/utils.c b/networking/libiproute/utils.c
index 552f4bf..f92179c 100644
--- a/networking/libiproute/utils.c
+++ b/networking/libiproute/utils.c
@@ -263,10 +263,7 @@ int matches(char *cmd, char *pattern)
{
int len = strlen(cmd);
- if (len > strlen(pattern)) {
- return -1;
- }
- return memcmp(pattern, cmd, len);
+ return strncmp(pattern, cmd, len);
}
int inet_addr_match(inet_prefix * a, inet_prefix * b, int bits)
diff --git a/util-linux/mount.c b/util-linux/mount.c
index a9464ba..4069416 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -898,7 +898,7 @@ static int nfsmount(struct mntent *mp, int vfsflags, char *filteropts)
};
int val = xatoi_u(opteq + 1);
*opteq = '\0';
- switch (compare_string_array(options, opt)) {
+ switch (index_in_str_array(options, opt)) {
case 0: // "rsize"
data.rsize = val;
break;
@@ -940,7 +940,7 @@ static int nfsmount(struct mntent *mp, int vfsflags, char *filteropts)
break;
case 12: // "mounthost"
mounthost = xstrndup(opteq+1,
- strcspn(opteq+1," \t\n\r,"));
+ strcspn(opteq+1," \t\n\r,"));
break;
case 13: // "mountprog"
mountprog = val;
@@ -996,7 +996,7 @@ static int nfsmount(struct mntent *mp, int vfsflags, char *filteropts)
val = 0;
opt += 2;
}
- switch (compare_string_array(options, opt)) {
+ switch (index_in_str_array(options, opt)) {
case 0: // "bg"
bg = val;
break;