Port better to POSIX hosts lacking _setjmp.
[bpt/emacs.git] / src / callproc.c
CommitLineData
80856e74 1/* Synchronous subprocess invocation for GNU Emacs.
acaf905b 2 Copyright (C) 1985-1988, 1993-1995, 1999-2012
19ed11ba 3 Free Software Foundation, Inc.
80856e74
JB
4
5This file is part of GNU Emacs.
6
9ec0b715 7GNU Emacs is free software: you can redistribute it and/or modify
80856e74 8it under the terms of the GNU General Public License as published by
9ec0b715
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
80856e74
JB
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9ec0b715 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
80856e74
JB
19
20
68c45bf0 21#include <config.h>
e576cab4 22#include <errno.h>
565620a5 23#include <stdio.h>
80856e74 24#include <sys/types.h>
3cbd6585 25#include <unistd.h>
3cbd6585 26
80856e74 27#include <sys/file.h>
80856e74 28#include <fcntl.h>
80856e74 29
0898ca10
JB
30#include "lisp.h"
31
bad95d8f
RS
32#ifdef WINDOWSNT
33#define NOMINMAX
34#include <windows.h>
489f9371 35#include "w32.h"
bad95d8f
RS
36#define _P_NOWAIT 1 /* from process.h */
37#endif
38
7e6c2178 39#ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
7e6c2178
RS
40#include <sys/stat.h>
41#include <sys/param.h>
7e6c2178
RS
42#endif /* MSDOS */
43
80856e74 44#include "commands.h"
91183bfd 45#include "character.h"
e5560ff7 46#include "buffer.h"
edf496dd 47#include "ccl.h"
32d08644 48#include "coding.h"
f0b950cf 49#include "composite.h"
57bda87a 50#include <epaths.h>
80856e74 51#include "process.h"
d177f194 52#include "syssignal.h"
a129418f 53#include "systty.h"
aba637ec 54#include "blockinput.h"
f105f403
KL
55#include "frame.h"
56#include "termhooks.h"
80856e74 57
5f027cea
EZ
58#ifdef MSDOS
59#include "msdos.h"
60#endif
61
d01ba2f1
GM
62#ifdef HAVE_NS
63#include "nsterm.h"
64#endif
65
f95c3f91 66#ifdef HAVE_SETPGID
58eb6cf0 67#if !defined (USG)
320695d8 68#undef setpgrp
f95c3f91
GM
69#define setpgrp setpgid
70#endif
2b7e8799 71#endif
f95c3f91 72
f92d51d8
CY
73/* Pattern used by call-process-region to make temp files. */
74static Lisp_Object Vtemp_file_name_pattern;
75
e0f24100 76/* True if we are about to fork off a synchronous process or if we
80856e74 77 are waiting for it. */
2f221583 78bool synch_process_alive;
80856e74
JB
79
80/* Nonzero => this is a string explaining death of synchronous subprocess. */
42ca4633 81const char *synch_process_death;
80856e74 82
6b61353c
KH
83/* Nonzero => this is the signal number that terminated the subprocess. */
84int synch_process_termsig;
85
80856e74
JB
86/* If synch_process_death is zero,
87 this is exit code of synchronous subprocess. */
88int synch_process_retcode;
f105f403 89
80856e74 90\f
37d54121
RS
91/* Clean up when exiting Fcall_process.
92 On MSDOS, delete the temporary file on any kind of termination.
93 On Unix, kill the process and any children on termination by signal. */
94
2f221583
PE
95/* True if this is termination due to exit. */
96static bool call_process_exited;
37d54121 97
d177f194 98static Lisp_Object
971de7fb 99call_process_kill (Lisp_Object fdpid)
d177f194 100{
d311d28c
PE
101 int fd;
102 pid_t pid;
103 CONS_TO_INTEGER (Fcar (fdpid), int, fd);
104 CONS_TO_INTEGER (Fcdr (fdpid), pid_t, pid);
105 emacs_close (fd);
106 EMACS_KILLPG (pid, SIGKILL);
d177f194
JB
107 synch_process_alive = 0;
108 return Qnil;
109}
110
7710357c 111static Lisp_Object
971de7fb 112call_process_cleanup (Lisp_Object arg)
80856e74 113{
ad3aaf33 114 Lisp_Object fdpid = Fcdr (arg);
d311d28c 115 int fd;
ad3aaf33
AS
116#if defined (MSDOS)
117 Lisp_Object file;
118#else
d311d28c 119 pid_t pid;
ad3aaf33
AS
120#endif
121
122 Fset_buffer (Fcar (arg));
d311d28c 123 CONS_TO_INTEGER (Fcar (fdpid), int, fd);
ad3aaf33 124
e39a993c 125#if defined (MSDOS)
7e6c2178 126 /* for MSDOS fdpid is really (fd . tempfile) */
c1350752 127 file = Fcdr (fdpid);
888c9e86
EZ
128 /* FD is -1 and FILE is "" when we didn't actually create a
129 temporary file in call-process. */
130 if (fd >= 0)
131 emacs_close (fd);
132 if (!(strcmp (SDATA (file), NULL_DEVICE) == 0 || SREF (file, 0) == '\0'))
d5db4077 133 unlink (SDATA (file));
e39a993c 134#else /* not MSDOS */
d311d28c 135 CONS_TO_INTEGER (Fcdr (fdpid), pid_t, pid);
d177f194 136
37d54121 137 if (call_process_exited)
6b6e798b 138 {
d311d28c 139 emacs_close (fd);
6b6e798b
RS
140 return Qnil;
141 }
37d54121 142
d177f194
JB
143 if (EMACS_KILLPG (pid, SIGINT) == 0)
144 {
d311d28c 145 ptrdiff_t count = SPECPDL_INDEX ();
d177f194
JB
146 record_unwind_protect (call_process_kill, fdpid);
147 message1 ("Waiting for process to die...(type C-g again to kill it instantly)");
148 immediate_quit = 1;
149 QUIT;
150 wait_for_termination (pid);
151 immediate_quit = 0;
152 specpdl_ptr = specpdl + count; /* Discard the unwind protect. */
153 message1 ("Waiting for process to die...done");
154 }
80856e74 155 synch_process_alive = 0;
d311d28c 156 emacs_close (fd);
7e6c2178 157#endif /* not MSDOS */
80856e74
JB
158 return Qnil;
159}
160
a7ca3326 161DEFUN ("call-process", Fcall_process, Scall_process, 1, MANY, 0,
fdb82f93
PJ
162 doc: /* Call PROGRAM synchronously in separate process.
163The remaining arguments are optional.
164The program's input comes from file INFILE (nil means `/dev/null').
1ef14cb4
LMI
165Insert output in BUFFER before point; t means current buffer; nil for BUFFER
166 means discard it; 0 means discard and don't wait; and `(:file FILE)', where
1b9f60cc
GM
167 FILE is a file name string, means that it should be written to that file
168 \(if the file already exists it is overwritten).
fdb82f93
PJ
169BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,
170REAL-BUFFER says what to do with standard output, as above,
171while STDERR-FILE says what to do with standard error in the child.
172STDERR-FILE may be nil (discard standard error output),
173t (mix it with ordinary output), or a file name string.
174
175Fourth arg DISPLAY non-nil means redisplay buffer as output is inserted.
176Remaining arguments are strings passed as command arguments to PROGRAM.
177
a4feb144
RS
178If executable PROGRAM can't be found as an executable, `call-process'
179signals a Lisp error. `call-process' reports errors in execution of
180the program only through its return and output.
181
fdb82f93
PJ
182If BUFFER is 0, `call-process' returns immediately with value nil.
183Otherwise it waits for PROGRAM to terminate
184and returns a numeric exit status or a signal description string.
d98b59b5
MB
185If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.
186
187usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
f66c7cf8 188 (ptrdiff_t nargs, Lisp_Object *args)
80856e74 189{
d311d28c 190 Lisp_Object infile, buffer, current_dir, path, cleanup_info_tail;
2f221583 191 bool display_p;
80856e74
JB
192 int fd[2];
193 int filefd;
4da256b1
KS
194#define CALLPROC_BUFFER_SIZE_MIN (16 * 1024)
195#define CALLPROC_BUFFER_SIZE_MAX (4 * CALLPROC_BUFFER_SIZE_MIN)
196 char buf[CALLPROC_BUFFER_SIZE_MAX];
197 int bufsize = CALLPROC_BUFFER_SIZE_MIN;
d311d28c
PE
198 ptrdiff_t count = SPECPDL_INDEX ();
199 USE_SAFE_ALLOCA;
2d607244 200
1aa83b22 201 register const unsigned char **new_argv;
39eaa782
RS
202 /* File to use for stderr in the child.
203 t means use same as standard output. */
204 Lisp_Object error_file;
1ef14cb4 205 Lisp_Object output_file = Qnil;
7e6c2178 206#ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
888c9e86 207 char *outf, *tempfile = NULL;
7e6c2178 208 int outfilefd;
d311d28c
PE
209 int pid;
210#else
211 pid_t pid;
80856e74 212#endif
1ef14cb4 213 int fd_output = -1;
32d08644
KH
214 struct coding_system process_coding; /* coding-system of process output */
215 struct coding_system argument_coding; /* coding-system of arguments */
09494912
RS
216 /* Set to the return value of Ffind_operation_coding_system. */
217 Lisp_Object coding_systems;
2f221583 218 bool output_to_buffer = 1;
09494912
RS
219
220 /* Qt denotes that Ffind_operation_coding_system is not yet called. */
221 coding_systems = Qt;
32d08644 222
b7826503 223 CHECK_STRING (args[0]);
80856e74 224
39eaa782
RS
225 error_file = Qt;
226
7e6c2178
RS
227#ifndef subprocesses
228 /* Without asynchronous processes we cannot have BUFFER == 0. */
177c0ea7 229 if (nargs >= 3
09ffb8b5 230 && (INTEGERP (CONSP (args[2]) ? XCAR (args[2]) : args[2])))
7e6c2178
RS
231 error ("Operating system cannot handle asynchronous subprocesses");
232#endif /* subprocesses */
233
09494912 234 /* Decide the coding-system for giving arguments. */
32d08644
KH
235 {
236 Lisp_Object val, *args2;
f66c7cf8 237 ptrdiff_t i;
32d08644
KH
238
239 /* If arguments are supplied, we may have to encode them. */
240 if (nargs >= 5)
241 {
2f221583 242 bool must_encode = 0;
6e50da0a 243 Lisp_Object coding_attrs;
30d57b8e 244
e7c1c20e 245 for (i = 4; i < nargs; i++)
b7826503 246 CHECK_STRING (args[i]);
e7c1c20e 247
a2286b5c 248 for (i = 4; i < nargs; i++)
30d57b8e
RS
249 if (STRING_MULTIBYTE (args[i]))
250 must_encode = 1;
251
beacaab3
KH
252 if (!NILP (Vcoding_system_for_write))
253 val = Vcoding_system_for_write;
30d57b8e 254 else if (! must_encode)
fcaf8878 255 val = Qraw_text;
beacaab3 256 else
32d08644 257 {
0065d054 258 SAFE_NALLOCA (args2, 1, nargs + 1);
32d08644
KH
259 args2[0] = Qcall_process;
260 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
08ee4e87 261 coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
fcaf8878 262 val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil;
32d08644 263 }
fcaf8878 264 val = complement_process_encoding_system (val);
32d08644 265 setup_coding_system (Fcheck_coding_system (val), &argument_coding);
6e50da0a
KH
266 coding_attrs = CODING_ID_ATTRS (argument_coding.id);
267 if (NILP (CODING_ATTR_ASCII_COMPAT (coding_attrs)))
268 {
269 /* We should not use an ASCII incompatible coding system. */
270 val = raw_text_coding_system (val);
271 setup_coding_system (val, &argument_coding);
272 }
32d08644 273 }
32d08644
KH
274 }
275
e576cab4
JB
276 if (nargs >= 2 && ! NILP (args[1]))
277 {
4b4deea2 278 infile = Fexpand_file_name (args[1], BVAR (current_buffer, directory));
b7826503 279 CHECK_STRING (infile);
e576cab4 280 }
80856e74 281 else
5437e9f9 282 infile = build_string (NULL_DEVICE);
80856e74 283
e576cab4
JB
284 if (nargs >= 3)
285 {
39eaa782
RS
286 buffer = args[2];
287
1ef14cb4
LMI
288 /* If BUFFER is a list, its meaning is (BUFFER-FOR-STDOUT
289 FILE-FOR-STDERR), unless the first element is :file, in which case see
290 the next paragraph. */
19ed11ba
AS
291 if (CONSP (buffer)
292 && (! SYMBOLP (XCAR (buffer))
293 || strcmp (SSDATA (SYMBOL_NAME (XCAR (buffer))), ":file")))
39eaa782 294 {
70949dac 295 if (CONSP (XCDR (buffer)))
45be8a1e 296 {
a9d4f28a 297 Lisp_Object stderr_file;
70949dac 298 stderr_file = XCAR (XCDR (buffer));
45be8a1e
RS
299
300 if (NILP (stderr_file) || EQ (Qt, stderr_file))
301 error_file = stderr_file;
302 else
303 error_file = Fexpand_file_name (stderr_file, Qnil);
304 }
305
70949dac 306 buffer = XCAR (buffer);
39eaa782 307 }
044512ed 308
1ef14cb4 309 /* If the buffer is (still) a list, it might be a (:file "file") spec. */
19ed11ba
AS
310 if (CONSP (buffer)
311 && SYMBOLP (XCAR (buffer))
312 && ! strcmp (SSDATA (SYMBOL_NAME (XCAR (buffer))), ":file"))
1ef14cb4
LMI
313 {
314 output_file = Fexpand_file_name (XCAR (XCDR (buffer)),
315 BVAR (current_buffer, directory));
316 CHECK_STRING (output_file);
317 buffer = Qnil;
318 }
319
39eaa782
RS
320 if (!(EQ (buffer, Qnil)
321 || EQ (buffer, Qt)
3ffde7d6 322 || INTEGERP (buffer)))
e576cab4 323 {
39eaa782
RS
324 Lisp_Object spec_buffer;
325 spec_buffer = buffer;
50fe359b 326 buffer = Fget_buffer_create (buffer);
39eaa782
RS
327 /* Mention the buffer name for a better error message. */
328 if (NILP (buffer))
b7826503
PJ
329 CHECK_BUFFER (spec_buffer);
330 CHECK_BUFFER (buffer);
e576cab4
JB
331 }
332 }
177c0ea7 333 else
e576cab4 334 buffer = Qnil;
80856e74 335
58616e67
JB
336 /* Make sure that the child will be able to chdir to the current
337 buffer's current directory, or its unhandled equivalent. We
338 can't just have the child check for an error when it does the
339 chdir, since it's in a vfork.
340
341 We have to GCPRO around this because Fexpand_file_name,
342 Funhandled_file_name_directory, and Ffile_accessible_directory_p
343 might call a file name handling function. The argument list is
344 protected by the caller, so all we really have to worry about is
345 buffer. */
346 {
1ef14cb4 347 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
58616e67 348
4b4deea2 349 current_dir = BVAR (current_buffer, directory);
58616e67 350
1ef14cb4 351 GCPRO5 (infile, buffer, current_dir, error_file, output_file);
58616e67 352
ca319910
SM
353 current_dir = Funhandled_file_name_directory (current_dir);
354 if (NILP (current_dir))
355 /* If the file name handler says that current_dir is unreachable, use
356 a sensible default. */
357 current_dir = build_string ("~/");
358 current_dir = expand_and_dir_to_file (current_dir, Qnil);
db8454b0
CY
359 current_dir = Ffile_name_as_directory (current_dir);
360
58616e67
JB
361 if (NILP (Ffile_accessible_directory_p (current_dir)))
362 report_file_error ("Setting current directory",
4b4deea2 363 Fcons (BVAR (current_buffer, directory), Qnil));
58616e67 364
34b87689
KH
365 if (STRING_MULTIBYTE (infile))
366 infile = ENCODE_FILE (infile);
367 if (STRING_MULTIBYTE (current_dir))
368 current_dir = ENCODE_FILE (current_dir);
369 if (STRINGP (error_file) && STRING_MULTIBYTE (error_file))
370 error_file = ENCODE_FILE (error_file);
1ef14cb4
LMI
371 if (STRINGP (output_file) && STRING_MULTIBYTE (output_file))
372 output_file = ENCODE_FILE (output_file);
58616e67
JB
373 UNGCPRO;
374 }
375
d311d28c 376 display_p = INTERACTIVE && nargs >= 4 && !NILP (args[3]);
80856e74 377
42a5b22f 378 filefd = emacs_open (SSDATA (infile), O_RDONLY, 0);
80856e74
JB
379 if (filefd < 0)
380 {
34b87689 381 infile = DECODE_FILE (infile);
e576cab4 382 report_file_error ("Opening process input file", Fcons (infile, Qnil));
80856e74 383 }
1ef14cb4
LMI
384
385 if (STRINGP (output_file))
386 {
387#ifdef DOS_NT
388 fd_output = emacs_open (SSDATA (output_file),
389 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
390 S_IREAD | S_IWRITE);
391#else /* not DOS_NT */
392 fd_output = creat (SSDATA (output_file), 0666);
393#endif /* not DOS_NT */
394 if (fd_output < 0)
395 {
396 output_file = DECODE_FILE (output_file);
397 report_file_error ("Opening process output file",
398 Fcons (output_file, Qnil));
19ed11ba 399 }
1ef14cb4 400 if (STRINGP (error_file) || NILP (error_file))
19ed11ba 401 output_to_buffer = 0;
1ef14cb4
LMI
402 }
403
80856e74 404 /* Search for program; barf if not found. */
c52b0b34 405 {
ad3aaf33 406 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
c52b0b34 407
ad3aaf33 408 GCPRO4 (infile, buffer, current_dir, error_file);
5c150961 409 openp (Vexec_path, args[0], Vexec_suffixes, &path, make_number (X_OK));
c52b0b34
KH
410 UNGCPRO;
411 }
012c6fcb 412 if (NILP (path))
80856e74 413 {
68c45bf0 414 emacs_close (filefd);
80856e74
JB
415 report_file_error ("Searching for program", Fcons (args[0], Qnil));
416 }
8ee8f447
RS
417
418 /* If program file name starts with /: for quoting a magic name,
419 discard that. */
420 if (SBYTES (path) > 2 && SREF (path, 0) == '/'
421 && SREF (path, 1) == ':')
422 path = Fsubstring (path, make_number (2), Qnil);
423
98c6f1e3 424 new_argv = SAFE_ALLOCA ((nargs > 4 ? nargs - 2 : 2) * sizeof *new_argv);
c364e618
KH
425 if (nargs > 4)
426 {
f66c7cf8 427 ptrdiff_t i;
ad3aaf33 428 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
c364e618 429
ad3aaf33 430 GCPRO5 (infile, buffer, current_dir, path, error_file);
c5bfa12b
KH
431 argument_coding.dst_multibyte = 0;
432 for (i = 4; i < nargs; i++)
c364e618 433 {
c5bfa12b
KH
434 argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]);
435 if (CODING_REQUIRE_ENCODING (&argument_coding))
91183bfd
KH
436 /* We must encode this argument. */
437 args[i] = encode_coding_string (&argument_coding, args[i], 1);
c364e618 438 }
c5bfa12b 439 UNGCPRO;
1aa83b22
AS
440 for (i = 4; i < nargs; i++)
441 new_argv[i - 3] = SDATA (args[i]);
442 new_argv[i - 3] = 0;
c364e618 443 }
db54baaa
KH
444 else
445 new_argv[1] = 0;
1aa83b22 446 new_argv[0] = SDATA (path);
80856e74 447
7e6c2178 448#ifdef MSDOS /* MW, July 1993 */
7e6c2178 449
888c9e86
EZ
450 /* If we're redirecting STDOUT to a file, that file is already open
451 on fd_output. */
1ef14cb4 452 if (fd_output < 0)
7e6c2178 453 {
888c9e86
EZ
454 if ((outf = egetenv ("TMPDIR")))
455 strcpy (tempfile = alloca (strlen (outf) + 20), outf);
456 else
457 {
458 tempfile = alloca (20);
459 *tempfile = '\0';
460 }
461 dostounix_filename (tempfile);
462 if (*tempfile == '\0' || tempfile[strlen (tempfile) - 1] != '/')
463 strcat (tempfile, "/");
464 strcat (tempfile, "detmp.XXX");
465 mktemp (tempfile);
1ef14cb4
LMI
466 outfilefd = creat (tempfile, S_IREAD | S_IWRITE);
467 if (outfilefd < 0) {
468 emacs_close (filefd);
469 report_file_error ("Opening process output file",
470 Fcons (build_string (tempfile), Qnil));
471 }
7e6c2178 472 }
1ef14cb4
LMI
473 else
474 outfilefd = fd_output;
6f89d28a 475 fd[0] = filefd;
2610078a 476 fd[1] = outfilefd;
6f89d28a 477#endif /* MSDOS */
7e6c2178 478
d50d3dc8 479 if (INTEGERP (buffer))
68c45bf0 480 fd[1] = emacs_open (NULL_DEVICE, O_WRONLY, 0), fd[0] = -1;
80856e74
JB
481 else
482 {
7e6c2178 483#ifndef MSDOS
db92b288
GM
484 errno = 0;
485 if (pipe (fd) == -1)
486 {
487 emacs_close (filefd);
488 report_file_error ("Creating process pipe", Qnil);
489 }
80856e74
JB
490#endif
491 }
492
493 {
494 /* child_setup must clobber environ in systems with true vfork.
495 Protect it from permanent change. */
496 register char **save_environ = environ;
497 register int fd1 = fd[1];
39eaa782 498 int fd_error = fd1;
c0ad4ea5
AS
499#ifdef HAVE_WORKING_VFORK
500 sigset_t procmask;
501 sigset_t blocked;
502 struct sigaction sigpipe_action;
503#endif
80856e74 504
1ef14cb4
LMI
505 if (fd_output >= 0)
506 fd1 = fd_output;
80856e74
JB
507
508 /* Record that we're about to create a synchronous process. */
509 synch_process_alive = 1;
510
5c03767e
RS
511 /* These vars record information from process termination.
512 Clear them now before process can possibly terminate,
513 to avoid timing error if process terminates soon. */
514 synch_process_death = 0;
515 synch_process_retcode = 0;
6b61353c 516 synch_process_termsig = 0;
5c03767e 517
39eaa782 518 if (NILP (error_file))
68c45bf0 519 fd_error = emacs_open (NULL_DEVICE, O_WRONLY, 0);
39eaa782
RS
520 else if (STRINGP (error_file))
521 {
522#ifdef DOS_NT
42a5b22f 523 fd_error = emacs_open (SSDATA (error_file),
68c45bf0
PE
524 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
525 S_IREAD | S_IWRITE);
39eaa782 526#else /* not DOS_NT */
42a5b22f 527 fd_error = creat (SSDATA (error_file), 0666);
39eaa782
RS
528#endif /* not DOS_NT */
529 }
530
531 if (fd_error < 0)
532 {
68c45bf0 533 emacs_close (filefd);
6f89d28a 534 if (fd[0] != filefd)
68c45bf0 535 emacs_close (fd[0]);
39eaa782 536 if (fd1 >= 0)
68c45bf0 537 emacs_close (fd1);
6f89d28a
MB
538#ifdef MSDOS
539 unlink (tempfile);
540#endif
34b87689
KH
541 if (NILP (error_file))
542 error_file = build_string (NULL_DEVICE);
543 else if (STRINGP (error_file))
544 error_file = DECODE_FILE (error_file);
545 report_file_error ("Cannot redirect stderr", Fcons (error_file, Qnil));
39eaa782 546 }
89e1ec1d 547
2610078a 548#ifdef MSDOS /* MW, July 1993 */
c17c4250 549 /* Note that on MSDOS `child_setup' actually returns the child process
2610078a
KH
550 exit status, not its PID, so we assign it to `synch_process_retcode'
551 below. */
c17c4250
EZ
552 pid = child_setup (filefd, outfilefd, fd_error, (char **) new_argv,
553 0, current_dir);
39eaa782 554
2610078a
KH
555 /* Record that the synchronous process exited and note its
556 termination status. */
557 synch_process_alive = 0;
558 synch_process_retcode = pid;
559 if (synch_process_retcode < 0) /* means it couldn't be exec'ed */
68c45bf0 560 {
ca9c0567 561 synchronize_system_messages_locale ();
68c45bf0
PE
562 synch_process_death = strerror (errno);
563 }
2610078a 564
68c45bf0 565 emacs_close (outfilefd);
2610078a 566 if (fd_error != outfilefd)
68c45bf0 567 emacs_close (fd_error);
2610078a 568 fd1 = -1; /* No harm in closing that one! */
888c9e86 569 if (tempfile)
2610078a 570 {
888c9e86
EZ
571 /* Since CRLF is converted to LF within `decode_coding', we
572 can always open a file with binary mode. */
573 fd[0] = emacs_open (tempfile, O_RDONLY | O_BINARY, 0);
574 if (fd[0] < 0)
575 {
576 unlink (tempfile);
577 emacs_close (filefd);
578 report_file_error ("Cannot re-open temporary file",
7285dc67 579 Fcons (build_string (tempfile), Qnil));
888c9e86 580 }
2610078a 581 }
888c9e86
EZ
582 else
583 fd[0] = -1; /* We are not going to read from tempfile. */
2610078a 584#else /* not MSDOS */
bad95d8f 585#ifdef WINDOWSNT
2d607244
RS
586 pid = child_setup (filefd, fd1, fd_error, (char **) new_argv,
587 0, current_dir);
bad95d8f 588#else /* not WINDOWSNT */
c0ad4ea5
AS
589
590#ifdef HAVE_WORKING_VFORK
591 /* On many hosts (e.g. Solaris 2.4), if a vforked child calls `signal',
592 this sets the parent's signal handlers as well as the child's.
593 So delay all interrupts whose handlers the child might munge,
594 and record the current handlers so they can be restored later. */
595 sigemptyset (&blocked);
596 sigaddset (&blocked, SIGPIPE);
597 sigaction (SIGPIPE, 0, &sigpipe_action);
123403e4 598 pthread_sigmask (SIG_BLOCK, &blocked, &procmask);
c0ad4ea5
AS
599#endif
600
aba637ec
KS
601 BLOCK_INPUT;
602
db6c0e74 603 /* vfork, and prevent local vars from being clobbered by the vfork. */
b08a63cc 604 {
c74e9d86
PE
605 Lisp_Object volatile buffer_volatile = buffer;
606 Lisp_Object volatile coding_systems_volatile = coding_systems;
607 Lisp_Object volatile current_dir_volatile = current_dir;
2f221583
PE
608 bool volatile display_p_volatile = display_p;
609 bool volatile output_to_buffer_volatile = output_to_buffer;
610 bool volatile sa_must_free_volatile = sa_must_free;
5266b4bb 611 int volatile fd1_volatile = fd1;
db6c0e74
PE
612 int volatile fd_error_volatile = fd_error;
613 int volatile fd_output_volatile = fd_output;
d311d28c 614 ptrdiff_t volatile sa_count_volatile = sa_count;
db6c0e74 615 unsigned char const **volatile new_argv_volatile = new_argv;
80856e74 616
db6c0e74 617 pid = vfork ();
80856e74 618
c74e9d86
PE
619 buffer = buffer_volatile;
620 coding_systems = coding_systems_volatile;
621 current_dir = current_dir_volatile;
d311d28c 622 display_p = display_p_volatile;
5266b4bb 623 fd1 = fd1_volatile;
db6c0e74
PE
624 fd_error = fd_error_volatile;
625 fd_output = fd_output_volatile;
626 output_to_buffer = output_to_buffer_volatile;
12b3abd5 627 sa_must_free = sa_must_free_volatile;
d311d28c 628 sa_count = sa_count_volatile;
db6c0e74
PE
629 new_argv = new_argv_volatile;
630 }
b9c7f648 631
80856e74
JB
632 if (pid == 0)
633 {
634 if (fd[0] >= 0)
68c45bf0 635 emacs_close (fd[0]);
1e7963c7 636#ifdef HAVE_SETSID
19ed11ba 637 setsid ();
1e7963c7 638#endif
58eb6cf0 639#if defined (USG)
19ed11ba 640 setpgrp ();
80856e74 641#else
19ed11ba 642 setpgrp (pid, pid);
80856e74 643#endif /* USG */
c0ad4ea5 644
2f9a22e2 645 /* GConf causes us to ignore SIGPIPE, make sure it is restored
c0ad4ea5 646 in the child. */
2f9b9adb 647 signal (SIGPIPE, SIG_DFL);
c0ad4ea5 648#ifdef HAVE_WORKING_VFORK
123403e4 649 pthread_sigmask (SIG_SETMASK, &procmask, 0);
c0ad4ea5
AS
650#endif
651
2d607244
RS
652 child_setup (filefd, fd1, fd_error, (char **) new_argv,
653 0, current_dir);
80856e74 654 }
aba637ec
KS
655
656 UNBLOCK_INPUT;
c0ad4ea5
AS
657
658#ifdef HAVE_WORKING_VFORK
659 /* Restore the signal state. */
660 sigaction (SIGPIPE, &sigpipe_action, 0);
123403e4 661 pthread_sigmask (SIG_SETMASK, &procmask, 0);
c0ad4ea5
AS
662#endif
663
bad95d8f 664#endif /* not WINDOWSNT */
cd5f8f60
RS
665
666 /* The MSDOS case did this already. */
667 if (fd_error >= 0)
68c45bf0 668 emacs_close (fd_error);
2610078a 669#endif /* not MSDOS */
80856e74 670
80856e74
JB
671 environ = save_environ;
672
6b6e798b
RS
673 /* Close most of our fd's, but not fd[0]
674 since we will use that to read input from. */
68c45bf0 675 emacs_close (filefd);
1ef14cb4
LMI
676 if (fd_output >= 0)
677 emacs_close (fd_output);
799abb26 678 if (fd1 >= 0 && fd1 != fd_error)
68c45bf0 679 emacs_close (fd1);
80856e74
JB
680 }
681
682 if (pid < 0)
683 {
6b6e798b 684 if (fd[0] >= 0)
68c45bf0 685 emacs_close (fd[0]);
80856e74
JB
686 report_file_error ("Doing vfork", Qnil);
687 }
688
d50d3dc8 689 if (INTEGERP (buffer))
80856e74 690 {
6b6e798b 691 if (fd[0] >= 0)
68c45bf0 692 emacs_close (fd[0]);
80856e74
JB
693 return Qnil;
694 }
695
6b6e798b 696 /* Enable sending signal if user quits below. */
37d54121
RS
697 call_process_exited = 0;
698
5e617bc2 699#if defined (MSDOS)
7e6c2178 700 /* MSDOS needs different cleanup information. */
d311d28c 701 cleanup_info_tail = build_string (tempfile ? tempfile : "");
7e6c2178 702#else
d311d28c
PE
703 cleanup_info_tail = INTEGER_TO_CONS (pid);
704#endif /* not MSDOS */
80856e74 705 record_unwind_protect (call_process_cleanup,
ad3aaf33 706 Fcons (Fcurrent_buffer (),
d311d28c
PE
707 Fcons (INTEGER_TO_CONS (fd[0]),
708 cleanup_info_tail)));
80856e74 709
d50d3dc8 710 if (BUFFERP (buffer))
80856e74
JB
711 Fset_buffer (buffer);
712
09494912
RS
713 if (NILP (buffer))
714 {
715 /* If BUFFER is nil, we must read process output once and then
716 discard it, so setup coding system but with nil. */
717 setup_coding_system (Qnil, &process_coding);
659afede 718 process_coding.dst_multibyte = 0;
09494912
RS
719 }
720 else
721 {
722 Lisp_Object val, *args2;
723
724 val = Qnil;
725 if (!NILP (Vcoding_system_for_read))
726 val = Vcoding_system_for_read;
727 else
728 {
729 if (EQ (coding_systems, Qt))
730 {
f66c7cf8 731 ptrdiff_t i;
09494912 732
0065d054 733 SAFE_NALLOCA (args2, 1, nargs + 1);
09494912
RS
734 args2[0] = Qcall_process;
735 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
736 coding_systems
737 = Ffind_operation_coding_system (nargs + 1, args2);
738 }
739 if (CONSP (coding_systems))
70949dac 740 val = XCAR (coding_systems);
09494912 741 else if (CONSP (Vdefault_process_coding_system))
70949dac 742 val = XCAR (Vdefault_process_coding_system);
09494912
RS
743 else
744 val = Qnil;
745 }
91183bfd 746 Fcheck_coding_system (val);
09494912
RS
747 /* In unibyte mode, character code conversion should not take
748 place but EOL conversion should. So, setup raw-text or one
749 of the subsidiary according to the information just setup. */
4b4deea2 750 if (NILP (BVAR (current_buffer, enable_multibyte_characters))
09494912 751 && !NILP (val))
91183bfd
KH
752 val = raw_text_coding_system (val);
753 setup_coding_system (val, &process_coding);
659afede
KH
754 process_coding.dst_multibyte
755 = ! NILP (BVAR (current_buffer, enable_multibyte_characters));
09494912 756 }
a0241d01 757 process_coding.src_multibyte = 0;
09494912 758
80856e74
JB
759 immediate_quit = 1;
760 QUIT;
761
1ef14cb4 762 if (output_to_buffer)
19ed11ba 763 {
2f221583
PE
764 int nread;
765 bool first = 1;
19ed11ba
AS
766 EMACS_INT total_read = 0;
767 int carryover = 0;
2f221583 768 bool display_on_the_fly = display_p;
19ed11ba
AS
769 struct coding_system saved_coding;
770
771 saved_coding = process_coding;
772 while (1)
773 {
774 /* Repeatedly read until we've filled as much as possible
775 of the buffer size we have. But don't read
776 less than 1024--save that for the next bufferful. */
777 nread = carryover;
778 while (nread < bufsize - 1024)
779 {
780 int this_read = emacs_read (fd[0], buf + nread,
781 bufsize - nread);
60558b19 782
19ed11ba
AS
783 if (this_read < 0)
784 goto give_up;
60558b19 785
19ed11ba
AS
786 if (this_read == 0)
787 {
788 process_coding.mode |= CODING_MODE_LAST_BLOCK;
789 break;
790 }
60558b19 791
19ed11ba
AS
792 nread += this_read;
793 total_read += this_read;
60558b19 794
19ed11ba
AS
795 if (display_on_the_fly)
796 break;
797 }
60558b19 798
19ed11ba
AS
799 /* Now NREAD is the total amount of data in the buffer. */
800 immediate_quit = 0;
177c0ea7 801
19ed11ba
AS
802 if (!NILP (buffer))
803 {
804 if (NILP (BVAR (current_buffer, enable_multibyte_characters))
805 && ! CODING_MAY_REQUIRE_DECODING (&process_coding))
806 insert_1_both (buf, nread, nread, 0, 1, 0);
807 else
808 { /* We have to decode the input. */
809 Lisp_Object curbuf;
d311d28c 810 ptrdiff_t count1 = SPECPDL_INDEX ();
19ed11ba
AS
811
812 XSETBUFFER (curbuf, current_buffer);
813 /* We cannot allow after-change-functions be run
814 during decoding, because that might modify the
815 buffer, while we rely on process_coding.produced to
816 faithfully reflect inserted text until we
817 TEMP_SET_PT_BOTH below. */
818 specbind (Qinhibit_modification_hooks, Qt);
819 decode_coding_c_string (&process_coding,
820 (unsigned char *) buf, nread, curbuf);
821 unbind_to (count1, Qnil);
822 if (display_on_the_fly
823 && CODING_REQUIRE_DETECTION (&saved_coding)
824 && ! CODING_REQUIRE_DETECTION (&process_coding))
825 {
826 /* We have detected some coding system. But,
827 there's a possibility that the detection was
828 done by insufficient data. So, we give up
829 displaying on the fly. */
830 if (process_coding.produced > 0)
831 del_range_2 (process_coding.dst_pos,
832 process_coding.dst_pos_byte,
833 process_coding.dst_pos
834 + process_coding.produced_char,
835 process_coding.dst_pos_byte
836 + process_coding.produced, 0);
837 display_on_the_fly = 0;
838 process_coding = saved_coding;
839 carryover = nread;
840 /* This is to make the above condition always
841 fails in the future. */
842 saved_coding.common_flags
843 &= ~CODING_REQUIRE_DETECTION_MASK;
844 continue;
845 }
846
847 TEMP_SET_PT_BOTH (PT + process_coding.produced_char,
848 PT_BYTE + process_coding.produced);
849 carryover = process_coding.carryover_bytes;
850 if (carryover > 0)
851 memcpy (buf, process_coding.carryover,
852 process_coding.carryover_bytes);
853 }
854 }
c5bfa12b 855
19ed11ba
AS
856 if (process_coding.mode & CODING_MODE_LAST_BLOCK)
857 break;
6e3bfbb2 858
19ed11ba
AS
859 /* Make the buffer bigger as we continue to read more data,
860 but not past CALLPROC_BUFFER_SIZE_MAX. */
861 if (bufsize < CALLPROC_BUFFER_SIZE_MAX && total_read > 32 * bufsize)
862 if ((bufsize *= 2) > CALLPROC_BUFFER_SIZE_MAX)
863 bufsize = CALLPROC_BUFFER_SIZE_MAX;
6e3bfbb2 864
19ed11ba
AS
865 if (display_p)
866 {
867 if (first)
868 prepare_menu_bars ();
869 first = 0;
870 redisplay_preserve_echo_area (1);
871 /* This variable might have been set to 0 for code
872 detection. In that case, we set it back to 1 because
873 we should have already detected a coding system. */
874 display_on_the_fly = 1;
875 }
876 immediate_quit = 1;
877 QUIT;
878 }
879 give_up: ;
880
881 Vlast_coding_system_used = CODING_ID_NAME (process_coding.id);
882 /* If the caller required, let the buffer inherit the
883 coding-system used to decode the process output. */
884 if (inherit_process_coding_system)
885 call1 (intern ("after-insert-file-set-buffer-file-coding-system"),
886 make_number (total_read));
887 }
3b440bb5 888
77defa9a 889#ifndef MSDOS
80856e74 890 /* Wait for it to terminate, unless it already has. */
1ef14cb4
LMI
891 if (output_to_buffer)
892 wait_for_termination (pid);
893 else
894 interruptible_wait_for_termination (pid);
77defa9a 895#endif
80856e74
JB
896
897 immediate_quit = 0;
898
37d54121
RS
899 /* Don't kill any children that the subprocess may have left behind
900 when exiting. */
901 call_process_exited = 1;
902
3c59b4c9 903 SAFE_FREE ();
80856e74
JB
904 unbind_to (count, Qnil);
905
6b61353c
KH
906 if (synch_process_termsig)
907 {
42ca4633 908 const char *signame;
6b61353c
KH
909
910 synchronize_system_messages_locale ();
911 signame = strsignal (synch_process_termsig);
912
913 if (signame == 0)
19ed11ba 914 signame = "unknown";
6b61353c
KH
915
916 synch_process_death = signame;
917 }
918
80856e74 919 if (synch_process_death)
68c45bf0
PE
920 return code_convert_string_norecord (build_string (synch_process_death),
921 Vlocale_coding_system, 0);
80856e74
JB
922 return make_number (synch_process_retcode);
923}
80856e74 924\f
9fefd2ba 925static Lisp_Object
971de7fb 926delete_temp_file (Lisp_Object name)
80856e74 927{
1a271e14 928 /* Suppress jka-compr handling, etc. */
d311d28c 929 ptrdiff_t count = SPECPDL_INDEX ();
1a271e14 930 specbind (intern ("file-name-handler-alist"), Qnil);
f1a5d776 931 internal_delete_file (name);
1a271e14 932 unbind_to (count, Qnil);
320695d8 933 return Qnil;
80856e74
JB
934}
935
936DEFUN ("call-process-region", Fcall_process_region, Scall_process_region,
fdb82f93
PJ
937 3, MANY, 0,
938 doc: /* Send text from START to END to a synchronous process running PROGRAM.
939The remaining arguments are optional.
940Delete the text if fourth arg DELETE is non-nil.
941
1ef14cb4
LMI
942Insert output in BUFFER before point; t means current buffer; nil for
943 BUFFER means discard it; 0 means discard and don't wait; and `(:file
944 FILE)', where FILE is a file name string, means that it should be
1b9f60cc 945 written to that file (if the file already exists it is overwritten).
fdb82f93
PJ
946BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,
947REAL-BUFFER says what to do with standard output, as above,
948while STDERR-FILE says what to do with standard error in the child.
949STDERR-FILE may be nil (discard standard error output),
950t (mix it with ordinary output), or a file name string.
951
952Sixth arg DISPLAY non-nil means redisplay buffer as output is inserted.
953Remaining args are passed to PROGRAM at startup as command args.
954
ba9a5174 955If BUFFER is 0, `call-process-region' returns immediately with value nil.
fdb82f93
PJ
956Otherwise it waits for PROGRAM to terminate
957and returns a numeric exit status or a signal description string.
d98b59b5
MB
958If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.
959
960usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &rest ARGS) */)
f66c7cf8 961 (ptrdiff_t nargs, Lisp_Object *args)
80856e74 962{
39323a7e
KH
963 struct gcpro gcpro1;
964 Lisp_Object filename_string;
965 register Lisp_Object start, end;
d311d28c 966 ptrdiff_t count = SPECPDL_INDEX ();
08ee4e87 967 /* Qt denotes we have not yet called Ffind_operation_coding_system. */
09494912 968 Lisp_Object coding_systems;
32d08644 969 Lisp_Object val, *args2;
f66c7cf8 970 ptrdiff_t i;
98c6f1e3 971 Lisp_Object tmpdir;
7e6c2178 972
f92d51d8
CY
973 if (STRINGP (Vtemporary_file_directory))
974 tmpdir = Vtemporary_file_directory;
7e6c2178
RS
975 else
976 {
f92d51d8
CY
977#ifndef DOS_NT
978 if (getenv ("TMPDIR"))
979 tmpdir = build_string (getenv ("TMPDIR"));
980 else
981 tmpdir = build_string ("/tmp/");
982#else /* DOS_NT */
983 char *outf;
984 if ((outf = egetenv ("TMPDIR"))
985 || (outf = egetenv ("TMP"))
986 || (outf = egetenv ("TEMP")))
987 tmpdir = build_string (outf);
988 else
989 tmpdir = Ffile_name_as_directory (build_string ("c:/temp"));
0774fcf8 990#endif
f92d51d8 991 }
7e6c2178 992
3c59b4c9
PE
993 {
994 USE_SAFE_ALLOCA;
98c6f1e3
PE
995 Lisp_Object pattern = Fexpand_file_name (Vtemp_file_name_pattern, tmpdir);
996 char *tempfile = SAFE_ALLOCA (SBYTES (pattern) + 1);
3c59b4c9
PE
997 memcpy (tempfile, SDATA (pattern), SBYTES (pattern) + 1);
998 coding_systems = Qt;
09494912 999
1ddc85a4 1000#ifdef HAVE_MKSTEMP
3c59b4c9
PE
1001 {
1002 int fd;
1003
1004 BLOCK_INPUT;
1005 fd = mkstemp (tempfile);
1006 UNBLOCK_INPUT;
1007 if (fd == -1)
1008 report_file_error ("Failed to open temporary file",
baac5bc7 1009 Fcons (build_string (tempfile), Qnil));
3c59b4c9
PE
1010 else
1011 close (fd);
1012 }
1ddc85a4 1013#else
3c59b4c9 1014 mktemp (tempfile);
1ddc85a4 1015#endif
80856e74 1016
3c59b4c9
PE
1017 filename_string = build_string (tempfile);
1018 GCPRO1 (filename_string);
1019 SAFE_FREE ();
1020 }
1021
80856e74
JB
1022 start = args[0];
1023 end = args[1];
32d08644 1024 /* Decide coding-system of the contents of the temporary file. */
91489411
RS
1025 if (!NILP (Vcoding_system_for_write))
1026 val = Vcoding_system_for_write;
4b4deea2 1027 else if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
fcaf8878 1028 val = Qraw_text;
32d08644 1029 else
beacaab3 1030 {
3c59b4c9 1031 USE_SAFE_ALLOCA;
0065d054 1032 SAFE_NALLOCA (args2, 1, nargs + 1);
91489411
RS
1033 args2[0] = Qcall_process_region;
1034 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
1035 coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
fcaf8878 1036 val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil;
3c59b4c9 1037 SAFE_FREE ();
beacaab3 1038 }
fcaf8878 1039 val = complement_process_encoding_system (val);
32d08644 1040
168afdaa 1041 {
d311d28c 1042 ptrdiff_t count1 = SPECPDL_INDEX ();
168afdaa
RS
1043
1044 specbind (intern ("coding-system-for-write"), val);
bb951f0e
KR
1045 /* POSIX lets mk[s]temp use "."; don't invoke jka-compr if we
1046 happen to get a ".Z" suffix. */
1047 specbind (intern ("file-name-handler-alist"), Qnil);
168afdaa
RS
1048 Fwrite_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil);
1049
1050 unbind_to (count1, Qnil);
1051 }
91489411 1052
177c0ea7 1053 /* Note that Fcall_process takes care of binding
91489411 1054 coding-system-for-read. */
093650fe 1055
80856e74
JB
1056 record_unwind_protect (delete_temp_file, filename_string);
1057
edf496dd 1058 if (nargs > 3 && !NILP (args[3]))
80856e74
JB
1059 Fdelete_region (start, end);
1060
edf496dd
KH
1061 if (nargs > 3)
1062 {
1063 args += 2;
1064 nargs -= 2;
1065 }
1066 else
1067 {
1068 args[0] = args[2];
1069 nargs = 2;
1070 }
1071 args[1] = filename_string;
80856e74 1072
edf496dd 1073 RETURN_UNGCPRO (unbind_to (count, Fcall_process (nargs, args)));
80856e74
JB
1074}
1075\f
361358ea 1076#ifndef WINDOWSNT
971de7fb 1077static int relocate_fd (int fd, int minfd);
361358ea 1078#endif
dfcf069d 1079
5990851d
KL
1080static char **
1081add_env (char **env, char **new_env, char *string)
1082{
1083 char **ep;
2f221583 1084 bool ok = 1;
5990851d
KL
1085 if (string == NULL)
1086 return new_env;
1087
1088 /* See if this string duplicates any string already in the env.
1089 If so, don't put it in.
1090 When an env var has multiple definitions,
1091 we keep the definition that comes first in process-environment. */
1092 for (ep = env; ok && ep != new_env; ep++)
1093 {
1094 char *p = *ep, *q = string;
1095 while (ok)
19ed11ba
AS
1096 {
1097 if (*q != *p)
1098 break;
1099 if (*q == 0)
1100 /* The string is a lone variable name; keep it for now, we
1101 will remove it later. It is a placeholder for a
1102 variable that is not to be included in the environment. */
1103 break;
1104 if (*q == '=')
1105 ok = 0;
1106 p++, q++;
1107 }
5990851d
KL
1108 }
1109 if (ok)
1110 *new_env++ = string;
1111 return new_env;
1112}
1113
80856e74
JB
1114/* This is the last thing run in a newly forked inferior
1115 either synchronous or asynchronous.
1116 Copy descriptors IN, OUT and ERR as descriptors 0, 1 and 2.
1117 Initialize inferior's priority, pgrp, connected dir and environment.
1118 then exec another program based on new_argv.
1119
1120 This function may change environ for the superior process.
1121 Therefore, the superior process must save and restore the value
1122 of environ around the vfork and the call to this function.
1123
2f221583 1124 If SET_PGRP, put the subprocess into a separate process group.
e576cab4
JB
1125
1126 CURRENT_DIR is an elisp string giving the path of the current
1127 directory the subprocess should have. Since we can't really signal
1128 a decent error from within the child, this should be verified as an
1129 executable directory by the parent. */
80856e74 1130
dfcf069d 1131int
2f221583
PE
1132child_setup (int in, int out, int err, char **new_argv, bool set_pgrp,
1133 Lisp_Object current_dir)
80856e74 1134{
e576cab4 1135 char **env;
7fcf7f05 1136 char *pwd_var;
bad95d8f
RS
1137#ifdef WINDOWSNT
1138 int cpid;
4252a4bd 1139 HANDLE handles[3];
bad95d8f 1140#endif /* WINDOWSNT */
e576cab4 1141
d311d28c 1142 pid_t pid = getpid ();
80856e74 1143
80856e74
JB
1144 /* Close Emacs's descriptors that this process should not have. */
1145 close_process_descs ();
ded80a25 1146
c17c4250
EZ
1147 /* DOS_NT isn't in a vfork, so if we are in the middle of load-file,
1148 we will lose if we call close_load_descs here. */
1149#ifndef DOS_NT
4458cebe 1150 close_load_descs ();
c17c4250 1151#endif
80856e74
JB
1152
1153 /* Note that use of alloca is always safe here. It's obvious for systems
1154 that do not have true vfork or that have true (stack) alloca.
caa01fe0
GM
1155 If using vfork and C_ALLOCA (when Emacs used to include
1156 src/alloca.c) it is safe because that changes the superior's
1157 static variables as if the superior had done alloca and will be
1158 cleaned up in the usual way. */
e576cab4 1159 {
7fcf7f05 1160 register char *temp;
0065d054 1161 size_t i; /* size_t, because ptrdiff_t might overflow here! */
77d78be1 1162
d5db4077 1163 i = SBYTES (current_dir);
16425c4a
EZ
1164#ifdef MSDOS
1165 /* MSDOS must have all environment variables malloc'ed, because
1166 low-level libc functions that launch subsidiary processes rely
1167 on that. */
23f86fce 1168 pwd_var = xmalloc (i + 6);
16425c4a 1169#else
38182d90 1170 pwd_var = alloca (i + 6);
16425c4a 1171#endif
7fcf7f05 1172 temp = pwd_var + 4;
72af86bd
AS
1173 memcpy (pwd_var, "PWD=", 4);
1174 memcpy (temp, SDATA (current_dir), i);
bad95d8f 1175 if (!IS_DIRECTORY_SEP (temp[i - 1])) temp[i++] = DIRECTORY_SEP;
e576cab4
JB
1176 temp[i] = 0;
1177
c17c4250 1178#ifndef DOS_NT
e576cab4
JB
1179 /* We can't signal an Elisp error here; we're in a vfork. Since
1180 the callers check the current directory before forking, this
1181 should only return an error if the directory's permissions
1182 are changed between the check and this chdir, but we should
1183 at least check. */
1184 if (chdir (temp) < 0)
20b25e46 1185 _exit (errno);
f8d23104 1186#else /* DOS_NT */
c17c4250
EZ
1187 /* Get past the drive letter, so that d:/ is left alone. */
1188 if (i > 2 && IS_DEVICE_SEP (temp[1]) && IS_DIRECTORY_SEP (temp[2]))
1189 {
1190 temp += 2;
1191 i -= 2;
1192 }
f8d23104 1193#endif /* DOS_NT */
c17c4250 1194
7fcf7f05 1195 /* Strip trailing slashes for PWD, but leave "/" and "//" alone. */
bad95d8f 1196 while (i > 2 && IS_DIRECTORY_SEP (temp[i - 1]))
7fcf7f05 1197 temp[--i] = 0;
e576cab4 1198 }
80856e74 1199
5990851d 1200 /* Set `env' to a vector of the strings in the environment. */
80856e74
JB
1201 {
1202 register Lisp_Object tem;
1203 register char **new_env;
5990851d 1204 char **p, **q;
80856e74 1205 register int new_length;
d2bb6598 1206 Lisp_Object display = Qnil;
361358ea 1207
80856e74 1208 new_length = 0;
f105f403 1209
80856e74 1210 for (tem = Vprocess_environment;
19ed11ba
AS
1211 CONSP (tem) && STRINGP (XCAR (tem));
1212 tem = XCDR (tem))
d2bb6598 1213 {
42a5b22f 1214 if (strncmp (SSDATA (XCAR (tem)), "DISPLAY", 7) == 0
d2bb6598
SM
1215 && (SDATA (XCAR (tem)) [7] == '\0'
1216 || SDATA (XCAR (tem)) [7] == '='))
1217 /* DISPLAY is specified in process-environment. */
1218 display = Qt;
1219 new_length++;
1220 }
de87fb59 1221
d2bb6598
SM
1222 /* If not provided yet, use the frame's DISPLAY. */
1223 if (NILP (display))
1224 {
1225 Lisp_Object tmp = Fframe_parameter (selected_frame, Qdisplay);
1226 if (!STRINGP (tmp) && CONSP (Vinitial_environment))
1227 /* If still not found, Look for DISPLAY in Vinitial_environment. */
1228 tmp = Fgetenv_internal (build_string ("DISPLAY"),
1229 Vinitial_environment);
1230 if (STRINGP (tmp))
1231 {
1232 display = tmp;
1233 new_length++;
1234 }
1235 }
80856e74 1236
7fcf7f05 1237 /* new_length + 2 to include PWD and terminating 0. */
38182d90 1238 env = new_env = alloca ((new_length + 2) * sizeof *env);
7fcf7f05
RS
1239 /* If we have a PWD envvar, pass one down,
1240 but with corrected value. */
a13f8f50 1241 if (egetenv ("PWD"))
7fcf7f05 1242 *new_env++ = pwd_var;
361358ea 1243
6b8e474c 1244 if (STRINGP (display))
de87fb59 1245 {
38182d90 1246 char *vdata = alloca (sizeof "DISPLAY=" + SBYTES (display));
de87fb59 1247 strcpy (vdata, "DISPLAY=");
42a5b22f 1248 strcat (vdata, SSDATA (display));
de87fb59
DN
1249 new_env = add_env (env, new_env, vdata);
1250 }
80856e74 1251
5990851d 1252 /* Overrides. */
80856e74 1253 for (tem = Vprocess_environment;
70949dac
KR
1254 CONSP (tem) && STRINGP (XCAR (tem));
1255 tem = XCDR (tem))
42a5b22f 1256 new_env = add_env (env, new_env, SSDATA (XCAR (tem)));
d2bb6598 1257
5990851d
KL
1258 *new_env = 0;
1259
1260 /* Remove variable names without values. */
1261 p = q = env;
1262 while (*p != 0)
cd9565ba 1263 {
19ed11ba
AS
1264 while (*q != 0 && strchr (*q, '=') == NULL)
1265 q++;
1266 *p = *q++;
1267 if (*p != 0)
1268 p++;
cd9565ba 1269 }
80856e74 1270 }
de87fb59 1271
361358ea 1272
bad95d8f
RS
1273#ifdef WINDOWSNT
1274 prepare_standard_handles (in, out, err, handles);
d5db4077 1275 set_process_dir (SDATA (current_dir));
67802943
DN
1276 /* Spawn the child. (See ntproc.c:Spawnve). */
1277 cpid = spawnve (_P_NOWAIT, new_argv[0], new_argv, env);
1278 reset_standard_handles (in, out, err, handles);
1279 if (cpid == -1)
1280 /* An error occurred while trying to spawn the process. */
1281 report_file_error ("Spawning child process", Qnil);
1282 return cpid;
1283
bad95d8f 1284#else /* not WINDOWSNT */
426b37ae
JB
1285 /* Make sure that in, out, and err are not actually already in
1286 descriptors zero, one, or two; this could happen if Emacs is
7e6c2178 1287 started with its standard in, out, or error closed, as might
426b37ae 1288 happen under X. */
f29f9e4a
RS
1289 {
1290 int oin = in, oout = out;
1291
1292 /* We have to avoid relocating the same descriptor twice! */
1293
1294 in = relocate_fd (in, 3);
1295
1296 if (out == oin)
1297 out = in;
1298 else
3e9367e7 1299 out = relocate_fd (out, 3);
f29f9e4a
RS
1300
1301 if (err == oin)
1302 err = in;
1303 else if (err == oout)
1304 err = out;
1305 else
3e9367e7 1306 err = relocate_fd (err, 3);
f29f9e4a 1307 }
426b37ae 1308
c17c4250 1309#ifndef MSDOS
68c45bf0
PE
1310 emacs_close (0);
1311 emacs_close (1);
1312 emacs_close (2);
80856e74
JB
1313
1314 dup2 (in, 0);
1315 dup2 (out, 1);
1316 dup2 (err, 2);
68c45bf0 1317 emacs_close (in);
ce8f5a9a
AS
1318 if (out != in)
1319 emacs_close (out);
1320 if (err != in && err != out)
1321 emacs_close (err);
80856e74 1322
5e617bc2 1323#if defined (USG)
fdba8590 1324#ifndef SETPGRP_RELEASES_CTTY
e576cab4 1325 setpgrp (); /* No arguments but equivalent in this case */
fdba8590 1326#endif
67802943 1327#else /* not USG */
e576cab4 1328 setpgrp (pid, pid);
67802943 1329#endif /* not USG */
80856e74 1330
a7ebc409 1331 /* setpgrp_of_tty is incorrect here; it uses input_fd. */
12e610e8 1332 tcsetpgrp (0, pid);
a7ebc409 1333
80856e74
JB
1334 /* execvp does not accept an environment arg so the only way
1335 to pass this environment is to set environ. Our caller
1336 is responsible for restoring the ambient value of environ. */
1337 environ = env;
1338 execvp (new_argv[0], new_argv);
1339
68c45bf0
PE
1340 emacs_write (1, "Can't exec program: ", 20);
1341 emacs_write (1, new_argv[0], strlen (new_argv[0]));
1342 emacs_write (1, "\n", 1);
80856e74 1343 _exit (1);
67802943
DN
1344
1345#else /* MSDOS */
1346 pid = run_msdos_command (new_argv, pwd_var + 4, in, out, err, env);
1347 xfree (pwd_var);
1348 if (pid == -1)
1349 /* An error occurred while trying to run the subprocess. */
1350 report_file_error ("Spawning child process", Qnil);
1351 return pid;
1352#endif /* MSDOS */
ae76d9e1 1353#endif /* not WINDOWSNT */
80856e74
JB
1354}
1355
361358ea 1356#ifndef WINDOWSNT
a3833dfe 1357/* Move the file descriptor FD so that its number is not less than MINFD.
426b37ae 1358 If the file descriptor is moved at all, the original is freed. */
dfcf069d 1359static int
971de7fb 1360relocate_fd (int fd, int minfd)
426b37ae 1361{
a3833dfe 1362 if (fd >= minfd)
426b37ae
JB
1363 return fd;
1364 else
1365 {
cf237e27
AS
1366 int new;
1367#ifdef F_DUPFD
1368 new = fcntl (fd, F_DUPFD, minfd);
1369#else
1370 new = dup (fd);
1371 if (new != -1)
1372 /* Note that we hold the original FD open while we recurse,
1373 to guarantee we'll get a new FD if we need it. */
1374 new = relocate_fd (new, minfd);
1375#endif
426b37ae
JB
1376 if (new == -1)
1377 {
cb1d0ef7 1378 const char *message_1 = "Error while setting up child: ";
a8fe7202 1379 const char *errmessage = strerror (errno);
cb1d0ef7
PE
1380 const char *message_2 = "\n";
1381 emacs_write (2, message_1, strlen (message_1));
68c45bf0 1382 emacs_write (2, errmessage, strlen (errmessage));
cb1d0ef7 1383 emacs_write (2, message_2, strlen (message_2));
426b37ae
JB
1384 _exit (1);
1385 }
68c45bf0 1386 emacs_close (fd);
426b37ae
JB
1387 return new;
1388 }
1389}
361358ea 1390#endif /* not WINDOWSNT */
426b37ae 1391
2f221583 1392static bool
989f33ba
PE
1393getenv_internal_1 (const char *var, ptrdiff_t varlen, char **value,
1394 ptrdiff_t *valuelen, Lisp_Object env)
012c6fcb 1395{
db699fc6 1396 for (; CONSP (env); env = XCDR (env))
012c6fcb 1397 {
db699fc6 1398 Lisp_Object entry = XCAR (env);
d50d3dc8 1399 if (STRINGP (entry)
db699fc6 1400 && SBYTES (entry) >= varlen
bad95d8f
RS
1401#ifdef WINDOWSNT
1402 /* NT environment variables are case insensitive. */
d5db4077 1403 && ! strnicmp (SDATA (entry), var, varlen)
bad95d8f 1404#else /* not WINDOWSNT */
72af86bd 1405 && ! memcmp (SDATA (entry), var, varlen)
bad95d8f 1406#endif /* not WINDOWSNT */
a9971c6d 1407 )
012c6fcb 1408 {
db699fc6
SM
1409 if (SBYTES (entry) > varlen && SREF (entry, varlen) == '=')
1410 {
51b59d79 1411 *value = SSDATA (entry) + (varlen + 1);
db699fc6
SM
1412 *valuelen = SBYTES (entry) - (varlen + 1);
1413 return 1;
1414 }
1415 else if (SBYTES (entry) == varlen)
1416 {
1417 /* Lone variable names in Vprocess_environment mean that
1418 variable should be removed from the environment. */
1419 *value = NULL;
1420 return 1;
1421 }
1422 }
1423 }
1424 return 0;
1425}
1426
2f221583 1427static bool
989f33ba
PE
1428getenv_internal (const char *var, ptrdiff_t varlen, char **value,
1429 ptrdiff_t *valuelen, Lisp_Object frame)
012c6fcb 1430{
d2bb6598
SM
1431 /* Try to find VAR in Vprocess_environment first. */
1432 if (getenv_internal_1 (var, varlen, value, valuelen,
1433 Vprocess_environment))
1434 return *value ? 1 : 0;
f105f403 1435
d2bb6598 1436 /* For DISPLAY try to get the values from the frame or the initial env. */
de87fb59 1437 if (strcmp (var, "DISPLAY") == 0)
d2bb6598
SM
1438 {
1439 Lisp_Object display
1440 = Fframe_parameter (NILP (frame) ? selected_frame : frame, Qdisplay);
1441 if (STRINGP (display))
1442 {
51b59d79 1443 *value = SSDATA (display);
de87fb59 1444 *valuelen = SBYTES (display);
012c6fcb
JA
1445 return 1;
1446 }
d2bb6598
SM
1447 /* If still not found, Look for DISPLAY in Vinitial_environment. */
1448 if (getenv_internal_1 (var, varlen, value, valuelen,
1449 Vinitial_environment))
1450 return *value ? 1 : 0;
012c6fcb
JA
1451 }
1452
1453 return 0;
1454}
1455
f105f403 1456DEFUN ("getenv-internal", Fgetenv_internal, Sgetenv_internal, 1, 2, 0,
5990851d
KL
1457 doc: /* Get the value of environment variable VARIABLE.
1458VARIABLE should be a string. Value is nil if VARIABLE is undefined in
1459the environment. Otherwise, value is a string.
f105f403 1460
acf20901 1461This function searches `process-environment' for VARIABLE.
5990851d 1462
db699fc6 1463If optional parameter ENV is a list, then search this list instead of
acf20901
JB
1464`process-environment', and return t when encountering a negative entry
1465\(an entry for a variable with no value). */)
5842a27b 1466 (Lisp_Object variable, Lisp_Object env)
012c6fcb
JA
1467{
1468 char *value;
989f33ba 1469 ptrdiff_t valuelen;
012c6fcb 1470
5990851d 1471 CHECK_STRING (variable);
db699fc6
SM
1472 if (CONSP (env))
1473 {
42a5b22f 1474 if (getenv_internal_1 (SSDATA (variable), SBYTES (variable),
db699fc6
SM
1475 &value, &valuelen, env))
1476 return value ? make_string (value, valuelen) : Qt;
1477 else
1478 return Qnil;
1479 }
42a5b22f 1480 else if (getenv_internal (SSDATA (variable), SBYTES (variable),
d2bb6598 1481 &value, &valuelen, env))
012c6fcb
JA
1482 return make_string (value, valuelen);
1483 else
1484 return Qnil;
1485}
1486
5990851d
KL
1487/* A version of getenv that consults the Lisp environment lists,
1488 easily callable from C. */
012c6fcb 1489char *
a8fe7202 1490egetenv (const char *var)
012c6fcb
JA
1491{
1492 char *value;
25c7e41f 1493 ptrdiff_t valuelen;
012c6fcb 1494
f105f403 1495 if (getenv_internal (var, strlen (var), &value, &valuelen, Qnil))
012c6fcb
JA
1496 return value;
1497 else
1498 return 0;
1499}
1500
80856e74 1501\f
8de15d69 1502/* This is run before init_cmdargs. */
177c0ea7 1503
dfcf069d 1504void
971de7fb 1505init_callproc_1 (void)
8de15d69 1506{
d01ba2f1
GM
1507#ifdef HAVE_NS
1508 const char *etc_dir = ns_etc_directory ();
cbb31951 1509 const char *path_exec = ns_exec_path ();
d01ba2f1 1510#endif
35a2f4b8 1511
76151e2c 1512 Vdata_directory = decode_env_path ("EMACSDATA",
d01ba2f1 1513#ifdef HAVE_NS
76151e2c 1514 etc_dir ? etc_dir :
d01ba2f1 1515#endif
76151e2c
EZ
1516 PATH_DATA);
1517 Vdata_directory = Ffile_name_as_directory (Fcar (Vdata_directory));
1518
1519 Vdoc_directory = decode_env_path ("EMACSDOC",
d01ba2f1 1520#ifdef HAVE_NS
76151e2c 1521 etc_dir ? etc_dir :
d01ba2f1 1522#endif
76151e2c
EZ
1523 PATH_DOC);
1524 Vdoc_directory = Ffile_name_as_directory (Fcar (Vdoc_directory));
9453ea7b 1525
e576cab4 1526 /* Check the EMACSPATH environment variable, defaulting to the
57bda87a 1527 PATH_EXEC path from epaths.h. */
cbb31951
GM
1528 Vexec_path = decode_env_path ("EMACSPATH",
1529#ifdef HAVE_NS
1530 path_exec ? path_exec :
1531#endif
1532 PATH_EXEC);
80856e74 1533 Vexec_directory = Ffile_name_as_directory (Fcar (Vexec_path));
cbb31951 1534 /* FIXME? For ns, path_exec should go at the front? */
80856e74 1535 Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path);
8de15d69
RS
1536}
1537
e17f7533 1538/* This is run after init_cmdargs, when Vinstallation_directory is valid. */
8de15d69 1539
dfcf069d 1540void
971de7fb 1541init_callproc (void)
8de15d69
RS
1542{
1543 char *data_dir = egetenv ("EMACSDATA");
177c0ea7 1544
8de15d69
RS
1545 register char * sh;
1546 Lisp_Object tempdir;
d01ba2f1
GM
1547#ifdef HAVE_NS
1548 if (data_dir == 0)
1549 {
1550 const char *etc_dir = ns_etc_directory ();
1551 if (etc_dir)
1552 {
1553 data_dir = alloca (strlen (etc_dir) + 1);
1554 strcpy (data_dir, etc_dir);
1555 }
1556 }
1557#endif
8de15d69 1558
9cc4fad5 1559 if (!NILP (Vinstallation_directory))
8de15d69 1560 {
05630743
RS
1561 /* Add to the path the lib-src subdir of the installation dir. */
1562 Lisp_Object tem;
1563 tem = Fexpand_file_name (build_string ("lib-src"),
1564 Vinstallation_directory);
76151e2c 1565#ifndef MSDOS
1a6640ec 1566 /* MSDOS uses wrapped binaries, so don't do this. */
0fa248bc 1567 if (NILP (Fmember (tem, Vexec_path)))
70ec1377 1568 {
cbb31951
GM
1569#ifdef HAVE_NS
1570 const char *path_exec = ns_exec_path ();
1571#endif
1572 Vexec_path = decode_env_path ("EMACSPATH",
1573#ifdef HAVE_NS
1574 path_exec ? path_exec :
1575#endif
1576 PATH_EXEC);
70ec1377
RS
1577 Vexec_path = Fcons (tem, Vexec_path);
1578 Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path);
1579 }
177c0ea7 1580
0fa248bc 1581 Vexec_directory = Ffile_name_as_directory (tem);
76151e2c 1582#endif /* not MSDOS */
8de15d69 1583
e17f7533
RS
1584 /* Maybe use ../etc as well as ../lib-src. */
1585 if (data_dir == 0)
1586 {
1587 tem = Fexpand_file_name (build_string ("etc"),
1588 Vinstallation_directory);
1589 Vdoc_directory = Ffile_name_as_directory (tem);
8de15d69
RS
1590 }
1591 }
7e933683
RS
1592
1593 /* Look for the files that should be in etc. We don't use
1594 Vinstallation_directory, because these files are never installed
e17f7533 1595 near the executable, and they are never in the build
7e933683
RS
1596 directory when that's different from the source directory.
1597
1598 Instead, if these files are not in the nominal place, we try the
1599 source directory. */
1600 if (data_dir == 0)
1601 {
70ec1377 1602 Lisp_Object tem, tem1, srcdir;
7e933683 1603
70ec1377
RS
1604 srcdir = Fexpand_file_name (build_string ("../src/"),
1605 build_string (PATH_DUMPLOADSEARCH));
7e933683
RS
1606 tem = Fexpand_file_name (build_string ("GNU"), Vdata_directory);
1607 tem1 = Ffile_exists_p (tem);
70ec1377 1608 if (!NILP (Fequal (srcdir, Vinvocation_directory)) || NILP (tem1))
7e933683 1609 {
70ec1377 1610 Lisp_Object newdir;
7e933683
RS
1611 newdir = Fexpand_file_name (build_string ("../etc/"),
1612 build_string (PATH_DUMPLOADSEARCH));
1613 tem = Fexpand_file_name (build_string ("GNU"), newdir);
1614 tem1 = Ffile_exists_p (tem);
1615 if (!NILP (tem1))
1616 Vdata_directory = newdir;
1617 }
1618 }
80856e74 1619
d883eb62
RS
1620#ifndef CANNOT_DUMP
1621 if (initialized)
1622#endif
1623 {
1624 tempdir = Fdirectory_file_name (Vexec_directory);
42a5b22f 1625 if (access (SSDATA (tempdir), 0) < 0)
d883eb62
RS
1626 dir_warning ("Warning: arch-dependent data dir (%s) does not exist.\n",
1627 Vexec_directory);
1628 }
80856e74 1629
e576cab4 1630 tempdir = Fdirectory_file_name (Vdata_directory);
42a5b22f 1631 if (access (SSDATA (tempdir), 0) < 0)
76d5c6cf
RS
1632 dir_warning ("Warning: arch-independent data dir (%s) does not exist.\n",
1633 Vdata_directory);
e576cab4 1634
e576cab4 1635 sh = (char *) getenv ("SHELL");
80856e74 1636 Vshell_file_name = build_string (sh ? sh : "/bin/sh");
8abd035b 1637
40b49d4b
JB
1638#ifdef DOS_NT
1639 Vshared_game_score_directory = Qnil;
1640#else
63789758
RS
1641 Vshared_game_score_directory = build_string (PATH_GAME);
1642 if (NILP (Ffile_directory_p (Vshared_game_score_directory)))
1643 Vshared_game_score_directory = Qnil;
40b49d4b 1644#endif
9fefd2ba
JB
1645}
1646
dfcf069d 1647void
971de7fb 1648set_initial_environment (void)
9fefd2ba 1649{
738db178
DN
1650 char **envp;
1651 for (envp = environ; *envp; envp++)
1652 Vprocess_environment = Fcons (build_string (*envp),
1653 Vprocess_environment);
1654 /* Ideally, the `copy' shouldn't be necessary, but it seems it's frequent
1655 to use `delete' and friends on process-environment. */
1656 Vinitial_environment = Fcopy_sequence (Vprocess_environment);
80856e74
JB
1657}
1658
dfcf069d 1659void
971de7fb 1660syms_of_callproc (void)
80856e74 1661{
f92d51d8
CY
1662#ifndef DOS_NT
1663 Vtemp_file_name_pattern = build_string ("emacsXXXXXX");
1664#elif defined (WINDOWSNT)
1665 Vtemp_file_name_pattern = build_string ("emXXXXXX");
1666#else
1667 Vtemp_file_name_pattern = build_string ("detmp.XXX");
1668#endif
1669 staticpro (&Vtemp_file_name_pattern);
1670
29208e82 1671 DEFVAR_LISP ("shell-file-name", Vshell_file_name,
fb7ada5f 1672 doc: /* File name to load inferior shells from.
b20b29be
EZ
1673Initialized from the SHELL environment variable, or to a system-dependent
1674default if SHELL is not set. */);
80856e74 1675
29208e82 1676 DEFVAR_LISP ("exec-path", Vexec_path,
fb7ada5f 1677 doc: /* List of directories to search programs to run in subprocesses.
fdb82f93 1678Each element is a string (directory name) or nil (try default directory). */);
80856e74 1679
29208e82 1680 DEFVAR_LISP ("exec-suffixes", Vexec_suffixes,
fb7ada5f 1681 doc: /* List of suffixes to try to find executable file names.
fdb82f93 1682Each element is a string. */);
33d5af99 1683 Vexec_suffixes = Qnil;
b81a1b72 1684
29208e82 1685 DEFVAR_LISP ("exec-directory", Vexec_directory,
fdb82f93
PJ
1686 doc: /* Directory for executables for Emacs to invoke.
1687More generally, this includes any architecture-dependent files
1688that are built and installed from the Emacs distribution. */);
e576cab4 1689
29208e82 1690 DEFVAR_LISP ("data-directory", Vdata_directory,
fdb82f93
PJ
1691 doc: /* Directory of machine-independent files that come with GNU Emacs.
1692These are files intended for Emacs to use while it runs. */);
80856e74 1693
29208e82 1694 DEFVAR_LISP ("doc-directory", Vdoc_directory,
fdb82f93 1695 doc: /* Directory containing the DOC file that comes with GNU Emacs.
ebf24b59 1696This is usually the same as `data-directory'. */);
35a2f4b8 1697
29208e82 1698 DEFVAR_LISP ("configure-info-directory", Vconfigure_info_directory,
fdb82f93
PJ
1699 doc: /* For internal use by the build procedure only.
1700This is the name of the directory in which the build procedure installed
ebf24b59 1701Emacs's info files; the default value for `Info-default-directory-list'
fdb82f93 1702includes this. */);
ed61592a
JB
1703 Vconfigure_info_directory = build_string (PATH_INFO);
1704
29208e82 1705 DEFVAR_LISP ("shared-game-score-directory", Vshared_game_score_directory,
b065672a
CW
1706 doc: /* Directory of score files for games which come with GNU Emacs.
1707If this variable is nil, then Emacs is unable to use a shared directory. */);
40b49d4b
JB
1708#ifdef DOS_NT
1709 Vshared_game_score_directory = Qnil;
1710#else
63789758 1711 Vshared_game_score_directory = build_string (PATH_GAME);
40b49d4b 1712#endif
b065672a 1713
29208e82 1714 DEFVAR_LISP ("initial-environment", Vinitial_environment,
6b8e474c
SM
1715 doc: /* List of environment variables inherited from the parent process.
1716Each element should be a string of the form ENVVARNAME=VALUE.
1717The elements must normally be decoded (using `locale-coding-system') for use. */);
1718 Vinitial_environment = Qnil;
1719
29208e82 1720 DEFVAR_LISP ("process-environment", Vprocess_environment,
5990851d 1721 doc: /* List of overridden environment variables for subprocesses to inherit.
fdb82f93 1722Each element should be a string of the form ENVVARNAME=VALUE.
5990851d 1723
a13f8f50
KL
1724Entries in this list take precedence to those in the frame-local
1725environments. Therefore, let-binding `process-environment' is an easy
1726way to temporarily change the value of an environment variable,
1727irrespective of where it comes from. To use `process-environment' to
1728remove an environment variable, include only its name in the list,
1729without "=VALUE".
5990851d
KL
1730
1731This variable is set to nil when Emacs starts.
1732
fdb82f93
PJ
1733If multiple entries define the same variable, the first one always
1734takes precedence.
5990851d 1735
776a24a1 1736Non-ASCII characters are encoded according to the initial value of
5990851d
KL
1737`locale-coding-system', i.e. the elements must normally be decoded for
1738use.
1739
776a24a1 1740See `setenv' and `getenv'. */);
86f5ca04 1741 Vprocess_environment = Qnil;
80856e74 1742
80856e74 1743 defsubr (&Scall_process);
83fa009c 1744 defsubr (&Sgetenv_internal);
e576cab4 1745 defsubr (&Scall_process_region);
80856e74 1746}