Commit 77aff459 by Mumit Khan Committed by Jeff Law

Add mingw32 support.

        * pexecute.c (pexecute): New function for mingw32. Supports pipes.
        (pwait): New function for mingw32.
        * config.table (i[3456]86-*-mingw32*): Support for i386-mingw32.
        * config/mt-mingw32: New file.
        * xmalloc.c (first_break): Not used for mingw32.
        (xmalloc_set_program_name): Don't use sbrk on mingw32.
        (xmalloc): Likewise.
        (xrealloc): Likewise.

Co-Authored-By: J.J. VanderHeijden <J.J.vanderHeijden@student.utwente.nl>

From-SVN: r17395
parent 84f79fea
Sat Jan 17 22:32:38 1998 Mumit Khan <khan@xraylith.wisc.edu>
J.J. VanderHeijden <J.J.vanderHeijden@student.utwente.nl>
Add mingw32 support.
* pexecute.c (pexecute): New function for mingw32. Supports pipes.
(pwait): New function for mingw32.
* config.table (i[3456]86-*-mingw32*): Support for i386-mingw32.
* config/mt-mingw32: New file.
* xmalloc.c (first_break): Not used for mingw32.
(xmalloc_set_program_name): Don't use sbrk on mingw32.
(xmalloc): Likewise.
(xrealloc): Likewise.
Sat Jan 17 22:25:53 1998 Jeffrey A Law (law@cygnus.com) Sat Jan 17 22:25:53 1998 Jeffrey A Law (law@cygnus.com)
* choose-temp.c: Sync with gcc version. * choose-temp.c: Sync with gcc version.
......
...@@ -29,6 +29,13 @@ case "${host}" in ...@@ -29,6 +29,13 @@ case "${host}" in
# autoconfiguration scheme does not work. # autoconfiguration scheme does not work.
frag=mt-vxworks5 frag=mt-vxworks5
;; ;;
i[3456]86-*-mingw32*)
# Mingw32 does not require strerror.o from REQUIRED_OFILES.
# Worse: it will not compile it because of an incompatible sys_errlist
# definition.
frag=mt-mingw32
;;
esac esac
# Try to handle funky case of solaris 2 -> sun 4. # Try to handle funky case of solaris 2 -> sun 4.
......
# Mingw32 target Makefile fragment.
# The autoconfiguration fails for a Mingw32 target, because of an
# incompatible definition of sys_errlist, which is imported from a DLL.
# Therefore, we compute the dependencies by hand.
HDEFINES = -DNO_SYS_PARAM_H -DNO_SYS_FILE_H
CONFIG_H = mgconfig.h
NEEDED_LIST = mgneeded-list
mgconfig.h: Makefile
if [ -f ../newlib/Makefile ]; then \
$(MAKE) $(FLAGS_TO_PASS) xconfig.h; \
cp xconfig.h mgconfig.h; \
else \
echo "#define NEED_sys_siglist 1" >>mgconfig.h; \
echo "#define NEED_strsignal 1" >>mgconfig.h; \
echo "#define NEED_psignal 1" >>mgconfig.h; \
echo "#define NEED_basename 1" >>mgconfig.h; \
fi
mgneeded-list: Makefile
if [ -f ../newlib/Makefile ]; then \
$(MAKE) $(FLAGS_TO_PASS) xneeded-list; \
cp xneeded-list mgneeded-list; \
else \
echo getopt.o vasprintf.o >mgneeded-list; \
fi
...@@ -223,14 +223,50 @@ pwait (pid, status, flags) ...@@ -223,14 +223,50 @@ pwait (pid, status, flags)
#if defined (_WIN32) #if defined (_WIN32)
#include <process.h> #include <process.h>
extern int _spawnv ();
extern int _spawnvp ();
#ifdef __CYGWIN32__ #ifdef __CYGWIN32__
#define fix_argv(argvec) (argvec) #define fix_argv(argvec) (argvec)
#else extern int _spawnv ();
extern int _spawnvp ();
int
pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
const char *program;
char * const *argv;
const char *this_pname;
const char *temp_base;
char **errmsg_fmt, **errmsg_arg;
int flags;
{
int pid;
if ((flags & PEXECUTE_ONE) != PEXECUTE_ONE)
abort ();
pid = (flags & PEXECUTE_SEARCH ? _spawnvp : _spawnv)
(_P_NOWAIT, program, fix_argv(argv));
if (pid == -1)
{
*errmsg_fmt = install_error_msg;
*errmsg_arg = program;
return -1;
}
return pid;
}
int
pwait (pid, status, flags)
int pid;
int *status;
int flags;
{
/* ??? Here's an opportunity to canonicalize the values in STATUS.
Needed? */
return cwait (status, pid, WAIT_CHILD);
}
#else /* ! __CYGWIN32__ */
/* This is a kludge to get around the Microsoft C spawn functions' propensity /* This is a kludge to get around the Microsoft C spawn functions' propensity
to remove the outermost set of double quotes from all arguments. */ to remove the outermost set of double quotes from all arguments. */
...@@ -269,8 +305,24 @@ fix_argv (argvec) ...@@ -269,8 +305,24 @@ fix_argv (argvec)
return (const char * const *) argvec; return (const char * const *) argvec;
} }
#endif /* ! defined (__CYGWIN32__) */ #include <io.h>
#include <fcntl.h>
#include <signal.h>
/* mingw32 headers may not define the following. */
#ifndef _P_WAIT
# define _P_WAIT 0
# define _P_NOWAIT 1
# define _P_OVERLAY 2
# define _P_NOWAITO 3
# define _P_DETACH 4
# define WAIT_CHILD 0
# define WAIT_GRANDCHILD 1
#endif
/* Win32 supports pipes */
int int
pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags) pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
const char *program; const char *program;
...@@ -281,31 +333,114 @@ pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags) ...@@ -281,31 +333,114 @@ pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
int flags; int flags;
{ {
int pid; int pid;
int pdes[2], org_stdin, org_stdout;
int input_desc, output_desc;
int retries, sleep_interval;
/* Pipe waiting from last process, to be used as input for the next one.
Value is STDIN_FILE_NO if no pipe is waiting
(i.e. the next command is the first of a group). */
static int last_pipe_input;
/* If this is the first process, initialize. */
if (flags & PEXECUTE_FIRST)
last_pipe_input = STDIN_FILE_NO;
input_desc = last_pipe_input;
/* If this isn't the last process, make a pipe for its output,
and record it as waiting to be the input to the next process. */
if (! (flags & PEXECUTE_LAST))
{
if (_pipe (pdes, 256, O_BINARY) < 0)
{
*errmsg_fmt = "pipe";
*errmsg_arg = NULL;
return -1;
}
output_desc = pdes[WRITE_PORT];
last_pipe_input = pdes[READ_PORT];
}
else
{
/* Last process. */
output_desc = STDOUT_FILE_NO;
last_pipe_input = STDIN_FILE_NO;
}
if (input_desc != STDIN_FILE_NO)
{
org_stdin = dup (STDIN_FILE_NO);
dup2 (input_desc, STDIN_FILE_NO);
close (input_desc);
}
if (output_desc != STDOUT_FILE_NO)
{
org_stdout = dup (STDOUT_FILE_NO);
dup2 (output_desc, STDOUT_FILE_NO);
close (output_desc);
}
if ((flags & PEXECUTE_ONE) != PEXECUTE_ONE)
abort ();
pid = (flags & PEXECUTE_SEARCH ? _spawnvp : _spawnv) pid = (flags & PEXECUTE_SEARCH ? _spawnvp : _spawnv)
(_P_NOWAIT, program, fix_argv(argv)); (_P_NOWAIT, program, fix_argv(argv));
if (input_desc != STDIN_FILE_NO)
{
dup2 (org_stdin, STDIN_FILE_NO);
close (org_stdin);
}
if (output_desc != STDOUT_FILE_NO)
{
dup2 (org_stdout, STDOUT_FILE_NO);
close (org_stdout);
}
if (pid == -1) if (pid == -1)
{ {
*errmsg_fmt = install_error_msg; *errmsg_fmt = install_error_msg;
*errmsg_arg = program; *errmsg_arg = program;
return -1; return -1;
} }
return pid; return pid;
} }
/* MS CRTDLL doesn't return enough information in status to decide if the
child exited due to a signal or not, rather it simply returns an
integer with the exit code of the child; eg., if the child exited with
an abort() call and didn't have a handler for SIGABRT, it simply returns
with status = 3. We fix the status code to conform to the usual WIF*
macros. Note that WIFSIGNALED will never be true under CRTDLL. */
int int
pwait (pid, status, flags) pwait (pid, status, flags)
int pid; int pid;
int *status; int *status;
int flags; int flags;
{ {
int termstat;
pid = _cwait (&termstat, pid, WAIT_CHILD);
/* ??? Here's an opportunity to canonicalize the values in STATUS. /* ??? Here's an opportunity to canonicalize the values in STATUS.
Needed? */ Needed? */
return _cwait (status, pid, WAIT_CHILD);
/* cwait returns the child process exit code in termstat.
A value of 3 indicates that the child caught a signal, but not
which one. Since only SIGABRT, SIGFPE and SIGINT do anything, we
report SIGABRT. */
if (termstat == 3)
*status = SIGABRT;
else
*status = (((termstat) & 0xff) << 8);
return pid;
} }
#endif /* ! defined (__CYGWIN32__) */
#endif /* _WIN32 */ #endif /* _WIN32 */
#ifdef OS2 #ifdef OS2
......
...@@ -42,16 +42,22 @@ PTR sbrk PARAMS ((ptrdiff_t)); ...@@ -42,16 +42,22 @@ PTR sbrk PARAMS ((ptrdiff_t));
/* The program name if set. */ /* The program name if set. */
static const char *name = ""; static const char *name = "";
/* The initial sbrk, set when the program name is set. */ #if ! defined (_WIN32) || defined (__CYGWIN32__)
/* The initial sbrk, set when the program name is set. Not used for win32
ports other than cygwin32. */
static char *first_break = NULL; static char *first_break = NULL;
#endif
void void
xmalloc_set_program_name (s) xmalloc_set_program_name (s)
const char *s; const char *s;
{ {
name = s; name = s;
#if ! defined (_WIN32) || defined (__CYGWIN32__)
/* Win32 ports other than cygwin32 don't have brk() */
if (first_break == NULL) if (first_break == NULL)
first_break = (char *) sbrk (0); first_break = (char *) sbrk (0);
#endif /* ! _WIN32 || __CYGWIN32 __ */
} }
PTR PTR
...@@ -65,6 +71,7 @@ xmalloc (size) ...@@ -65,6 +71,7 @@ xmalloc (size)
newmem = malloc (size); newmem = malloc (size);
if (!newmem) if (!newmem)
{ {
#if ! defined (_WIN32) || defined (__CYGWIN32__)
extern char **environ; extern char **environ;
size_t allocated; size_t allocated;
...@@ -76,6 +83,12 @@ xmalloc (size) ...@@ -76,6 +83,12 @@ xmalloc (size)
"\n%s%sCan not allocate %lu bytes after allocating %lu bytes\n", "\n%s%sCan not allocate %lu bytes after allocating %lu bytes\n",
name, *name ? ": " : "", name, *name ? ": " : "",
(unsigned long) size, (unsigned long) allocated); (unsigned long) size, (unsigned long) allocated);
#else
fprintf (stderr,
"\n%s%sCan not allocate %lu bytes\n",
name, *name ? ": " : "",
(unsigned long) size);
#endif /* ! _WIN32 || __CYGWIN32 __ */
xexit (1); xexit (1);
} }
return (newmem); return (newmem);
...@@ -96,6 +109,7 @@ xrealloc (oldmem, size) ...@@ -96,6 +109,7 @@ xrealloc (oldmem, size)
newmem = realloc (oldmem, size); newmem = realloc (oldmem, size);
if (!newmem) if (!newmem)
{ {
#ifndef __MINGW32__
extern char **environ; extern char **environ;
size_t allocated; size_t allocated;
...@@ -107,6 +121,12 @@ xrealloc (oldmem, size) ...@@ -107,6 +121,12 @@ xrealloc (oldmem, size)
"\n%s%sCan not reallocate %lu bytes after allocating %lu bytes\n", "\n%s%sCan not reallocate %lu bytes after allocating %lu bytes\n",
name, *name ? ": " : "", name, *name ? ": " : "",
(unsigned long) size, (unsigned long) allocated); (unsigned long) size, (unsigned long) allocated);
#else
fprintf (stderr,
"\n%s%sCan not reallocate %lu bytes\n",
name, *name ? ": " : "",
(unsigned long) size);
#endif /* __MINGW32__ */
xexit (1); xexit (1);
} }
return (newmem); return (newmem);
......
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