2 * Copyright (c) 1989 - 1991, Julianne Frances Haugh
3 * Copyright (c) 1996 - 1998, Marek Michałkiewicz
4 * Copyright (c) 2003 - 2006, Tomasz Kłoczko
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the copyright holders or contributors may not be used to
16 * endorse or promote products derived from this software without
17 * specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include "prototypes.h"
40 extern char **newenvp;
41 extern size_t newenvc;
44 * shell - execute the named program
46 * shell begins by trying to figure out what argv[0] is going to
47 * be for the named process. The user may pass in that argument,
48 * or it will be the last pathname component of the file with a
49 * '-' prepended. The first attempt is to just execute the named
50 * file. If the errno comes back "ENOEXEC", the file is assumed
51 * at first glance to be a shell script. The first two characters
52 * must be "#!", in which case "/bin/sh" is executed to process
53 * the file. If all that fails, give up in disgust ...
56 int shell (const char *file, const char *arg, char *const envp[])
61 if (file == (char *) 0) {
67 * The argv[0]'th entry is usually the path name, but
68 * for various reasons the invoker may want to override
69 * that. So, we determine the 0'th entry only if they
70 * don't want to tell us what it is themselves.
72 if (arg == (char *) 0) {
73 snprintf (arg0, sizeof arg0, "-%s", Basename ((char *) file));
78 * First we try the direct approach. The system should be
79 * able to figure out what we are up to without too much
82 execle (file, arg, (char *) 0, envp);
85 /* Linux handles #! in the kernel, and bash doesn't make
86 sense of "#!" so it wouldn't work anyway... --marekm */
89 * It is perfectly OK to have a shell script for a login
90 * shell, and this code attempts to support that. It
91 * relies on the standard shell being able to make sense
92 * of the "#!" magic number.
97 if ((fp = fopen (file, "r"))) {
98 if (getc (fp) == '#' && getc (fp) == '!') {
100 execle ("/bin/sh", "sh",
101 file, (char *) 0, envp);
111 * Obviously something is really wrong - I can't figure out
112 * how to execute this stupid shell, so I might as well give
115 snprintf (arg0, sizeof arg0, _("Cannot execute %s"), file);