1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                  David Korn <dgk@research.att.com>                   *
19 *                   Phong Vo <kpv@research.att.com>                    *
20 *                                                                      *
21 ***********************************************************************/
22 #pragma prototyped
23 
24 /*
25  * OBSOLETE 20030321 -- use spawnveg()
26  */
27 
28 #include <ast_lib.h>
29 
30 #if !_lib_spawnve
31 #define spawnve		______spawnve
32 #endif
33 #if !_lib_spawnvpe
34 #define spawnvpe	______spawnvpe
35 #endif
36 #if !_lib_spawnvp
37 #define spawnvp		______spawnvp
38 #endif
39 #if !_lib_spawnlp
40 #define spawnlp		______spawnlp
41 #endif
42 
43 #include <ast.h>
44 #include <error.h>
45 
46 #if !_lib_spawnve
47 #undef	spawnve
48 #endif
49 #if !_lib_spawnvpe
50 #undef	spawnvpe
51 #endif
52 #if !_lib_spawnvp
53 #undef	spawnvp
54 #endif
55 #if !_lib_spawnlp
56 #undef	spawnlp
57 #endif
58 
59 #if defined(__EXPORT__)
60 #define extern	__EXPORT__
61 #endif
62 
63 #if _lib_spawnve
64 
65 NoN(spawnve)
66 
67 #else
68 
69 extern pid_t
70 spawnve(const char* cmd, char* const argv[], char* const envv[])
71 {
72 	return spawnveg(cmd, argv, envv, 0);
73 }
74 
75 #endif
76 
77 #if _lib_spawnvpe
78 
79 NoN(spawnvpe)
80 
81 #else
82 
83 extern pid_t
84 spawnvpe(const char* name, char* const argv[], char* const envv[])
85 {
86 	register const char*	path = name;
87 	pid_t			pid;
88 	char			buffer[PATH_MAX];
89 
90 	if (*path != '/')
91 		path = pathpath(name, NULL, PATH_REGULAR|PATH_EXECUTE, buffer, sizeof(buffer));
92 	if ((pid = spawnve(path, argv, envv)) >= 0)
93 		return pid;
94 	if (errno == ENOEXEC)
95 	{
96 		register char**	newargv;
97 		register char**	ov;
98 		register char**	nv;
99 
100 		for (ov = (char**)argv; *ov++;);
101 		if (newargv = newof(0, char*, ov + 1 - (char**)argv, 0))
102 		{
103 			nv = newargv;
104 			*nv++ = "sh";
105 			*nv++ = (char*)path;
106 			ov = (char**)argv;
107 			while (*nv++ = *++ov);
108 			path = pathshell();
109 			pid = spawnve(path, newargv, environ);
110 			free(newargv);
111 		}
112 		else
113 			errno = ENOMEM;
114 	}
115 	return pid;
116 }
117 
118 #endif
119 
120 #if _lib_spawnvp
121 
122 NoN(spawnvp)
123 
124 #else
125 
126 extern pid_t
127 spawnvp(const char* name, char* const argv[])
128 {
129 	return spawnvpe(name, argv, environ);
130 }
131 
132 #endif
133 
134 #if _lib_spawnlp
135 
136 NoN(spawnlp)
137 
138 #else
139 
140 extern pid_t
141 spawnlp(const char* name, const char* arg, ...)
142 {
143 	va_list	ap;
144 	pid_t	pid;
145 
146 	va_start(ap, arg);
147 	pid = spawnvp(name, (char* const*)&arg);
148 	va_end(ap);
149 	return pid;
150 }
151 
152 #endif
153