diff options
-rw-r--r-- | archival/dpkg.c | 2 | ||||
-rw-r--r-- | e2fsprogs/fsck.c | 4 | ||||
-rw-r--r-- | include/libbb.h | 3 | ||||
-rw-r--r-- | libbb/compare_string_array.c | 24 | ||||
-rw-r--r-- | miscutils/devfsd.c | 8 | ||||
-rw-r--r-- | networking/ip.c | 13 | ||||
-rw-r--r-- | networking/libiproute/ipaddress.c | 19 | ||||
-rw-r--r-- | networking/libiproute/iproute.c | 10 | ||||
-rw-r--r-- | networking/libiproute/utils.c | 5 | ||||
-rw-r--r-- | util-linux/mount.c | 6 |
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; |