X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/2912322b80f7db17e3aefd58884056f99f1024e6..1e11dbe3d862434ded0d5718f737f1f03f3141be:/src/callproc.c
diff --git a/src/callproc.c b/src/callproc.c
index 378c647f38..59067040fd 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -24,13 +24,6 @@ along with GNU Emacs. If not, see . */
#include
#include
#include
-
-/* Define SIGCHLD as an alias for SIGCLD. */
-
-#if !defined (SIGCHLD) && defined (SIGCLD)
-#define SIGCHLD SIGCLD
-#endif /* SIGCLD */
-
#include
#ifdef HAVE_UNISTD_H
@@ -38,35 +31,20 @@ along with GNU Emacs. If not, see . */
#endif
#include
-#ifdef HAVE_FCNTL_H
-#define INCLUDED_FCNTL
#include
-#endif
#ifdef WINDOWSNT
#define NOMINMAX
#include
-#include /* for proper declaration of environ */
-#include
#include "w32.h"
#define _P_NOWAIT 1 /* from process.h */
#endif
#ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
-#define INCLUDED_FCNTL
-#include
#include
#include
#endif /* MSDOS */
-#ifndef O_RDONLY
-#define O_RDONLY 0
-#endif
-
-#ifndef O_WRONLY
-#define O_WRONLY 1
-#endif
-
#include "lisp.h"
#include "commands.h"
#include "buffer.h"
@@ -91,7 +69,7 @@ extern char **environ;
#endif
#ifdef HAVE_SETPGID
-#if !defined (USG) || defined (BSD_PGRPS)
+#if !defined (USG)
#undef setpgrp
#define setpgrp setpgid
#endif
@@ -104,8 +82,6 @@ Lisp_Object Vconfigure_info_directory, Vshared_game_score_directory;
/* Pattern used by call-process-region to make temp files. */
static Lisp_Object Vtemp_file_name_pattern;
-extern Lisp_Object Vtemporary_file_directory;
-
Lisp_Object Vshell_file_name;
Lisp_Object Vprocess_environment, Vinitial_environment;
@@ -119,7 +95,7 @@ Lisp_Object Qbuffer_file_type;
int synch_process_alive;
/* Nonzero => this is a string explaining death of synchronous subprocess. */
-char *synch_process_death;
+const char *synch_process_death;
/* Nonzero => this is the signal number that terminated the subprocess. */
int synch_process_termsig;
@@ -139,8 +115,7 @@ static int call_process_exited;
EXFUN (Fgetenv_internal, 2);
static Lisp_Object
-call_process_kill (fdpid)
- Lisp_Object fdpid;
+call_process_kill (Lisp_Object fdpid)
{
emacs_close (XFASTINT (Fcar (fdpid)));
EMACS_KILLPG (XFASTINT (Fcdr (fdpid)), SIGKILL);
@@ -149,8 +124,7 @@ call_process_kill (fdpid)
}
Lisp_Object
-call_process_cleanup (arg)
- Lisp_Object arg;
+call_process_cleanup (Lisp_Object arg)
{
Lisp_Object fdpid = Fcdr (arg);
#if defined (MSDOS)
@@ -219,9 +193,7 @@ and returns a numeric exit status or a signal description string.
If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.
usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
- (nargs, args)
- int nargs;
- register Lisp_Object *args;
+ (int nargs, register Lisp_Object *args)
{
Lisp_Object infile, buffer, current_dir, path;
int display_p;
@@ -282,21 +254,16 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
if (!NILP (Vcoding_system_for_write))
val = Vcoding_system_for_write;
else if (! must_encode)
- val = Qnil;
+ val = Qraw_text;
else
{
args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2);
args2[0] = Qcall_process;
for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
- if (CONSP (coding_systems))
- val = XCDR (coding_systems);
- else if (CONSP (Vdefault_process_coding_system))
- val = XCDR (Vdefault_process_coding_system);
- else
- val = Qnil;
+ val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil;
}
- val = coding_inherit_eol_type (val, Qnil);
+ val = complement_process_encoding_system (val);
setup_coding_system (Fcheck_coding_system (val), &argument_coding);
coding_attrs = CODING_ID_ATTRS (argument_coding.id);
if (NILP (CODING_ATTR_ASCII_COMPAT (coding_attrs)))
@@ -581,7 +548,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
#ifdef HAVE_SETSID
setsid ();
#endif
-#if defined (USG) && !defined (BSD_PGRPS)
+#if defined (USG)
setpgrp ();
#else
setpgrp (pid, pid);
@@ -618,12 +585,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
{
if (fd[0] >= 0)
emacs_close (fd[0]);
-#ifndef subprocesses
- /* If Emacs has been built with asynchronous subprocess support,
- we don't need to do this, I think because it will then have
- the facilities for handling SIGCHLD. */
- wait_without_blocking ();
-#endif /* subprocesses */
return Qnil;
}
@@ -692,9 +653,9 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
QUIT;
{
- register int nread;
+ register EMACS_INT nread;
int first = 1;
- int total_read = 0;
+ EMACS_INT total_read = 0;
int carryover = 0;
int display_on_the_fly = display_p;
struct coding_system saved_coding;
@@ -779,10 +740,8 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
PT_BYTE + process_coding.produced);
carryover = process_coding.carryover_bytes;
if (carryover > 0)
- /* As CARRYOVER should not be that large, we had
- better avoid overhead of bcopy. */
- BCOPY_SHORT (process_coding.carryover, buf,
- process_coding.carryover_bytes);
+ memcpy (buf, process_coding.carryover,
+ process_coding.carryover_bytes);
}
}
@@ -819,8 +778,10 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
make_number (total_read));
}
+#ifndef MSDOS
/* Wait for it to terminate, unless it already has. */
wait_for_termination (pid);
+#endif
immediate_quit = 0;
@@ -832,7 +793,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
if (synch_process_termsig)
{
- char *signame;
+ const char *signame;
synchronize_system_messages_locale ();
signame = strsignal (synch_process_termsig);
@@ -850,8 +811,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
}
static Lisp_Object
-delete_temp_file (name)
- Lisp_Object name;
+delete_temp_file (Lisp_Object name)
{
/* Suppress jka-compr handling, etc. */
int count = SPECPDL_INDEX ();
@@ -884,9 +844,7 @@ and returns a numeric exit status or a signal description string.
If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.
usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &rest ARGS) */)
- (nargs, args)
- int nargs;
- register Lisp_Object *args;
+ (int nargs, register Lisp_Object *args)
{
struct gcpro gcpro1;
Lisp_Object filename_string;
@@ -921,7 +879,7 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r
pattern = Fexpand_file_name (Vtemp_file_name_pattern, tmpdir);
tempfile = (char *) alloca (SBYTES (pattern) + 1);
- bcopy (SDATA (pattern), tempfile, SBYTES (pattern) + 1);
+ memcpy (tempfile, SDATA (pattern), SBYTES (pattern) + 1);
coding_systems = Qt;
#ifdef HAVE_MKSTEMP
@@ -949,20 +907,16 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r
if (!NILP (Vcoding_system_for_write))
val = Vcoding_system_for_write;
else if (NILP (current_buffer->enable_multibyte_characters))
- val = Qnil;
+ val = Qraw_text;
else
{
args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2);
args2[0] = Qcall_process_region;
for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
- if (CONSP (coding_systems))
- val = XCDR (coding_systems);
- else if (CONSP (Vdefault_process_coding_system))
- val = XCDR (Vdefault_process_coding_system);
- else
- val = Qnil;
+ val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil;
}
+ val = complement_process_encoding_system (val);
{
int count1 = SPECPDL_INDEX ();
@@ -999,7 +953,9 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r
RETURN_UNGCPRO (unbind_to (count, Fcall_process (nargs, args)));
}
-static int relocate_fd ();
+#ifndef WINDOWSNT
+static int relocate_fd (int fd, int minfd);
+#endif
static char **
add_env (char **env, char **new_env, char *string)
@@ -1054,11 +1010,7 @@ add_env (char **env, char **new_env, char *string)
executable directory by the parent. */
int
-child_setup (in, out, err, new_argv, set_pgrp, current_dir)
- int in, out, err;
- register char **new_argv;
- int set_pgrp;
- Lisp_Object current_dir;
+child_setup (int in, int out, int err, register char **new_argv, int set_pgrp, Lisp_Object current_dir)
{
char **env;
char *pwd_var;
@@ -1069,19 +1021,9 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
int pid = getpid ();
-#ifdef SET_EMACS_PRIORITY
- {
- extern EMACS_INT emacs_priority;
-
- if (emacs_priority < 0)
- nice (- emacs_priority);
- }
-#endif
-
-#ifdef subprocesses
/* Close Emacs's descriptors that this process should not have. */
close_process_descs ();
-#endif
+
/* DOS_NT isn't in a vfork, so if we are in the middle of load-file,
we will lose if we call close_load_descs here. */
#ifndef DOS_NT
@@ -1108,8 +1050,8 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
pwd_var = (char *) alloca (i + 6);
#endif
temp = pwd_var + 4;
- bcopy ("PWD=", pwd_var, 4);
- bcopy (SDATA (current_dir), temp, i);
+ memcpy (pwd_var, "PWD=", 4);
+ memcpy (temp, SDATA (current_dir), i);
if (!IS_DIRECTORY_SEP (temp[i - 1])) temp[i++] = DIRECTORY_SEP;
temp[i] = 0;
@@ -1142,7 +1084,7 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
char **p, **q;
register int new_length;
Lisp_Object display = Qnil;
-
+
new_length = 0;
for (tem = Vprocess_environment;
@@ -1178,7 +1120,7 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
but with corrected value. */
if (egetenv ("PWD"))
*new_env++ = pwd_var;
-
+
if (STRINGP (display))
{
int vlen = strlen ("DISPLAY=") + strlen (SDATA (display)) + 1;
@@ -1208,10 +1150,18 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
}
}
-
+
#ifdef WINDOWSNT
prepare_standard_handles (in, out, err, handles);
set_process_dir (SDATA (current_dir));
+ /* Spawn the child. (See ntproc.c:Spawnve). */
+ cpid = spawnve (_P_NOWAIT, new_argv[0], new_argv, env);
+ reset_standard_handles (in, out, err, handles);
+ if (cpid == -1)
+ /* An error occurred while trying to spawn the process. */
+ report_file_error ("Spawning child process", Qnil);
+ return cpid;
+
#else /* not WINDOWSNT */
/* Make sure that in, out, and err are not actually already in
descriptors zero, one, or two; this could happen if Emacs is
@@ -1246,38 +1196,22 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
dup2 (out, 1);
dup2 (err, 2);
emacs_close (in);
- emacs_close (out);
- emacs_close (err);
-#endif /* not MSDOS */
-#endif /* not WINDOWSNT */
+ if (out != in)
+ emacs_close (out);
+ if (err != in && err != out)
+ emacs_close (err);
-#if defined(USG) && !defined(BSD_PGRPS)
+#if defined(USG)
#ifndef SETPGRP_RELEASES_CTTY
setpgrp (); /* No arguments but equivalent in this case */
#endif
-#else
+#else /* not USG */
setpgrp (pid, pid);
-#endif /* USG */
+#endif /* not USG */
+
/* setpgrp_of_tty is incorrect here; it uses input_fd. */
- EMACS_SET_TTY_PGRP (0, &pid);
+ tcsetpgrp (0, pid);
-#ifdef MSDOS
- pid = run_msdos_command (new_argv, pwd_var + 4, in, out, err, env);
- xfree (pwd_var);
- if (pid == -1)
- /* An error occurred while trying to run the subprocess. */
- report_file_error ("Spawning child process", Qnil);
- return pid;
-#else /* not MSDOS */
-#ifdef WINDOWSNT
- /* Spawn the child. (See ntproc.c:Spawnve). */
- cpid = spawnve (_P_NOWAIT, new_argv[0], new_argv, env);
- reset_standard_handles (in, out, err, handles);
- if (cpid == -1)
- /* An error occurred while trying to spawn the process. */
- report_file_error ("Spawning child process", Qnil);
- return cpid;
-#else /* not WINDOWSNT */
/* execvp does not accept an environment arg so the only way
to pass this environment is to set environ. Our caller
is responsible for restoring the ambient value of environ. */
@@ -1288,46 +1222,57 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
emacs_write (1, new_argv[0], strlen (new_argv[0]));
emacs_write (1, "\n", 1);
_exit (1);
-#endif /* not WINDOWSNT */
-#endif /* not MSDOS */
+
+#else /* MSDOS */
+ pid = run_msdos_command (new_argv, pwd_var + 4, in, out, err, env);
+ xfree (pwd_var);
+ if (pid == -1)
+ /* An error occurred while trying to run the subprocess. */
+ report_file_error ("Spawning child process", Qnil);
+ return pid;
+#endif /* MSDOS */
+#endif /* not WINDOWSNT */
}
+#ifndef WINDOWSNT
/* Move the file descriptor FD so that its number is not less than MINFD.
If the file descriptor is moved at all, the original is freed. */
static int
-relocate_fd (fd, minfd)
- int fd, minfd;
+relocate_fd (int fd, int minfd)
{
if (fd >= minfd)
return fd;
else
{
- int new = dup (fd);
+ int new;
+#ifdef F_DUPFD
+ new = fcntl (fd, F_DUPFD, minfd);
+#else
+ new = dup (fd);
+ if (new != -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, minfd);
+#endif
if (new == -1)
{
- char *message1 = "Error while setting up child: ";
- char *errmessage = strerror (errno);
- char *message2 = "\n";
+ const char *message1 = "Error while setting up child: ";
+ const char *errmessage = strerror (errno);
+ const char *message2 = "\n";
emacs_write (2, message1, strlen (message1));
emacs_write (2, errmessage, strlen (errmessage));
emacs_write (2, message2, strlen (message2));
_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, minfd);
emacs_close (fd);
return new;
}
}
+#endif /* not WINDOWSNT */
static int
-getenv_internal_1 (var, varlen, value, valuelen, env)
- char *var;
- int varlen;
- char **value;
- int *valuelen;
- Lisp_Object env;
+getenv_internal_1 (const char *var, int varlen, char **value, int *valuelen,
+ Lisp_Object env)
{
for (; CONSP (env); env = XCDR (env))
{
@@ -1338,7 +1283,7 @@ getenv_internal_1 (var, varlen, value, valuelen, env)
/* NT environment variables are case insensitive. */
&& ! strnicmp (SDATA (entry), var, varlen)
#else /* not WINDOWSNT */
- && ! bcmp (SDATA (entry), var, varlen)
+ && ! memcmp (SDATA (entry), var, varlen)
#endif /* not WINDOWSNT */
)
{
@@ -1361,12 +1306,8 @@ getenv_internal_1 (var, varlen, value, valuelen, env)
}
static int
-getenv_internal (var, varlen, value, valuelen, frame)
- char *var;
- int varlen;
- char **value;
- int *valuelen;
- Lisp_Object frame;
+getenv_internal (const char *var, int varlen, char **value, int *valuelen,
+ Lisp_Object frame)
{
/* Try to find VAR in Vprocess_environment first. */
if (getenv_internal_1 (var, varlen, value, valuelen,
@@ -1403,8 +1344,7 @@ This function searches `process-environment' for VARIABLE.
If optional parameter ENV is a list, then search this list instead of
`process-environment', and return t when encountering a negative entry
\(an entry for a variable with no value). */)
- (variable, env)
- Lisp_Object variable, env;
+ (Lisp_Object variable, Lisp_Object env)
{
char *value;
int valuelen;
@@ -1428,8 +1368,7 @@ If optional parameter ENV is a list, then search this list instead of
/* A version of getenv that consults the Lisp environment lists,
easily callable from C. */
char *
-egetenv (var)
- char *var;
+egetenv (const char *var)
{
char *value;
int valuelen;
@@ -1444,7 +1383,7 @@ egetenv (var)
/* This is run before init_cmdargs. */
void
-init_callproc_1 ()
+init_callproc_1 (void)
{
char *data_dir = egetenv ("EMACSDATA");
char *doc_dir = egetenv ("EMACSDOC");
@@ -1466,7 +1405,7 @@ init_callproc_1 ()
/* This is run after init_cmdargs, when Vinstallation_directory is valid. */
void
-init_callproc ()
+init_callproc (void)
{
char *data_dir = egetenv ("EMACSDATA");
@@ -1555,16 +1494,15 @@ init_callproc ()
}
void
-set_initial_environment ()
+set_initial_environment (void)
{
register char **envp;
-#ifndef CANNOT_DUMP
- if (initialized)
- {
+#ifdef CANNOT_DUMP
+ Vprocess_environment = Qnil;
#else
- {
- Vprocess_environment = Qnil;
+ if (initialized)
#endif
+ {
for (envp = environ; *envp; envp++)
Vprocess_environment = Fcons (build_string (*envp),
Vprocess_environment);
@@ -1575,10 +1513,10 @@ set_initial_environment ()
}
void
-syms_of_callproc ()
+syms_of_callproc (void)
{
#ifdef DOS_NT
- Qbuffer_file_type = intern ("buffer-file-type");
+ Qbuffer_file_type = intern_c_string ("buffer-file-type");
staticpro (&Qbuffer_file_type);
#endif /* DOS_NT */
@@ -1668,5 +1606,3 @@ See `setenv' and `getenv'. */);
defsubr (&Scall_process_region);
}
-/* arch-tag: 769b8045-1df7-4d2b-8968-e3fb49017f95
- (do not change this comment) */