tls: prepare for ECDH_anon ciphers
[oweals/busybox.git] / libbb / executable.c
index 05e70312f00b82687447fb784b680f3e5013f65d..29d2a2c8547163a59e9ac75bb338a00996aa26ca 100644 (file)
@@ -6,7 +6,6 @@
  *
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
-
 #include "libbb.h"
 
 /* check if path points to an executable file;
@@ -26,7 +25,8 @@ int FAST_FUNC file_is_executable(const char *name)
  *  you may call find_executable again with this PATHp to continue
  *  (if it's not NULL).
  * return NULL otherwise; (PATHp is undefined)
- * in all cases (*PATHp) contents will be trashed (s/:/NUL/).
+ * in all cases (*PATHp) contents are temporarily modified
+ * but are restored on return (s/:/NUL/ and back).
  */
 char* FAST_FUNC find_executable(const char *filename, char **PATHp)
 {
@@ -42,14 +42,17 @@ char* FAST_FUNC find_executable(const char *filename, char **PATHp)
 
        p = *PATHp;
        while (p) {
+               int ex;
+
                n = strchr(p, ':');
-               if (n)
-                       *n++ = '\0';
+               if (n) *n = '\0';
                p = concat_path_file(
                        p[0] ? p : ".", /* handle "::" case */
                        filename
                );
-               if (file_is_executable(p)) {
+               ex = file_is_executable(p);
+               if (n) *n++ = ':';
+               if (ex) {
                        *PATHp = n;
                        return p;
                }
@@ -65,10 +68,8 @@ char* FAST_FUNC find_executable(const char *filename, char **PATHp)
  */
 int FAST_FUNC executable_exists(const char *filename)
 {
-       char *path = xstrdup(getenv("PATH"));
-       char *tmp = path;
-       char *ret = find_executable(filename, &tmp);
-       free(path);
+       char *path = getenv("PATH");
+       char *ret = find_executable(filename, &path);
        free(ret);
        return ret != NULL;
 }
@@ -97,5 +98,5 @@ void FAST_FUNC exec_prog_or_SHELL(char **argv)
        if (argv[0]) {
                BB_EXECVP_or_die(argv);
        }
-       run_shell(getenv("SHELL"), /*login:*/ 1, NULL, NULL);
+       run_shell(getenv("SHELL"), /*login:*/ 1, NULL);
 }