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