OSDN Git Service

* exceptions.cc (_cygtls::call_signal_handler): Fix debugging to not go to
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / exec.cc
1 /* exec.cc: exec system call support.
2
3    Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2009, 2011 Red Hat, Inc.
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 <process.h>
13 #include "cygerrno.h"
14 #include "path.h"
15 #include "environ.h"
16 #include "sync.h"
17 #include "fhandler.h"
18 #include "dtable.h"
19 #include "pinfo.h"
20 #include "cygheap.h"
21 #include "winf.h"
22
23 extern "C" int
24 execl (const char *path, const char *arg0, ...)
25 {
26   int i;
27   va_list args;
28   const char *argv[1024];
29
30   va_start (args, arg0);
31   argv[0] = arg0;
32   i = 1;
33   do
34       argv[i] = va_arg (args, const char *);
35   while (argv[i++] != NULL);
36   va_end (args);
37   MALLOC_CHECK;
38   return spawnve (_P_OVERLAY, path, (char * const  *) argv, cur_environ ());
39 }
40
41 extern "C" int
42 execle (const char *path, const char *arg0, ...)
43 {
44   int i;
45   va_list args;
46   const char *argv[1024];
47   const char * const *envp;
48
49   va_start (args, arg0);
50   argv[0] = arg0;
51   i = 1;
52   do
53       argv[i] = va_arg (args, const char *);
54   while (argv[i++] != NULL);
55   envp = va_arg (args, const char * const *);
56   va_end (args);
57   MALLOC_CHECK;
58   return spawnve (_P_OVERLAY, path, (char * const  *) argv, envp);
59 }
60
61 extern "C" int
62 execlp (const char *file, const char *arg0, ...)
63 {
64   int i;
65   va_list args;
66   const char *argv[1024];
67   path_conv buf;
68
69   va_start (args, arg0);
70   argv[0] = arg0;
71   i = 1;
72   do
73       argv[i] = va_arg (args, const char *);
74   while (argv[i++] != NULL);
75   va_end (args);
76   MALLOC_CHECK;
77   return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
78                   find_exec (file, buf, "PATH=", FE_NNF) ?: "",
79                   (char * const  *) argv, cur_environ ());
80 }
81
82 extern "C" int
83 execv (const char *path, char * const *argv)
84 {
85   MALLOC_CHECK;
86   return spawnve (_P_OVERLAY, path, argv, cur_environ ());
87 }
88
89 extern "C" int
90 execve (const char *path, char *const argv[], char *const envp[])
91 {
92   MALLOC_CHECK;
93   return spawnve (_P_OVERLAY, path, argv, envp);
94 }
95
96 extern "C" int
97 execvp (const char *file, char * const *argv)
98 {
99   path_conv buf;
100
101   MALLOC_CHECK;
102   return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
103                   find_exec (file, buf, "PATH=", FE_NNF) ?: "",
104                   argv, cur_environ ());
105 }
106
107 extern "C" int
108 execvpe (const char *file, char * const *argv, char *const *envp)
109 {
110   path_conv buf;
111
112   MALLOC_CHECK;
113   return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
114                   find_exec (file, buf, "PATH=", FE_NNF) ?: "",
115                   argv, envp);
116 }
117
118 extern "C" int
119 fexecve (int fd, char * const *argv, char *const *envp)
120 {
121   cygheap_fdget cfd (fd);
122   if (cfd < 0)
123     {
124       syscall_printf ("-1 = fexecve (%d, %p, %p)", fd, argv, envp);
125       return -1;
126     }
127
128   MALLOC_CHECK;
129   return spawnve (_P_OVERLAY, cfd->pc.get_win32 (), argv, envp);
130 }
131
132 extern "C" pid_t
133 sexecve_is_bad ()
134 {
135   set_errno (ENOSYS);
136   return 0;
137 }