mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-22 21:07:36 +00:00
* callproc.c (child_setup): Make sure that in, out, and err are
not less than three. (relocate_fd): New function.
This commit is contained in:
parent
a4fc736006
commit
426b37aecf
1 changed files with 42 additions and 0 deletions
|
|
@ -23,6 +23,11 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
|
||||
#include "config.h"
|
||||
|
||||
extern int errno;
|
||||
#ifndef VMS
|
||||
extern char *sys_errlist[];
|
||||
#endif
|
||||
|
||||
/* Define SIGCHLD as an alias for SIGCLD. */
|
||||
|
||||
#if !defined (SIGCHLD) && defined (SIGCLD)
|
||||
|
|
@ -474,6 +479,14 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
|
|||
*new_env = 0;
|
||||
}
|
||||
|
||||
/* Make sure that in, out, and err are not actually already in
|
||||
descriptors zero, one, or two; this could happen if Emacs is
|
||||
started with its standard in, our, or error closed, as might
|
||||
happen under X. */
|
||||
in = relocate_fd (in, 3);
|
||||
out = relocate_fd (out, 3);
|
||||
err = relocate_fd (err, 3);
|
||||
|
||||
close (0);
|
||||
close (1);
|
||||
close (2);
|
||||
|
|
@ -507,6 +520,35 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
|
|||
_exit (1);
|
||||
}
|
||||
|
||||
/* Move the file descriptor FD so that its number is not less than MIN.
|
||||
If the file descriptor is moved at all, the original is freed. */
|
||||
int
|
||||
relocate_fd (fd, min)
|
||||
int fd, min;
|
||||
{
|
||||
if (fd >= min)
|
||||
return fd;
|
||||
else
|
||||
{
|
||||
int new = dup (fd);
|
||||
if (new == -1)
|
||||
{
|
||||
char message1[] =
|
||||
"Error while setting up child: ";
|
||||
char message2[] = "\n";
|
||||
write (2, message1, sizeof (message1) - 1);
|
||||
write (2, sys_errlist[errno], strlen (sys_errlist[errno]));
|
||||
write (2, message2, sizeof (message2) - 1);
|
||||
_exit (1);
|
||||
}
|
||||
/* Note that we hold the original FD open while we recurse,
|
||||
to guarantee we'll get a new FD if we need it. */
|
||||
new = relocate_fd (new, min);
|
||||
close (fd);
|
||||
return new;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
getenv_internal (var, varlen, value, valuelen)
|
||||
char *var;
|
||||
|
|
|
|||
Loading…
Reference in a new issue