[git commit] which: rewrite

Denys Vlasenko vda.linux at googlemail.com
Sat May 3 14:34:36 UTC 2014


commit: http://git.busybox.net/busybox/commit/?id=1e3cce681426cffe6d30efed2a1f6cf1f3277e00
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
which_main                                           237     212     -25

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 debianutils/which.c |   83 ++++++++++++++------------------------------------
 1 files changed, 23 insertions(+), 60 deletions(-)

diff --git a/debianutils/which.c b/debianutils/which.c
index 760bcdc..d50e7a0 100644
--- a/debianutils/which.c
+++ b/debianutils/which.c
@@ -1,13 +1,9 @@
 /* vi: set sw=4 ts=4: */
 /*
- * Which implementation for busybox
- *
  * Copyright (C) 1999-2004 by Erik Andersen <andersen at codepoet.org>
  * Copyright (C) 2006 Gabriel Somlo <somlo at cmu.edu>
  *
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
- *
- * Based on which from debianutils
  */
 
 //usage:#define which_trivial_usage
@@ -24,76 +20,43 @@
 int which_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int which_main(int argc UNUSED_PARAM, char **argv)
 {
-	IF_DESKTOP(int opt;)
-	int status = EXIT_SUCCESS;
-	char *path;
-	char *p;
+	const char *env_path;
+	int status = 0;
+
+	env_path = getenv("PATH");
+	if (!env_path)
+		env_path = bb_default_root_path;
 
 	opt_complementary = "-1"; /* at least one argument */
-	IF_DESKTOP(opt =) getopt32(argv, "a");
+	getopt32(argv, "a");
 	argv += optind;
 
-	/* This matches what is seen on e.g. ubuntu.
-	 * "which" there is a shell script. */
-	path = getenv("PATH");
-	if (!path) {
-		path = (char*)bb_PATH_root_path;
-		putenv(path);
-		path += 5; /* skip "PATH=" */
-	}
-
 	do {
-#if ENABLE_DESKTOP
-/* Much bloat just to support -a */
-		if (strchr(*argv, '/')) {
-			if (file_is_executable(*argv)) {
-				puts(*argv);
-				continue;
-			}
-			status = EXIT_FAILURE;
-		} else {
-			char *path2 = xstrdup(path);
-			char *tmp = path2;
+		int missing = 1;
 
-			p = find_executable(*argv, &tmp);
-			if (!p)
-				status = EXIT_FAILURE;
-			else {
- print:
-				puts(p);
-				free(p);
-				if (opt) {
-					/* -a: show matches in all PATH components */
-					if (tmp) {
-						p = find_executable(*argv, &tmp);
-						if (p)
-							goto print;
-					}
-				}
-			}
-			free(path2);
-		}
-#else
-/* Just ignoring -a */
+		/* If file contains a slash don't use PATH */
 		if (strchr(*argv, '/')) {
 			if (file_is_executable(*argv)) {
+				missing = 0;
 				puts(*argv);
-				continue;
 			}
 		} else {
-			char *path2 = xstrdup(path);
-			char *tmp = path2;
-			p = find_executable(*argv, &tmp);
-			free(path2);
-			if (p) {
+			char *path;
+			char *tmp;
+			char *p;
+
+			path = tmp = xstrdup(env_path);
+			while ((p = find_executable(*argv, &tmp)) != NULL) {
+				missing = 0;
 				puts(p);
 				free(p);
-				continue;
+				if (!option_mask32) /* -a not set */
+					break;
 			}
+			free(path);
 		}
-		status = EXIT_FAILURE;
-#endif
-	} while (*(++argv) != NULL);
+		status |= missing;
+	} while (*++argv);
 
-	fflush_stdout_and_exit(status);
+	return status;
 }


More information about the busybox-cvs mailing list