[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: system(), Solaris, and the 'execute' module
From: |
Bruno Haible |
Subject: |
Re: system(), Solaris, and the 'execute' module |
Date: |
Tue, 10 Jun 2008 17:46:00 +0200 |
User-agent: |
KMail/1.5.4 |
Eric Blake wrote on 2008-06-02:
> |> Does the execute module allow distinguishing exits due to signals from
> |> regular exits? M4 is currently documented as treating the sysval macro
> |> differently to allow the user to distinguish between signals, but it looks
> |> like wait_subprocess collapses all non-fatal signals into 127
> |
> | Currently the 'execute' module indeed does not allow to distinguish between
> | launch failure and fatal signals. I could imagine to provide this info
> through
> | an optional parameter. But how do you want to treat the portability problem
> | to mingw here?
>
> mingw doesn't have signals, so the optional parameter would never be
> populated.
>
> | How does m4 treat mingw at all? Which shell does it use in 'syscmd' and
> | 'esyscmd'?
>
> The m4 documentation currently mentions that syscmd uses whatever system()
> provides (probably 'cmd.exe /c' for mingw); and that POSIX compliance is
> only attempted for platforms where the m4 macro __unix__ is defined (mingw
> defines __windows__, not __unix__). At any rate, on mingw, syscmd is
> certainly nowhere near a POSIX-compliant command parser, and the m4
> testsuite intentionally skips all tests that try to do anything with a
> shell metacharacter or other action that just won't work without /bin/sh
> as the interpreter (syscmd still works for some things regardless of
> shell, such as a recursive invocation of m4 with arguments that do not
> contain shell metacharacters).
OK, if you are ready to accept a documented misfeature of 'm4' on mingw, I can
also accept a documented misfeature of the execute() function on mingw.
I added an optional output parameter for the termination signal.
2008-06-10 Bruno Haible <address@hidden>
* lib/wait-process.h (wait_subprocess): Add termsigp argument.
* lib/wait-process.c (wait_subprocess): Likewise.
* lib/execute.h (execute): Add termsigp argument.
* lib/execute.c (execute): Likewise.
* lib/csharpcomp.c (compile_csharp_using_pnet,
compile_csharp_using_mono, compile_csharp_using_sscli): Update.
* lib/csharpexec.c (execute_csharp_using_pnet,
execute_csharp_using_mono, execute_csharp_using_sscli): Update.
* lib/javacomp.c (compile_using_envjavac, compile_using_gcj,
compile_using_javac, compile_using_jikes, is_envjavac_gcj,
is_envjavac_gcj43, is_gcj_present, is_gcj_43, is_javac_present,
is_jikes_present): Update.
* lib/javaexec.c (execute_java_class): Update.
* lib/javaversion.c (execute_and_read_line): Update.
* NEWS: Document the changes.
Reported by Eric Blake.
*** NEWS.orig 2008-06-10 17:25:45.000000000 +0200
--- NEWS 2008-06-10 14:19:56.000000000 +0200
***************
*** 6,11 ****
--- 6,16 ----
Date Modules Changes
+ 2008-06-10 execute The execute function takes an additional termsigp
+ argument. Passing termsigp = NULL is ok.
+ wait-process The wait_subprocess function takes an additional
+ termsigp argument. Passing termsigp = NULL is ok.
+
2008-05-10 linebreak The module is split into several modules
unilbrk/*.
The include file is changed from "linebreak.h" to
"unilbrk.h". Two functions are renamed:
*** lib/wait-process.h.orig 2008-06-10 17:25:46.000000000 +0200
--- lib/wait-process.h 2008-06-10 14:00:12.000000000 +0200
***************
*** 1,5 ****
/* Waiting for a subprocess to finish.
! Copyright (C) 2001-2003, 2006 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2001.
This program is free software: you can redistribute it and/or modify
--- 1,5 ----
/* Waiting for a subprocess to finish.
! Copyright (C) 2001-2003, 2006, 2008 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2001.
This program is free software: you can redistribute it and/or modify
***************
*** 47,56 ****
- slave_process should be set to true if the process has been launched as a
slave process.
- If exit_on_error is true, any error will cause the main process to exit
! with an error status. */
extern int wait_subprocess (pid_t child, const char *progname,
bool ignore_sigpipe, bool null_stderr,
! bool slave_process, bool exit_on_error);
/* Register a subprocess as being a slave process. This means that the
subprocess will be terminated when its creator receives a catchable fatal
--- 47,60 ----
- slave_process should be set to true if the process has been launched as a
slave process.
- If exit_on_error is true, any error will cause the main process to exit
! with an error status.
! - If termsigp is not NULL, *termsig will be set to the signal that
! terminated the subprocess (if supported by the platform: not on native
! Windows platforms), otherwise 0. */
extern int wait_subprocess (pid_t child, const char *progname,
bool ignore_sigpipe, bool null_stderr,
! bool slave_process, bool exit_on_error,
! int *termsigp);
/* Register a subprocess as being a slave process. This means that the
subprocess will be terminated when its creator receives a catchable fatal
*** lib/wait-process.c.orig 2008-06-10 17:25:46.000000000 +0200
--- lib/wait-process.c 2008-06-10 14:12:39.000000000 +0200
***************
*** 250,256 ****
int
wait_subprocess (pid_t child, const char *progname,
bool ignore_sigpipe, bool null_stderr,
! bool slave_process, bool exit_on_error)
{
#if HAVE_WAITID && defined WNOWAIT && 0
/* Commented out because waitid() without WEXITED and with WNOWAIT doesn't
--- 250,257 ----
int
wait_subprocess (pid_t child, const char *progname,
bool ignore_sigpipe, bool null_stderr,
! bool slave_process, bool exit_on_error,
! int *termsigp)
{
#if HAVE_WAITID && defined WNOWAIT && 0
/* Commented out because waitid() without WEXITED and with WNOWAIT doesn't
***************
*** 263,268 ****
--- 264,272 ----
before unregister_slave_subprocess() - this process gets a fatal signal,
it would kill the other totally unrelated process. */
siginfo_t info;
+
+ if (termsigp != NULL)
+ *termsigp = 0;
for (;;)
{
if (waitid (P_PID, child, &info, WEXITED | (slave_process ? WNOWAIT :
0))
***************
*** 317,322 ****
--- 321,328 ----
{
case CLD_KILLED:
case CLD_DUMPED:
+ if (termsigp != NULL)
+ *termsigp = info.si_status; /* TODO: or info.si_signo? */
# ifdef SIGPIPE
if (info.si_status == SIGPIPE && ignore_sigpipe)
return 0;
***************
*** 342,347 ****
--- 348,355 ----
/* waitpid() is just as portable as wait() nowadays. */
WAIT_T status;
+ if (termsigp != NULL)
+ *termsigp = 0;
*(int *) &status = 0;
for (;;)
{
***************
*** 385,390 ****
--- 393,400 ----
if (WIFSIGNALED (status))
{
+ if (termsigp != NULL)
+ *termsigp = WTERMSIG (status);
# ifdef SIGPIPE
if (WTERMSIG (status) == SIGPIPE && ignore_sigpipe)
return 0;
*** lib/execute.h.orig 2008-06-10 17:25:46.000000000 +0200
--- lib/execute.h 2008-06-10 14:18:51.000000000 +0200
***************
*** 1,5 ****
/* Creation of autonomous subprocesses.
! Copyright (C) 2001-2003 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2001.
This program is free software: you can redistribute it and/or modify
--- 1,5 ----
/* Creation of autonomous subprocesses.
! Copyright (C) 2001-2003, 2008 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2001.
This program is free software: you can redistribute it and/or modify
***************
*** 29,40 ****
purpose is to write to standard output.
If slave_process is true, the child process will be terminated when its
creator receives a catchable fatal signal.
It is recommended that no signal is blocked or ignored while execute()
is called. See pipe.h for the reason. */
extern int execute (const char *progname,
const char *prog_path, char **prog_argv,
bool ignore_sigpipe,
bool null_stdin, bool null_stdout, bool null_stderr,
! bool slave_process, bool exit_on_error);
#endif /* _EXECUTE_H */
--- 29,44 ----
purpose is to write to standard output.
If slave_process is true, the child process will be terminated when its
creator receives a catchable fatal signal.
+ If termsigp is not NULL, *termsig will be set to the signal that terminated
+ the subprocess (if supported by the platform: not on native Windows
+ platforms), otherwise 0.
It is recommended that no signal is blocked or ignored while execute()
is called. See pipe.h for the reason. */
extern int execute (const char *progname,
const char *prog_path, char **prog_argv,
bool ignore_sigpipe,
bool null_stdin, bool null_stdout, bool null_stderr,
! bool slave_process, bool exit_on_error,
! int *termsigp);
#endif /* _EXECUTE_H */
*** lib/execute.c.orig 2008-06-10 17:25:46.000000000 +0200
--- lib/execute.c 2008-06-10 14:22:48.000000000 +0200
***************
*** 117,123 ****
const char *prog_path, char **prog_argv,
bool ignore_sigpipe,
bool null_stdin, bool null_stdout, bool null_stderr,
! bool slave_process, bool exit_on_error)
{
#if defined _MSC_VER || defined __MINGW32__
--- 117,124 ----
const char *prog_path, char **prog_argv,
bool ignore_sigpipe,
bool null_stdin, bool null_stdout, bool null_stderr,
! bool slave_process, bool exit_on_error,
! int *termsigp)
{
#if defined _MSC_VER || defined __MINGW32__
***************
*** 173,178 ****
--- 174,182 ----
if (null_stdin)
dup2 (orig_stdin, STDIN_FILENO), close (orig_stdin);
+ if (termsigp != NULL)
+ *termsigp = 0;
+
if (exitcode == -1)
{
if (exit_on_error || !null_stderr)
***************
*** 251,256 ****
--- 255,262 ----
posix_spawnattr_destroy (&attrs);
if (slave_process)
unblock_fatal_signals ();
+ if (termsigp != NULL)
+ *termsigp = 0;
if (exit_on_error || !null_stderr)
error (exit_on_error ? EXIT_FAILURE : 0, err,
_("%s subprocess failed"), progname);
***************
*** 293,298 ****
--- 299,306 ----
{
if (slave_process)
unblock_fatal_signals ();
+ if (termsigp != NULL)
+ *termsigp = 0;
if (exit_on_error || !null_stderr)
error (exit_on_error ? EXIT_FAILURE : 0, errno,
_("%s subprocess failed"), progname);
***************
*** 306,312 ****
}
return wait_subprocess (child, progname, ignore_sigpipe, null_stderr,
! slave_process, exit_on_error);
#endif
}
--- 314,320 ----
}
return wait_subprocess (child, progname, ignore_sigpipe, null_stderr,
! slave_process, exit_on_error, termsigp);
#endif
}
*** lib/csharpcomp.c.orig 2008-06-10 17:25:46.000000000 +0200
--- lib/csharpcomp.c 2008-06-10 14:27:24.000000000 +0200
***************
*** 1,5 ****
/* Compile a C# program.
! Copyright (C) 2003-2007 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2003.
This program is free software: you can redistribute it and/or modify
--- 1,5 ----
/* Compile a C# program.
! Copyright (C) 2003-2008 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2003.
This program is free software: you can redistribute it and/or modify
***************
*** 83,89 ****
argv[1] = "--version";
argv[2] = NULL;
exitstatus = execute ("cscc", "cscc", argv, false, false, true, true,
! true, false);
cscc_present = (exitstatus == 0);
cscc_tested = true;
}
--- 83,89 ----
argv[1] = "--version";
argv[2] = NULL;
exitstatus = execute ("cscc", "cscc", argv, false, false, true, true,
! true, false, NULL);
cscc_present = (exitstatus == 0);
cscc_tested = true;
}
***************
*** 151,157 ****
}
exitstatus = execute ("cscc", "cscc", argv, false, false, false, false,
! true, true);
for (i = 0; i < sources_count; i++)
if (argv[argc - sources_count + i] != sources[i])
--- 151,157 ----
}
exitstatus = execute ("cscc", "cscc", argv, false, false, false, false,
! true, true, NULL);
for (i = 0; i < sources_count; i++)
if (argv[argc - sources_count + i] != sources[i])
***************
*** 219,225 ****
/* Remove zombie process from process list, and retrieve exit
status. */
exitstatus =
! wait_subprocess (child, "mcs", false, true, true, false);
if (exitstatus != 0)
mcs_present = false;
}
--- 219,225 ----
/* Remove zombie process from process list, and retrieve exit
status. */
exitstatus =
! wait_subprocess (child, "mcs", false, true, true, false, NULL);
if (exitstatus != 0)
mcs_present = false;
}
***************
*** 332,338 ****
fclose (fp);
/* Remove zombie process from process list, and retrieve exit status.
*/
! exitstatus = wait_subprocess (child, "mcs", false, false, true, true);
for (i = 1 + (output_is_library ? 1 : 0);
i < 1 + (output_is_library ? 1 : 0)
--- 332,339 ----
fclose (fp);
/* Remove zombie process from process list, and retrieve exit status.
*/
! exitstatus =
! wait_subprocess (child, "mcs", false, false, true, true, NULL);
for (i = 1 + (output_is_library ? 1 : 0);
i < 1 + (output_is_library ? 1 : 0)
***************
*** 408,414 ****
/* Remove zombie process from process list, and retrieve exit
status. */
exitstatus =
! wait_subprocess (child, "csc", false, true, true, false);
if (exitstatus != 0)
csc_present = false;
}
--- 409,415 ----
/* Remove zombie process from process list, and retrieve exit
status. */
exitstatus =
! wait_subprocess (child, "csc", false, true, true, false, NULL);
if (exitstatus != 0)
csc_present = false;
}
***************
*** 486,492 ****
}
exitstatus = execute ("csc", "csc", argv, false, false, false, false,
! true, true);
for (i = 2; i < 3 + libdirs_count + libraries_count; i++)
freea (argv[i]);
--- 487,493 ----
}
exitstatus = execute ("csc", "csc", argv, false, false, false, false,
! true, true, NULL);
for (i = 2; i < 3 + libdirs_count + libraries_count; i++)
freea (argv[i]);
*** lib/csharpexec.c.orig 2008-06-10 17:25:46.000000000 +0200
--- lib/csharpexec.c 2008-06-10 14:27:45.000000000 +0200
***************
*** 1,5 ****
/* Execute a C# program.
! Copyright (C) 2003-2007 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2003.
This program is free software: you can redistribute it and/or modify
--- 1,5 ----
/* Execute a C# program.
! Copyright (C) 2003-2008 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2003.
This program is free software: you can redistribute it and/or modify
***************
*** 109,115 ****
argv[1] = "--version";
argv[2] = NULL;
exitstatus = execute ("ilrun", "ilrun", argv, false, false, true, true,
! true, false);
ilrun_present = (exitstatus == 0);
ilrun_tested = true;
}
--- 109,115 ----
argv[1] = "--version";
argv[2] = NULL;
exitstatus = execute ("ilrun", "ilrun", argv, false, false, true, true,
! true, false, NULL);
ilrun_present = (exitstatus == 0);
ilrun_tested = true;
}
***************
*** 179,185 ****
argv[1] = "--version";
argv[2] = NULL;
exitstatus = execute ("mono", "mono", argv, false, false, true, true,
! true, false);
mono_present = (exitstatus == 0);
mono_tested = true;
}
--- 179,185 ----
argv[1] = "--version";
argv[2] = NULL;
exitstatus = execute ("mono", "mono", argv, false, false, true, true,
! true, false, NULL);
mono_present = (exitstatus == 0);
mono_tested = true;
}
***************
*** 240,246 ****
argv[0] = "clix";
argv[1] = NULL;
exitstatus = execute ("clix", "clix", argv, false, false, true, true,
! true, false);
clix_present = (exitstatus == 0 || exitstatus == 1);
clix_tested = true;
}
--- 240,246 ----
argv[0] = "clix";
argv[1] = NULL;
exitstatus = execute ("clix", "clix", argv, false, false, true, true,
! true, false, NULL);
clix_present = (exitstatus == 0 || exitstatus == 1);
clix_tested = true;
}
*** lib/javacomp.c.orig 2008-06-10 17:25:46.000000000 +0200
--- lib/javacomp.c 2008-06-10 14:28:18.000000000 +0200
***************
*** 1,5 ****
/* Compile a Java program.
! Copyright (C) 2001-2003, 2006-2007 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2001.
This program is free software: you can redistribute it and/or modify
--- 1,5 ----
/* Compile a Java program.
! Copyright (C) 2001-2003, 2006-2008 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2001.
This program is free software: you can redistribute it and/or modify
***************
*** 268,274 ****
argv[2] = command;
argv[3] = NULL;
exitstatus = execute (javac, "/bin/sh", argv, false, false, false,
! null_stderr, true, true);
err = (exitstatus != 0);
freea (command);
--- 268,274 ----
argv[2] = command;
argv[3] = NULL;
exitstatus = execute (javac, "/bin/sh", argv, false, false, false,
! null_stderr, true, true, NULL);
err = (exitstatus != 0);
freea (command);
***************
*** 350,356 ****
}
exitstatus = execute ("gcj", "gcj", argv, false, false, false, null_stderr,
! true, true);
err = (exitstatus != 0);
if (ftarget_arg != NULL)
--- 350,356 ----
}
exitstatus = execute ("gcj", "gcj", argv, false, false, false, null_stderr,
! true, true, NULL);
err = (exitstatus != 0);
if (ftarget_arg != NULL)
***************
*** 421,427 ****
}
exitstatus = execute ("javac", "javac", argv, false, false, false,
! null_stderr, true, true);
err = (exitstatus != 0);
freea (argv);
--- 421,427 ----
}
exitstatus = execute ("javac", "javac", argv, false, false, false,
! null_stderr, true, true, NULL);
err = (exitstatus != 0);
freea (argv);
***************
*** 476,482 ****
}
exitstatus = execute ("jikes", "jikes", argv, false, false, false,
! null_stderr, true, true);
err = (exitstatus != 0);
freea (argv);
--- 476,482 ----
}
exitstatus = execute ("jikes", "jikes", argv, false, false, false,
! null_stderr, true, true, NULL);
err = (exitstatus != 0);
freea (argv);
***************
*** 605,611 ****
fclose (fp);
/* Remove zombie process from process list, and retrieve exit status.
*/
! exitstatus = wait_subprocess (child, javac, true, true, true, false);
if (exitstatus != 0)
envjavac_gcj = false;
--- 605,612 ----
fclose (fp);
/* Remove zombie process from process list, and retrieve exit status.
*/
! exitstatus =
! wait_subprocess (child, javac, true, true, true, false, NULL);
if (exitstatus != 0)
envjavac_gcj = false;
***************
*** 689,695 ****
fclose (fp);
/* Remove zombie process from process list, and retrieve exit status.
*/
! exitstatus = wait_subprocess (child, javac, true, true, true, false);
if (exitstatus != 0)
envjavac_gcj43 = false;
--- 690,697 ----
fclose (fp);
/* Remove zombie process from process list, and retrieve exit status.
*/
! exitstatus =
! wait_subprocess (child, javac, true, true, true, false, NULL);
if (exitstatus != 0)
envjavac_gcj43 = false;
***************
*** 1367,1373 ****
/* Remove zombie process from process list, and retrieve exit
status. */
exitstatus =
! wait_subprocess (child, "gcj", false, true, true, false);
if (exitstatus != 0)
gcj_present = false;
}
--- 1369,1375 ----
/* Remove zombie process from process list, and retrieve exit
status. */
exitstatus =
! wait_subprocess (child, "gcj", false, true, true, false, NULL);
if (exitstatus != 0)
gcj_present = false;
}
***************
*** 1482,1488 ****
/* Remove zombie process from process list, and retrieve exit
status. */
exitstatus =
! wait_subprocess (child, "gcj", false, true, true, false);
if (exitstatus != 0)
gcj_43 = false;
}
--- 1484,1490 ----
/* Remove zombie process from process list, and retrieve exit
status. */
exitstatus =
! wait_subprocess (child, "gcj", false, true, true, false, NULL);
if (exitstatus != 0)
gcj_43 = false;
}
***************
*** 1791,1797 ****
argv[0] = "javac";
argv[1] = NULL;
exitstatus = execute ("javac", "javac", argv, false, false, true, true,
! true, false);
javac_present = (exitstatus == 0 || exitstatus == 1 || exitstatus == 2);
javac_tested = true;
}
--- 1793,1799 ----
argv[0] = "javac";
argv[1] = NULL;
exitstatus = execute ("javac", "javac", argv, false, false, true, true,
! true, false, NULL);
javac_present = (exitstatus == 0 || exitstatus == 1 || exitstatus == 2);
javac_tested = true;
}
***************
*** 2055,2061 ****
argv[0] = "jikes";
argv[1] = NULL;
exitstatus = execute ("jikes", "jikes", argv, false, false, true, true,
! true, false);
jikes_present = (exitstatus == 0 || exitstatus == 1);
jikes_tested = true;
}
--- 2057,2063 ----
argv[0] = "jikes";
argv[1] = NULL;
exitstatus = execute ("jikes", "jikes", argv, false, false, true, true,
! true, false, NULL);
jikes_present = (exitstatus == 0 || exitstatus == 1);
jikes_tested = true;
}
*** lib/javaexec.c.orig 2008-06-10 17:25:46.000000000 +0200
--- lib/javaexec.c 2008-06-10 14:28:44.000000000 +0200
***************
*** 1,5 ****
/* Execute a Java program.
! Copyright (C) 2001-2003, 2006-2007 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2001.
This program is free software: you can redistribute it and/or modify
--- 1,5 ----
/* Execute a Java program.
! Copyright (C) 2001-2003, 2006-2008 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2001.
This program is free software: you can redistribute it and/or modify
***************
*** 209,215 ****
argv[1] = "--version";
argv[2] = NULL;
exitstatus = execute ("gij", "gij", argv, false, false, true, true,
! true, false);
gij_present = (exitstatus == 0);
gij_tested = true;
}
--- 209,215 ----
argv[1] = "--version";
argv[2] = NULL;
exitstatus = execute ("gij", "gij", argv, false, false, true, true,
! true, false, NULL);
gij_present = (exitstatus == 0);
gij_tested = true;
}
***************
*** 262,268 ****
argv[1] = "-version";
argv[2] = NULL;
exitstatus = execute ("java", "java", argv, false, false, true, true,
! true, false);
java_present = (exitstatus == 0);
java_tested = true;
}
--- 262,268 ----
argv[1] = "-version";
argv[2] = NULL;
exitstatus = execute ("java", "java", argv, false, false, true, true,
! true, false, NULL);
java_present = (exitstatus == 0);
java_tested = true;
}
***************
*** 316,322 ****
argv[0] = "jre";
argv[1] = NULL;
exitstatus = execute ("jre", "jre", argv, false, false, true, true,
! true, false);
jre_present = (exitstatus == 0 || exitstatus == 1);
jre_tested = true;
}
--- 316,322 ----
argv[0] = "jre";
argv[1] = NULL;
exitstatus = execute ("jre", "jre", argv, false, false, true, true,
! true, false, NULL);
jre_present = (exitstatus == 0 || exitstatus == 1);
jre_tested = true;
}
***************
*** 373,379 ****
argv[1] = "-?";
argv[2] = NULL;
exitstatus = execute ("jview", "jview", argv, false, false, true, true,
! true, false);
jview_present = (exitstatus == 0 || exitstatus == 1);
jview_tested = true;
}
--- 373,379 ----
argv[1] = "-?";
argv[2] = NULL;
exitstatus = execute ("jview", "jview", argv, false, false, true, true,
! true, false, NULL);
jview_present = (exitstatus == 0 || exitstatus == 1);
jview_tested = true;
}
*** lib/javaversion.c.orig 2008-06-10 17:25:46.000000000 +0200
--- lib/javaversion.c 2008-06-10 14:24:25.000000000 +0200
***************
*** 1,5 ****
/* Determine the Java version supported by javaexec.
! Copyright (C) 2006, 2007 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2006.
This program is free software: you can redistribute it and/or modify
--- 1,5 ----
/* Determine the Java version supported by javaexec.
! Copyright (C) 2006-2008 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2006.
This program is free software: you can redistribute it and/or modify
***************
*** 90,96 ****
fclose (fp);
/* Remove zombie process from process list, and retrieve exit status. */
! exitstatus = wait_subprocess (child, progname, true, false, true, false);
if (exitstatus != 0)
{
free (line);
--- 90,97 ----
fclose (fp);
/* Remove zombie process from process list, and retrieve exit status. */
! exitstatus =
! wait_subprocess (child, progname, true, false, true, false, NULL);
if (exitstatus != 0)
{
free (line);