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