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