summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/exec.cc
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-02-17 19:38:33 +0000
committerChristopher Faylor <me@cgf.cx>2000-02-17 19:38:33 +0000
commit1fd5e000ace55b323124c7e556a7a864b972a5c4 (patch)
treedc4fcf1e5e22a040716ef92c496b8d94959b2baa /winsup/cygwin/exec.cc
parent369d8a8fd5e887eca547bf34bccfdf755c9e5397 (diff)
downloadcygnal-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.gz
cygnal-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.bz2
cygnal-1fd5e000ace55b323124c7e556a7a864b972a5c4.zip
import winsup-2000-02-17 snapshot
Diffstat (limited to 'winsup/cygwin/exec.cc')
-rw-r--r--winsup/cygwin/exec.cc204
1 files changed, 204 insertions, 0 deletions
diff --git a/winsup/cygwin/exec.cc b/winsup/cygwin/exec.cc
new file mode 100644
index 000000000..54d2c9577
--- /dev/null
+++ b/winsup/cygwin/exec.cc
@@ -0,0 +1,204 @@
+/* exec.cc: exec system call support.
+
+ Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <ctype.h>
+#include <process.h>
+#include "winsup.h"
+
+/* This is called _execve and not execve because the real execve is defined
+ in libc/posix/execve.c. It calls us. */
+
+extern "C"
+pid_t
+_execve (const char *path, const char *const argv[], const char *const envp[])
+{
+ static char *const empty_env[] = { 0 };
+ MALLOC_CHECK;
+ if (!envp)
+ envp = empty_env;
+ return _spawnve (NULL, _P_OVERLAY, path, argv, envp);
+}
+
+extern "C"
+int
+execl (const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+ va_end (args);
+ MALLOC_CHECK;
+ return _execve (path, (char * const *) argv, *user_data->envptr);
+}
+
+extern "C"
+int
+execv (const char *path, char * const *argv)
+{
+ MALLOC_CHECK;
+ return _execve (path, (char * const *) argv, *user_data->envptr);
+}
+
+/* the same as a standard exec() calls family, but with NT security support */
+
+extern "C"
+pid_t
+sexecve (HANDLE hToken, const char *path, const char *const argv[],
+ const char *const envp[])
+{
+ _spawnve (hToken, _P_OVERLAY, path, argv, envp);
+ return -1;
+}
+
+extern "C"
+int
+sexecl (HANDLE hToken, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ va_end (args);
+
+ MALLOC_CHECK;
+ return sexecve (hToken, path, (char * const *) argv, *user_data->envptr);
+}
+
+extern "C"
+int
+sexecle (HANDLE hToken, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char * const *envp;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ envp = va_arg (args, const char * const *);
+ va_end (args);
+
+ MALLOC_CHECK;
+ return sexecve(hToken, path, (char * const *) argv, (char * const *) envp);
+}
+
+extern "C"
+int
+sexeclp (HANDLE hToken, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ va_end (args);
+
+ MALLOC_CHECK;
+ return sexecvpe (hToken, path, (const char * const *) argv,
+ *user_data->envptr);
+}
+
+extern "C"
+int
+sexeclpe (HANDLE hToken, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char * const *envp;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ envp = va_arg (args, const char * const *);
+ va_end (args);
+
+ MALLOC_CHECK;
+ return sexecvpe (hToken, path, argv, envp);
+}
+
+extern "C"
+int
+sexecv (HANDLE hToken, const char *path, const char * const *argv)
+{
+ MALLOC_CHECK;
+ return sexecve (hToken, path, argv, *user_data->envptr);
+}
+
+extern "C"
+int
+sexecp (HANDLE hToken, const char *path, const char * const *argv)
+{
+ MALLOC_CHECK;
+ return sexecvpe (hToken, path, argv, *user_data->envptr);
+}
+
+/*
+ * Copy string, until c or <nul> is encountered.
+ * NUL-terminate the destination string (s1).
+ * Return pointer to terminating byte in dst string.
+ */
+
+char * __stdcall
+strccpy (char *s1, const char **s2, char c)
+{
+ while (**s2 && **s2 != c)
+ *s1++ = *((*s2)++);
+ *s1 = 0;
+
+ MALLOC_CHECK;
+ return s1;
+}
+
+extern "C"
+int
+sexecvpe (HANDLE hToken, const char *file, const char * const *argv,
+ const char *const *envp)
+{
+ char buf[MAXNAMLEN];
+ MALLOC_CHECK;
+ return sexecve (hToken, find_exec (file, buf), argv, envp);
+}