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