function old new delta packed_usage 33570 33502 -68 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* vi: set sw=4 ts=4: */
 | 
						|
/*
 | 
						|
 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
 | 
						|
 * Copyright (C) 2006 Gabriel Somlo <somlo at cmu.edu>
 | 
						|
 *
 | 
						|
 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
 | 
						|
 */
 | 
						|
//config:config WHICH
 | 
						|
//config:	bool "which (3.8 kb)"
 | 
						|
//config:	default y
 | 
						|
//config:	help
 | 
						|
//config:	which is used to find programs in your PATH and
 | 
						|
//config:	print out their pathnames.
 | 
						|
 | 
						|
//applet:IF_WHICH(APPLET_NOFORK(which, which, BB_DIR_USR_BIN, BB_SUID_DROP, which))
 | 
						|
 | 
						|
//kbuild:lib-$(CONFIG_WHICH) += which.o
 | 
						|
 | 
						|
//usage:#define which_trivial_usage
 | 
						|
//usage:       "COMMAND..."
 | 
						|
//usage:#define which_full_usage "\n\n"
 | 
						|
//usage:       "Locate 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)
 | 
						|
{
 | 
						|
	char *env_path;
 | 
						|
	int status = 0;
 | 
						|
	/* This sizeof(): bb_default_root_path is shorter than BB_PATH_ROOT_PATH */
 | 
						|
	char buf[sizeof(BB_PATH_ROOT_PATH)];
 | 
						|
 | 
						|
	env_path = getenv("PATH");
 | 
						|
	if (!env_path)
 | 
						|
		/* env_path must be writable, and must not alloc, so... */
 | 
						|
		env_path = strcpy(buf, bb_default_root_path);
 | 
						|
 | 
						|
	getopt32(argv, "^" "a" "\0" "-1"/*at least one arg*/);
 | 
						|
	argv += optind;
 | 
						|
 | 
						|
	do {
 | 
						|
		int missing = 1;
 | 
						|
 | 
						|
		/* If file contains a slash don't use PATH */
 | 
						|
		if (strchr(*argv, '/')) {
 | 
						|
			if (file_is_executable(*argv)) {
 | 
						|
				missing = 0;
 | 
						|
				puts(*argv);
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			char *path;
 | 
						|
			char *p;
 | 
						|
 | 
						|
			path = env_path;
 | 
						|
			/* NOFORK NB: xmalloc inside find_executable(), must have no allocs above! */
 | 
						|
			while ((p = find_executable(*argv, &path)) != NULL) {
 | 
						|
				missing = 0;
 | 
						|
				puts(p);
 | 
						|
				free(p);
 | 
						|
				if (!option_mask32) /* -a not set */
 | 
						|
					break;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		status |= missing;
 | 
						|
	} while (*++argv);
 | 
						|
 | 
						|
	return status;
 | 
						|
}
 |