Commit b303ef51 by Douglas B Rupp Committed by Douglas Rupp

pex-unix.c (vfork): Remove VMS specific definition (get from header file instead).


	* pex-unix.c (vfork): Remove VMS specific definition (get from header
	file instead).
	(to_ptr32): New function.
	(pex_unix_exec_child): Use it.

From-SVN: r150130
parent 5823ade1
2009-07-27 Douglas B Rupp <rupp@gnat.com>
* pex-unix.c (vfork): Remove VMS specific definition (get from header
file instead).
(to_ptr32): New function.
(pex_unix_exec_child): Use it.
2009-07-24 Ian Lance Taylor <iant@google.com> 2009-07-24 Ian Lance Taylor <iant@google.com>
PR bootstrap/40854 PR bootstrap/40854
......
/* Utilities to execute a program in a subprocess (possibly linked by pipes /* Utilities to execute a program in a subprocess (possibly linked by pipes
with other subprocesses), and wait for it. Generic Unix version with other subprocesses), and wait for it. Generic Unix version
(also used for UWIN and VMS). (also used for UWIN and VMS).
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2009
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of the libiberty library. This file is part of the libiberty library.
...@@ -65,11 +65,40 @@ extern int errno; ...@@ -65,11 +65,40 @@ extern int errno;
#ifdef HAVE_VFORK_H #ifdef HAVE_VFORK_H
#include <vfork.h> #include <vfork.h>
#endif #endif
#ifdef VMS #if defined(VMS) && defined (__LONG_POINTERS)
#define vfork() (decc$$alloc_vfork_blocks() >= 0 ? \ #ifndef __CHAR_PTR32
lib$get_current_invo_context(decc$$get_vfork_jmpbuf()) : -1) typedef char * __char_ptr32
#endif /* VMS */ __attribute__ ((mode (SI)));
#endif
typedef __char_ptr32 *__char_ptr_char_ptr32
__attribute__ ((mode (SI)));
/* Return a 32 bit pointer to an array of 32 bit pointers
given a 64 bit pointer to an array of 64 bit pointers. */
static __char_ptr_char_ptr32
to_ptr32 (char **ptr64)
{
int argc;
__char_ptr_char_ptr32 short_argv;
for (argc=0; ptr64[argc]; argc++);
/* Reallocate argv with 32 bit pointers. */
short_argv = (__char_ptr_char_ptr32) decc$malloc
(sizeof (__char_ptr32) * (argc + 1));
for (argc=0; ptr64[argc]; argc++)
short_argv[argc] = (__char_ptr32) decc$strdup (ptr64[argc]);
short_argv[argc] = (__char_ptr32) 0;
return short_argv;
}
#else
#define to_ptr32(argv) argv
#endif
/* File mode to use for private and world-readable files. */ /* File mode to use for private and world-readable files. */
...@@ -425,12 +454,12 @@ pex_unix_exec_child (struct pex_obj *obj, int flags, const char *executable, ...@@ -425,12 +454,12 @@ pex_unix_exec_child (struct pex_obj *obj, int flags, const char *executable,
if ((flags & PEX_SEARCH) != 0) if ((flags & PEX_SEARCH) != 0)
{ {
execvp (executable, argv); execvp (executable, to_ptr32 (argv));
pex_child_error (obj, executable, "execvp", errno); pex_child_error (obj, executable, "execvp", errno);
} }
else else
{ {
execv (executable, argv); execv (executable, to_ptr32 (argv));
pex_child_error (obj, executable, "execv", errno); pex_child_error (obj, executable, "execv", errno);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment