On Friday 02 May 2014 15:42:40 you wrote:
> Tito wrote:
> 
> > That's it about PATCH 1.
> > There is still PATCH 2....
> Your patch searches in PATH for dir/file if dir/file is not executable. 
> The normal behavior is to not search PATH if the argument contains a '/'.

Fixed. Thanks!

> If you rewrite "which" anyway, you could also change the following points:
> - Remove default PATH, saves some bytes

It mimics the behavior of debianutils which that being a script
sets PATH (from profile?) in its subshell:

debian:~/Desktop/SourceCode/new_bb/busybox$ cp /usr/bin/which .
debian:~/Desktop/SourceCode/new_bb/busybox$ nano which (add echo $PATH)
debian:~/Desktop/SourceCode/new_bb/busybox$ unset PATH
debian:~/Desktop/SourceCode/new_bb/busybox$ echo $PATH                          
                                                
                                                                                
                                                
debian:~/Desktop/SourceCode/new_bb/busybox$ ./which pippo                       
                                                
PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
debian:~/Desktop/SourceCode/new_bb/busybox$ echo $PATH                          
                                             
                                                                                
                                          
> - Output message if not found (maybe if DESKTOP)

> - Return number of commands not found as per man page (Which returns the 
> number of failed arguments, or -1 when no `programname´ was given)

WHICH(1)                                                                        
            WHICH(1)

NAME
       which - locate a command

SYNOPSIS
       which [-a] filename ...

DESCRIPTION
       which  returns  the  pathnames of the files (or links) which would be 
executed in the current
       environment, had its arguments been given as commands in a strictly  
POSIX-conformant  shell.
       It  does this by searching the PATH for executable files matching the 
names of the arguments.
       It does not follow symbolic links.

OPTIONS
       -a     print all matching pathnames of each argument

EXIT STATUS
       0      if all specified commands are found and executable

       1      if one or more specified commands is nonexistent or not executable

       2      if an invalid option is specified

Debian                                       1 May 2009                         
            WHICH(1)

debian:~$ which pippo pluto topolino
debian:~$ echo $?
1

> $ which -v
> GNU which v2.20, Copyright (C) 1999 - 2008 Carlo Wood.
> $ (unset PATH; /usr/bin/which -a sh bash; echo $?)
> /usr/bin/which: no sh in ((null))
> /usr/bin/which: no bash in ((null))
> 2
> 
> 

Attached v2 of which patch and a drop in which.c replacement file for
testing purposes.

Ciao,
Tito
This patch removes the #if ENABLE_DESKTOP part from
which relative to the -a option and unifies the code.

Signed-off by Tito Ragusa <farmat...@tiscali.it>

--- debianutils/which.c.orig	2014-05-02 21:17:22.279114884 +0200
+++ debianutils/which.c	2014-05-02 21:20:53.151575421 +0200
@@ -24,75 +24,39 @@
 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;
+	int found;
 	char *path;
 	char *p;
+	char *tmp;
+	int status = 0;
 
-	opt_complementary = "-1"; /* at least one argument */
-	IF_DESKTOP(opt =) getopt32(argv, "a");
+	opt_complementary = "-1";	/* at least one argument */
+	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 */
+		found = 0;
+		   /* If file contains a slash don't use PATH */
 		if (strchr(*argv, '/')) {
-			if (file_is_executable(*argv)) {
-				puts(*argv);
-				continue;
+			if(file_is_executable(*argv)) {
+				/* returns non-negative number on success, or EOF (-1) on error */
+				found = puts(*argv);
 			}
-			status = EXIT_FAILURE;
 		} else {
-			char *path2 = xstrdup(path);
-			char *tmp = path2;
-
-			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;
-					}
-				}
+			p = getenv("PATH");
+			if (p == NULL) {
+				p =  (char *)bb_default_root_path;
 			}
-			free(path2);
-		}
-#else
-/* Just ignoring -a */
-		if (strchr(*argv, '/')) {
-			if (file_is_executable(*argv)) {
-				puts(*argv);
-				continue;
-			}
-		} else {
-			char *path2 = xstrdup(path);
-			char *tmp = path2;
-			p = find_executable(*argv, &tmp);
-			free(path2);
-			if (p) {
-				puts(p);
+			path = tmp = xstrdup(p);
+			while ((p = find_executable(*argv, &tmp)) != NULL) {
+				found = puts(p);
 				free(p);
-				continue;
+				if (!option_mask32) /* -a not set*/
+					break;
 			}
+			free(path);
 		}
-		status = EXIT_FAILURE;
-#endif
+		status |= (!found);
 	} while (*(++argv) != NULL);
 
 	fflush_stdout_and_exit(status);
/* vi: set sw=4 ts=4: */
/*
 * Which implementation for busybox
 *
 * Copyright (C) 1999-2004 by Erik Andersen <ander...@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
//usage:       "[COMMAND]..."
//usage:#define which_full_usage "\n\n"
//usage:       "Locate a COMMAND"
//usage:
//usage:#define which_example_usage
//usage:       "$ which login\n"
//usage:       "/bin/login\n"

#include "libbb.h"

int which_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int which_main(int argc UNUSED_PARAM, char **argv)
{
	int found;
	char *path;
	char *p;
	char *tmp;
	int status = 0;

	opt_complementary = "-1";	/* at least one argument */
	getopt32(argv, "a");
	argv += optind;
	
	do {
		found = 0;
		   /* If file contains a slash don't use PATH */
		if (strchr(*argv, '/')) {
			if(file_is_executable(*argv)) {
				/* returns non-negative number on success, or EOF (-1) on error */
				found = puts(*argv);
			}
		} else {
			p = getenv("PATH");
			if (p == NULL) {
				p =  (char *)bb_default_root_path;
			}
			path = tmp = xstrdup(p);
			while ((p = find_executable(*argv, &tmp)) != NULL) {
				found = puts(p);
				free(p);
				if (!option_mask32) /* -a not set*/
					break;
			}
			free(path);
		}
		status |= (!found);
	} while (*(++argv) != NULL);

	fflush_stdout_and_exit(status);
}
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to