OSDN Git Service

* winsup.h: Eliminate inclusion of most of the cygwin .h files. Use .h files
[pf3gnuchains/sourceware.git] / winsup / cygwin / exec.cc
1 /* exec.cc: exec system call support.
2
3    Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
4
5 This file is part of Cygwin.
6
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
9 details. */
10
11 #include "winsup.h"
12 #include <unistd.h>
13 #include <stdlib.h>
14 #include <errno.h>
15 #include <process.h>
16 #include "fhandler.h"
17 #include "path.h"
18
19 /* This is called _execve and not execve because the real execve is defined
20    in libc/posix/execve.c.  It calls us.  */
21
22 extern "C"
23 pid_t
24 _execve (const char *path, const char *const argv[], const char *const envp[])
25 {
26   static char *const empty_env[] = { 0 };
27   MALLOC_CHECK;
28   if (!envp)
29     envp = empty_env;
30   return _spawnve (NULL, _P_OVERLAY, path, argv, envp);
31 }
32
33 extern "C"
34 int
35 execl (const char *path, const char *arg0, ...)
36 {
37   int i;
38   va_list args;
39   const char *argv[1024];
40
41   va_start (args, arg0);
42   argv[0] = arg0;
43   i = 1;
44   do
45       argv[i] = va_arg (args, const char *);
46   while (argv[i++] != NULL);
47   va_end (args);
48   MALLOC_CHECK;
49   return _execve (path, (char * const  *) argv, cur_environ ());
50 }
51
52 extern "C"
53 int
54 execv (const char *path, char * const *argv)
55 {
56   MALLOC_CHECK;
57   return _execve (path, (char * const *) argv, cur_environ ());
58 }
59
60 /* the same as a standard exec() calls family, but with NT security support */
61
62 extern "C"
63 pid_t
64 sexecve (HANDLE hToken, const char *path, const char *const argv[],
65          const char *const envp[])
66 {
67   _spawnve (hToken, _P_OVERLAY, path, argv, envp);
68   return -1;
69 }
70
71 extern "C"
72 int
73 sexecl (HANDLE hToken, const char *path, const char *arg0, ...)
74 {
75   int i;
76   va_list args;
77   const char *argv[1024];
78
79   va_start (args, arg0);
80   argv[0] = arg0;
81   i = 1;
82
83   do
84       argv[i] = va_arg (args, const char *);
85   while (argv[i++] != NULL);
86
87   va_end (args);
88
89   MALLOC_CHECK;
90   return sexecve (hToken, path, (char * const *) argv, cur_environ ());
91 }
92
93 extern "C"
94 int
95 sexecle (HANDLE hToken, const char *path, const char *arg0, ...)
96 {
97   int i;
98   va_list args;
99   const char * const *envp;
100   const char *argv[1024];
101
102   va_start (args, arg0);
103   argv[0] = arg0;
104   i = 1;
105
106   do
107     argv[i] = va_arg (args, const char *);
108   while (argv[i++] != NULL);
109
110   envp = va_arg (args, const char * const *);
111   va_end (args);
112
113   MALLOC_CHECK;
114   return sexecve(hToken, path, (char * const *) argv, (char * const *) envp);
115 }
116
117 extern "C"
118 int
119 sexeclp (HANDLE hToken, const char *path, const char *arg0, ...)
120 {
121   int i;
122   va_list args;
123   const char *argv[1024];
124
125   va_start (args, arg0);
126   argv[0] = arg0;
127   i = 1;
128
129   do
130       argv[i] = va_arg (args, const char *);
131   while (argv[i++] != NULL);
132
133   va_end (args);
134
135   MALLOC_CHECK;
136   return sexecvpe (hToken, path, (const char * const *) argv, cur_environ ());
137 }
138
139 extern "C"
140 int
141 sexeclpe (HANDLE hToken, const char *path, const char *arg0, ...)
142 {
143   int i;
144   va_list args;
145   const char * const *envp;
146   const char *argv[1024];
147
148   va_start (args, arg0);
149   argv[0] = arg0;
150   i = 1;
151
152   do
153     argv[i] = va_arg (args, const char *);
154   while (argv[i++] != NULL);
155
156   envp = va_arg (args, const char * const *);
157   va_end (args);
158
159   MALLOC_CHECK;
160   return sexecvpe (hToken, path, argv, envp);
161 }
162
163 extern "C"
164 int
165 sexecv (HANDLE hToken, const char *path, const char * const *argv)
166 {
167   MALLOC_CHECK;
168   return sexecve (hToken, path, argv, cur_environ ());
169 }
170
171 extern "C"
172 int
173 sexecp (HANDLE hToken, const char *path, const char * const *argv)
174 {
175   MALLOC_CHECK;
176   return sexecvpe (hToken, path, argv, cur_environ ());
177 }
178
179 /*
180  * Copy string, until c or <nul> is encountered.
181  * NUL-terminate the destination string (s1).
182  * Return pointer to terminating byte in dst string.
183  */
184
185 char * __stdcall
186 strccpy (char *s1, const char **s2, char c)
187 {
188   while (**s2 && **s2 != c)
189     *s1++ = *((*s2)++);
190   *s1 = 0;
191
192   MALLOC_CHECK;
193   return s1;
194 }
195
196 extern "C"
197 int
198 sexecvpe (HANDLE hToken, const char *file, const char * const *argv,
199           const char *const *envp)
200 {
201   path_conv buf;
202   MALLOC_CHECK;
203   return sexecve (hToken, find_exec (file, buf), argv, envp);
204 }