diff options
| author | Ron Yorston <rmy@pobox.com> | 2018-12-06 15:16:49 +0000 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2018-12-06 15:16:49 +0000 |
| commit | 9906faf2dff6fd9033cb711619528501cae11721 (patch) | |
| tree | a85bb3ee78f5d58378f23842e0e762e879db23bc /shell | |
| parent | d257c7f2b6c44662c793d00d0b9286d6246b84a3 (diff) | |
| download | busybox-w32-9906faf2dff6fd9033cb711619528501cae11721.tar.gz busybox-w32-9906faf2dff6fd9033cb711619528501cae11721.tar.bz2 busybox-w32-9906faf2dff6fd9033cb711619528501cae11721.zip | |
win32: rework adding of extensions to filenames
Previously there was one function to handle adding extensions to
executable filenames, add_win32_extension(). Refactor this into
three functions:
add_win32_extension() appends the suffix to the argument string
in-place. The argument must be long enough to cope with this,
as is the case in ash where path_advance() adds 4 bytes to each
filename for just this reason.
alloc_win32_extension() is equivalent to the old add_win32_extension().
It allocates a string to hold the new filename then calls the new
add_win32_extension() function. The caller is responsible for
managing the returned string.
auto_win32_extension() calls alloc_win32_extension() and saves the
resulting string using auto_string(). It's used where the new
filename is consumed immediately or the actual value isn't needed.
Rewrite code to use the most appropriate function. Also reorder
some code in find_executable() and find_command().
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 60 |
1 files changed, 8 insertions, 52 deletions
diff --git a/shell/ash.c b/shell/ash.c index cbe30a78b..587cf2abb 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -8405,7 +8405,7 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) const char *cmd, char **argv, c | |||
| 8405 | 8405 | ||
| 8406 | #if ENABLE_PLATFORM_MINGW32 | 8406 | #if ENABLE_PLATFORM_MINGW32 |
| 8407 | { | 8407 | { |
| 8408 | char *new_cmd = add_win32_extension(cmd); | 8408 | char *new_cmd = alloc_win32_extension(cmd); |
| 8409 | execve(new_cmd ? new_cmd : cmd, argv, envp); | 8409 | execve(new_cmd ? new_cmd : cmd, argv, envp); |
| 8410 | free(new_cmd); | 8410 | free(new_cmd); |
| 8411 | } | 8411 | } |
| @@ -8516,9 +8516,6 @@ printentry(struct tblentry *cmdp) | |||
| 8516 | int idx; | 8516 | int idx; |
| 8517 | const char *path; | 8517 | const char *path; |
| 8518 | char *name; | 8518 | char *name; |
| 8519 | #if ENABLE_PLATFORM_MINGW32 | ||
| 8520 | char *n; | ||
| 8521 | #endif | ||
| 8522 | 8519 | ||
| 8523 | idx = cmdp->param.index; | 8520 | idx = cmdp->param.index; |
| 8524 | path = pathval(); | 8521 | path = pathval(); |
| @@ -8527,13 +8524,9 @@ printentry(struct tblentry *cmdp) | |||
| 8527 | stunalloc(name); | 8524 | stunalloc(name); |
| 8528 | } while (--idx >= 0); | 8525 | } while (--idx >= 0); |
| 8529 | #if ENABLE_PLATFORM_MINGW32 | 8526 | #if ENABLE_PLATFORM_MINGW32 |
| 8530 | if ((n=add_win32_extension(name)) != NULL) | 8527 | add_win32_extension(name); |
| 8531 | name = n; | ||
| 8532 | #endif | 8528 | #endif |
| 8533 | out1fmt("%s%s\n", name, (cmdp->rehash ? "*" : nullstr)); | 8529 | out1fmt("%s%s\n", name, (cmdp->rehash ? "*" : nullstr)); |
| 8534 | #if ENABLE_PLATFORM_MINGW32 | ||
| 8535 | free(n); | ||
| 8536 | #endif | ||
| 8537 | } | 8530 | } |
| 8538 | 8531 | ||
| 8539 | /* | 8532 | /* |
| @@ -8921,9 +8914,6 @@ describe_command(char *command, const char *path, int describe_command_verbose) | |||
| 8921 | case CMDNORMAL: { | 8914 | case CMDNORMAL: { |
| 8922 | int j = entry.u.index; | 8915 | int j = entry.u.index; |
| 8923 | char *p; | 8916 | char *p; |
| 8924 | #if ENABLE_PLATFORM_MINGW32 | ||
| 8925 | char *q; | ||
| 8926 | #endif | ||
| 8927 | if (j < 0) { | 8917 | if (j < 0) { |
| 8928 | p = command; | 8918 | p = command; |
| 8929 | } else { | 8919 | } else { |
| @@ -8933,17 +8923,13 @@ describe_command(char *command, const char *path, int describe_command_verbose) | |||
| 8933 | } while (--j >= 0); | 8923 | } while (--j >= 0); |
| 8934 | } | 8924 | } |
| 8935 | #if ENABLE_PLATFORM_MINGW32 | 8925 | #if ENABLE_PLATFORM_MINGW32 |
| 8936 | if ((q=add_win32_extension(p)) != NULL) | 8926 | add_win32_extension(p); |
| 8937 | p = q; | ||
| 8938 | #endif | 8927 | #endif |
| 8939 | if (describe_command_verbose) { | 8928 | if (describe_command_verbose) { |
| 8940 | out1fmt(" is %s", p); | 8929 | out1fmt(" is %s", p); |
| 8941 | } else { | 8930 | } else { |
| 8942 | out1str(p); | 8931 | out1str(p); |
| 8943 | } | 8932 | } |
| 8944 | #if ENABLE_PLATFORM_MINGW32 | ||
| 8945 | free(q); | ||
| 8946 | #endif | ||
| 8947 | break; | 8933 | break; |
| 8948 | } | 8934 | } |
| 8949 | 8935 | ||
| @@ -13826,36 +13812,28 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path) | |||
| 13826 | struct tblentry *cmdp; | 13812 | struct tblentry *cmdp; |
| 13827 | int idx; | 13813 | int idx; |
| 13828 | int prev; | 13814 | int prev; |
| 13829 | char *fullname IF_PLATFORM_MINGW32(= NULL); | 13815 | char *fullname; |
| 13830 | struct stat statb; | 13816 | struct stat statb; |
| 13831 | int e; | 13817 | int e; |
| 13832 | int updatetbl; | 13818 | int updatetbl; |
| 13833 | struct builtincmd *bcmd; | 13819 | struct builtincmd *bcmd; |
| 13834 | #if ENABLE_PLATFORM_MINGW32 | ||
| 13835 | extern const char win_suffix[4][4]; | ||
| 13836 | int i, len; | ||
| 13837 | #endif | ||
| 13838 | 13820 | ||
| 13839 | /* If name contains a slash, don't use PATH or hash table */ | 13821 | /* If name contains a slash, don't use PATH or hash table */ |
| 13840 | if (strchr(name, '/') || (ENABLE_PLATFORM_MINGW32 && strchr(name, '\\'))) { | 13822 | if (strchr(name, '/') || (ENABLE_PLATFORM_MINGW32 && strchr(name, '\\'))) { |
| 13841 | entry->u.index = -1; | 13823 | entry->u.index = -1; |
| 13842 | if (act & DO_ABS) { | 13824 | if (act & DO_ABS) { |
| 13843 | #if ENABLE_PLATFORM_MINGW32 | 13825 | #if ENABLE_PLATFORM_MINGW32 |
| 13844 | while ((fullname=add_win32_extension(name)) == NULL && | 13826 | if (auto_win32_extension(name) == NULL && stat(name, &statb) < 0) { |
| 13845 | stat(name, &statb) < 0 ) { | ||
| 13846 | #else | 13827 | #else |
| 13847 | while (stat(name, &statb) < 0) { | 13828 | while (stat(name, &statb) < 0) { |
| 13848 | #endif | ||
| 13849 | #ifdef SYSV | 13829 | #ifdef SYSV |
| 13850 | if (errno == EINTR) | 13830 | if (errno == EINTR) |
| 13851 | continue; | 13831 | continue; |
| 13852 | #endif | 13832 | #endif |
| 13833 | #endif | ||
| 13853 | entry->cmdtype = CMDUNKNOWN; | 13834 | entry->cmdtype = CMDUNKNOWN; |
| 13854 | return; | 13835 | return; |
| 13855 | } | 13836 | } |
| 13856 | #if ENABLE_PLATFORM_MINGW32 | ||
| 13857 | free(fullname); | ||
| 13858 | #endif | ||
| 13859 | } | 13837 | } |
| 13860 | entry->cmdtype = CMDNORMAL; | 13838 | entry->cmdtype = CMDNORMAL; |
| 13861 | return; | 13839 | return; |
| @@ -13959,29 +13937,8 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path) | |||
| 13959 | goto success; | 13937 | goto success; |
| 13960 | } | 13938 | } |
| 13961 | #if ENABLE_PLATFORM_MINGW32 | 13939 | #if ENABLE_PLATFORM_MINGW32 |
| 13962 | /* first try appending suffixes (unless there's one already) */ | 13940 | add_win32_extension(fullname); |
| 13963 | i = 4; | 13941 | #endif |
| 13964 | len = strlen(fullname); | ||
| 13965 | if (!has_exe_suffix_or_dot(fullname)) { | ||
| 13966 | /* path_advance() has reserved space for suffix */ | ||
| 13967 | fullname[len] = '.'; | ||
| 13968 | for (i=0; i<4; ++i) { | ||
| 13969 | memcpy(fullname+len+1, win_suffix[i], 4); | ||
| 13970 | if (stat(fullname, &statb) == 0) | ||
| 13971 | break; | ||
| 13972 | } | ||
| 13973 | } | ||
| 13974 | |||
| 13975 | if (i == 4) { | ||
| 13976 | /* adding a suffix failed (or wasn't tried), try original */ | ||
| 13977 | fullname[len] = '\0'; | ||
| 13978 | if (stat(fullname, &statb) < 0) { | ||
| 13979 | if (errno != ENOENT && errno != ENOTDIR) | ||
| 13980 | e = errno; | ||
| 13981 | goto loop; | ||
| 13982 | } | ||
| 13983 | } | ||
| 13984 | #else | ||
| 13985 | while (stat(fullname, &statb) < 0) { | 13942 | while (stat(fullname, &statb) < 0) { |
| 13986 | #ifdef SYSV | 13943 | #ifdef SYSV |
| 13987 | if (errno == EINTR) | 13944 | if (errno == EINTR) |
| @@ -13991,7 +13948,6 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path) | |||
| 13991 | e = errno; | 13948 | e = errno; |
| 13992 | goto loop; | 13949 | goto loop; |
| 13993 | } | 13950 | } |
| 13994 | #endif | ||
| 13995 | e = EACCES; /* if we fail, this will be the error */ | 13951 | e = EACCES; /* if we fail, this will be the error */ |
| 13996 | if (!S_ISREG(statb.st_mode)) | 13952 | if (!S_ISREG(statb.st_mode)) |
| 13997 | continue; | 13953 | continue; |
