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