2 * Copyright (c) 1989 - 1991, Julianne Frances Haugh
3 * Copyright (c) 1996 - 1998, Marek Michałkiewicz
4 * Copyright (c) 2003 - 2006, Tomasz Kłoczko
5 * Copyright (c) 2009 , Nicolas François
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. The name of the copyright holders or contributors may not be used to
17 * endorse or promote products derived from this software without
18 * specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
23 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 #include "prototypes.h"
41 extern char **newenvp;
42 extern size_t newenvc;
45 * shell - execute the named program
47 * shell begins by trying to figure out what argv[0] is going to
48 * be for the named process. The user may pass in that argument,
49 * or it will be the last pathname component of the file with a
51 * Then, it executes the named file.
54 int shell (const char *file, /*@null@*/const char *arg, char *const envp[])
59 if (file == (char *) 0) {
65 * The argv[0]'th entry is usually the path name, but
66 * for various reasons the invoker may want to override
67 * that. So, we determine the 0'th entry only if they
68 * don't want to tell us what it is themselves.
70 if (arg == (char *) 0) {
71 (void) snprintf (arg0, sizeof arg0, "-%s", Basename ((char *) file));
72 arg0[sizeof arg0 - 1] = '\0';
77 * First we try the direct approach. The system should be
78 * able to figure out what we are up to without too much
81 (void) execle (file, arg, (char *) 0, envp);
84 if (access (file, R_OK|X_OK) == 0) {
86 * Assume this is a shell script (with no shebang).
87 * Interpret it with /bin/sh
89 (void) execle (SHELL, "sh", "-", file, (char *)0, envp);
94 * Obviously something is really wrong - I can't figure out
95 * how to execute this stupid shell, so I might as well give
98 (void) snprintf (arg0, sizeof arg0, _("Cannot execute %s"), file);