* frame.c (x_set_frame_parameters): Don't read uninitialized storage.
[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
94fcd171
PE
829 if (NILP (BVAR (current_buffer, enable_multibyte_characters))
830 && ! CODING_MAY_REQUIRE_DECODING (&process_coding))
831 insert_1_both (buf, nread, nread, 0, 1, 0);
832 else
833 { /* We have to decode the input. */
834 Lisp_Object curbuf;
835 ptrdiff_t count1 = SPECPDL_INDEX ();
836
837 XSETBUFFER (curbuf, current_buffer);
d57f4dde 838 prepare_to_modify_buffer (PT, PT, NULL);
94fcd171
PE
839 /* We cannot allow after-change-functions be run
840 during decoding, because that might modify the
841 buffer, while we rely on process_coding.produced to
842 faithfully reflect inserted text until we
843 TEMP_SET_PT_BOTH below. */
844 specbind (Qinhibit_modification_hooks, Qt);
845 decode_coding_c_string (&process_coding,
846 (unsigned char *) buf, nread, curbuf);
847 unbind_to (count1, Qnil);
848 if (display_on_the_fly
849 && CODING_REQUIRE_DETECTION (&saved_coding)
850 && ! CODING_REQUIRE_DETECTION (&process_coding))
851 {
852 /* We have detected some coding system, but the
853 detection may have been via insufficient data.
854 So give up displaying on the fly. */
855 if (process_coding.produced > 0)
856 del_range_2 (process_coding.dst_pos,
857 process_coding.dst_pos_byte,
858 (process_coding.dst_pos
859 + process_coding.produced_char),
860 (process_coding.dst_pos_byte
861 + process_coding.produced),
862 0);
863 display_on_the_fly = 0;
864 process_coding = saved_coding;
865 carryover = nread;
866 /* Make the above condition always fail in the future. */
867 saved_coding.common_flags
868 &= ~CODING_REQUIRE_DETECTION_MASK;
869 continue;
19ed11ba 870 }
94fcd171
PE
871
872 TEMP_SET_PT_BOTH (PT + process_coding.produced_char,
873 PT_BYTE + process_coding.produced);
874 carryover = process_coding.carryover_bytes;
875 if (carryover > 0)
876 memcpy (buf, process_coding.carryover,
877 process_coding.carryover_bytes);
19ed11ba 878 }
c5bfa12b 879
19ed11ba
AS
880 if (process_coding.mode & CODING_MODE_LAST_BLOCK)
881 break;
6e3bfbb2 882
19ed11ba
AS
883 /* Make the buffer bigger as we continue to read more data,
884 but not past CALLPROC_BUFFER_SIZE_MAX. */
885 if (bufsize < CALLPROC_BUFFER_SIZE_MAX && total_read > 32 * bufsize)
886 if ((bufsize *= 2) > CALLPROC_BUFFER_SIZE_MAX)
887 bufsize = CALLPROC_BUFFER_SIZE_MAX;
6e3bfbb2 888
19ed11ba
AS
889 if (display_p)
890 {
19ed11ba
AS
891 redisplay_preserve_echo_area (1);
892 /* This variable might have been set to 0 for code
94fcd171 893 detection. In that case, set it back to 1 because
19ed11ba
AS
894 we should have already detected a coding system. */
895 display_on_the_fly = 1;
896 }
897 immediate_quit = 1;
898 QUIT;
899 }
900 give_up: ;
901
902 Vlast_coding_system_used = CODING_ID_NAME (process_coding.id);
903 /* If the caller required, let the buffer inherit the
904 coding-system used to decode the process output. */
905 if (inherit_process_coding_system)
906 call1 (intern ("after-insert-file-set-buffer-file-coding-system"),
907 make_number (total_read));
908 }
3b440bb5 909
77defa9a 910#ifndef MSDOS
80856e74 911 /* Wait for it to terminate, unless it already has. */
94fcd171 912 wait_for_termination (pid, &status, fd0 < 0);
77defa9a 913#endif
80856e74
JB
914
915 immediate_quit = 0;
916
37d54121
RS
917 /* Don't kill any children that the subprocess may have left behind
918 when exiting. */
bb5f74ee 919 synch_process_pid = 0;
37d54121 920
3c59b4c9 921 SAFE_FREE ();
80856e74
JB
922 unbind_to (count, Qnil);
923
bb5f74ee 924 if (WIFSIGNALED (status))
6b61353c 925 {
42ca4633 926 const char *signame;
6b61353c
KH
927
928 synchronize_system_messages_locale ();
bb5f74ee 929 signame = strsignal (WTERMSIG (status));
6b61353c
KH
930
931 if (signame == 0)
19ed11ba 932 signame = "unknown";
6b61353c 933
bb5f74ee
PE
934 return code_convert_string_norecord (build_string (signame),
935 Vlocale_coding_system, 0);
6b61353c
KH
936 }
937
bb5f74ee
PE
938 eassert (WIFEXITED (status));
939 return make_number (WEXITSTATUS (status));
80856e74 940}
80856e74 941\f
bafe80ce
PE
942/* Create a temporary file suitable for storing the input data of
943 call-process-region. NARGS and ARGS are the same as for
94fcd171
PE
944 call-process-region. Store into *FILENAME_STRING_PTR a Lisp string
945 naming the file, and return a file descriptor for reading.
946 Unwind-protect the file, so that the file descriptor will be closed
947 and the file removed when the caller unwinds the specpdl stack. */
fdb82f93 948
94fcd171
PE
949static int
950create_temp_file (ptrdiff_t nargs, Lisp_Object *args,
951 Lisp_Object *filename_string_ptr)
80856e74 952{
94fcd171 953 int fd;
39323a7e
KH
954 struct gcpro gcpro1;
955 Lisp_Object filename_string;
bafe80ce 956 Lisp_Object val, start, end;
98c6f1e3 957 Lisp_Object tmpdir;
7e6c2178 958
f92d51d8
CY
959 if (STRINGP (Vtemporary_file_directory))
960 tmpdir = Vtemporary_file_directory;
7e6c2178
RS
961 else
962 {
83be8524 963 char *outf;
f92d51d8 964#ifndef DOS_NT
83be8524
PE
965 outf = getenv ("TMPDIR");
966 tmpdir = build_string (outf ? outf : "/tmp/");
f92d51d8 967#else /* DOS_NT */
f92d51d8
CY
968 if ((outf = egetenv ("TMPDIR"))
969 || (outf = egetenv ("TMP"))
970 || (outf = egetenv ("TEMP")))
971 tmpdir = build_string (outf);
972 else
973 tmpdir = Ffile_name_as_directory (build_string ("c:/temp"));
0774fcf8 974#endif
f92d51d8 975 }
7e6c2178 976
3c59b4c9 977 {
98c6f1e3 978 Lisp_Object pattern = Fexpand_file_name (Vtemp_file_name_pattern, tmpdir);
74ba1583 979 char *tempfile;
94fcd171 980 ptrdiff_t count;
74ba1583
EZ
981
982#ifdef WINDOWSNT
983 /* Cannot use the result of Fexpand_file_name, because it
984 downcases the XXXXXX part of the pattern, and mktemp then
985 doesn't recognize it. */
986 if (!NILP (Vw32_downcase_file_names))
987 {
988 Lisp_Object dirname = Ffile_name_directory (pattern);
989
990 if (NILP (dirname))
991 pattern = Vtemp_file_name_pattern;
992 else
993 pattern = concat2 (dirname, Vtemp_file_name_pattern);
994 }
995#endif
996
bafe80ce
PE
997 filename_string = Fcopy_sequence (ENCODE_FILE (pattern));
998 GCPRO1 (filename_string);
999 tempfile = SSDATA (filename_string);
09494912 1000
94fcd171
PE
1001 count = SPECPDL_INDEX ();
1002 record_unwind_protect_nothing ();
1003 fd = mkostemp (tempfile, O_CLOEXEC);
1004 if (fd < 0)
1005 report_file_error ("Failed to open temporary file using pattern",
1006 pattern);
1007 set_unwind_protect (count, delete_temp_file, filename_string);
1008 record_unwind_protect_int (close_file_unwind, fd);
3c59b4c9
PE
1009 }
1010
80856e74
JB
1011 start = args[0];
1012 end = args[1];
32d08644 1013 /* Decide coding-system of the contents of the temporary file. */
91489411
RS
1014 if (!NILP (Vcoding_system_for_write))
1015 val = Vcoding_system_for_write;
4b4deea2 1016 else if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
fcaf8878 1017 val = Qraw_text;
32d08644 1018 else
beacaab3 1019 {
bafe80ce
PE
1020 Lisp_Object coding_systems;
1021 Lisp_Object *args2;
3c59b4c9 1022 USE_SAFE_ALLOCA;
0065d054 1023 SAFE_NALLOCA (args2, 1, nargs + 1);
91489411 1024 args2[0] = Qcall_process_region;
bafe80ce 1025 memcpy (args2 + 1, args, nargs * sizeof *args);
91489411 1026 coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
fcaf8878 1027 val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil;
3c59b4c9 1028 SAFE_FREE ();
beacaab3 1029 }
fcaf8878 1030 val = complement_process_encoding_system (val);
32d08644 1031
168afdaa 1032 {
d311d28c 1033 ptrdiff_t count1 = SPECPDL_INDEX ();
168afdaa
RS
1034
1035 specbind (intern ("coding-system-for-write"), val);
bb951f0e
KR
1036 /* POSIX lets mk[s]temp use "."; don't invoke jka-compr if we
1037 happen to get a ".Z" suffix. */
1038 specbind (intern ("file-name-handler-alist"), Qnil);
94fcd171 1039 write_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil, fd);
168afdaa
RS
1040
1041 unbind_to (count1, Qnil);
1042 }
91489411 1043
94fcd171
PE
1044 if (lseek (fd, 0, SEEK_SET) < 0)
1045 report_file_error ("Setting file position", filename_string);
1046
177c0ea7 1047 /* Note that Fcall_process takes care of binding
91489411 1048 coding-system-for-read. */
093650fe 1049
94fcd171
PE
1050 *filename_string_ptr = filename_string;
1051 UNGCPRO;
1052 return fd;
bafe80ce
PE
1053}
1054
1055DEFUN ("call-process-region", Fcall_process_region, Scall_process_region,
1056 3, MANY, 0,
1057 doc: /* Send text from START to END to a synchronous process running PROGRAM.
1058The remaining arguments are optional.
1059Delete the text if fourth arg DELETE is non-nil.
1060
1061Insert output in BUFFER before point; t means current buffer; nil for
1062 BUFFER means discard it; 0 means discard and don't wait; and `(:file
1063 FILE)', where FILE is a file name string, means that it should be
1064 written to that file (if the file already exists it is overwritten).
1065BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,
1066REAL-BUFFER says what to do with standard output, as above,
1067while STDERR-FILE says what to do with standard error in the child.
1068STDERR-FILE may be nil (discard standard error output),
1069t (mix it with ordinary output), or a file name string.
1070
1071Sixth arg DISPLAY non-nil means redisplay buffer as output is inserted.
1072Remaining args are passed to PROGRAM at startup as command args.
1073
1074If BUFFER is 0, `call-process-region' returns immediately with value nil.
1075Otherwise it waits for PROGRAM to terminate
1076and returns a numeric exit status or a signal description string.
1077If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.
1078
1079usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &rest ARGS) */)
1080 (ptrdiff_t nargs, Lisp_Object *args)
1081{
4a88129a 1082 struct gcpro gcpro1;
94fcd171 1083 Lisp_Object infile, val;
bafe80ce
PE
1084 ptrdiff_t count = SPECPDL_INDEX ();
1085 Lisp_Object start = args[0];
1086 Lisp_Object end = args[1];
1087 bool empty_input;
94fcd171 1088 int fd;
bafe80ce
PE
1089
1090 if (STRINGP (start))
1091 empty_input = SCHARS (start) == 0;
1092 else if (NILP (start))
1093 empty_input = BEG == Z;
1094 else
1095 {
1096 validate_region (&args[0], &args[1]);
1097 start = args[0];
1098 end = args[1];
1099 empty_input = XINT (start) == XINT (end);
1100 }
1101
94fcd171
PE
1102 if (!empty_input)
1103 fd = create_temp_file (nargs, args, &infile);
1104 else
1105 {
1106 infile = Qnil;
1107 fd = emacs_open (NULL_DEVICE, O_RDONLY, 0);
1108 if (fd < 0)
1109 report_file_error ("Opening null device", Qnil);
1110 record_unwind_protect_int (close_file_unwind, fd);
1111 }
1112
4a88129a 1113 GCPRO1 (infile);
80856e74 1114
edf496dd 1115 if (nargs > 3 && !NILP (args[3]))
80856e74
JB
1116 Fdelete_region (start, end);
1117
edf496dd
KH
1118 if (nargs > 3)
1119 {
1120 args += 2;
1121 nargs -= 2;
1122 }
1123 else
1124 {
1125 args[0] = args[2];
1126 nargs = 2;
1127 }
50a30cce 1128 args[1] = infile;
80856e74 1129
4a88129a 1130 val = call_process (nargs, args, fd, empty_input ? -1 : count);
94fcd171 1131 RETURN_UNGCPRO (unbind_to (count, val));
80856e74
JB
1132}
1133\f
361358ea 1134#ifndef WINDOWSNT
971de7fb 1135static int relocate_fd (int fd, int minfd);
361358ea 1136#endif
dfcf069d 1137
5990851d
KL
1138static char **
1139add_env (char **env, char **new_env, char *string)
1140{
1141 char **ep;
2f221583 1142 bool ok = 1;
5990851d
KL
1143 if (string == NULL)
1144 return new_env;
1145
1146 /* See if this string duplicates any string already in the env.
1147 If so, don't put it in.
1148 When an env var has multiple definitions,
1149 we keep the definition that comes first in process-environment. */
1150 for (ep = env; ok && ep != new_env; ep++)
1151 {
1152 char *p = *ep, *q = string;
1153 while (ok)
19ed11ba
AS
1154 {
1155 if (*q != *p)
1156 break;
1157 if (*q == 0)
1158 /* The string is a lone variable name; keep it for now, we
1159 will remove it later. It is a placeholder for a
1160 variable that is not to be included in the environment. */
1161 break;
1162 if (*q == '=')
1163 ok = 0;
1164 p++, q++;
1165 }
5990851d
KL
1166 }
1167 if (ok)
1168 *new_env++ = string;
1169 return new_env;
1170}
1171
80856e74
JB
1172/* This is the last thing run in a newly forked inferior
1173 either synchronous or asynchronous.
1174 Copy descriptors IN, OUT and ERR as descriptors 0, 1 and 2.
1175 Initialize inferior's priority, pgrp, connected dir and environment.
1176 then exec another program based on new_argv.
1177
2f221583 1178 If SET_PGRP, put the subprocess into a separate process group.
e576cab4
JB
1179
1180 CURRENT_DIR is an elisp string giving the path of the current
1181 directory the subprocess should have. Since we can't really signal
1182 a decent error from within the child, this should be verified as an
1183 executable directory by the parent. */
80856e74 1184
dfcf069d 1185int
2f221583
PE
1186child_setup (int in, int out, int err, char **new_argv, bool set_pgrp,
1187 Lisp_Object current_dir)
80856e74 1188{
e576cab4 1189 char **env;
7fcf7f05 1190 char *pwd_var;
bad95d8f
RS
1191#ifdef WINDOWSNT
1192 int cpid;
4252a4bd 1193 HANDLE handles[3];
afacaa1b
JB
1194#else
1195 int exec_errno;
e576cab4 1196
d311d28c 1197 pid_t pid = getpid ();
afacaa1b 1198#endif /* WINDOWSNT */
80856e74 1199
80856e74
JB
1200 /* Note that use of alloca is always safe here. It's obvious for systems
1201 that do not have true vfork or that have true (stack) alloca.
caa01fe0
GM
1202 If using vfork and C_ALLOCA (when Emacs used to include
1203 src/alloca.c) it is safe because that changes the superior's
1204 static variables as if the superior had done alloca and will be
1205 cleaned up in the usual way. */
e576cab4 1206 {
c365c355
PE
1207 char *temp;
1208 ptrdiff_t i;
77d78be1 1209
d5db4077 1210 i = SBYTES (current_dir);
16425c4a
EZ
1211#ifdef MSDOS
1212 /* MSDOS must have all environment variables malloc'ed, because
1213 low-level libc functions that launch subsidiary processes rely
1214 on that. */
c365c355 1215 pwd_var = xmalloc (i + 5);
16425c4a 1216#else
c365c355 1217 pwd_var = alloca (i + 5);
16425c4a 1218#endif
7fcf7f05 1219 temp = pwd_var + 4;
72af86bd 1220 memcpy (pwd_var, "PWD=", 4);
c365c355 1221 strcpy (temp, SSDATA (current_dir));
e576cab4 1222
c17c4250 1223#ifndef DOS_NT
e576cab4
JB
1224 /* We can't signal an Elisp error here; we're in a vfork. Since
1225 the callers check the current directory before forking, this
1226 should only return an error if the directory's permissions
1227 are changed between the check and this chdir, but we should
1228 at least check. */
1229 if (chdir (temp) < 0)
4ebbdd67 1230 _exit (EXIT_CANCELED);
f8d23104 1231#else /* DOS_NT */
c17c4250
EZ
1232 /* Get past the drive letter, so that d:/ is left alone. */
1233 if (i > 2 && IS_DEVICE_SEP (temp[1]) && IS_DIRECTORY_SEP (temp[2]))
1234 {
1235 temp += 2;
1236 i -= 2;
1237 }
f8d23104 1238#endif /* DOS_NT */
c17c4250 1239
7fcf7f05 1240 /* Strip trailing slashes for PWD, but leave "/" and "//" alone. */
bad95d8f 1241 while (i > 2 && IS_DIRECTORY_SEP (temp[i - 1]))
7fcf7f05 1242 temp[--i] = 0;
e576cab4 1243 }
80856e74 1244
5990851d 1245 /* Set `env' to a vector of the strings in the environment. */
80856e74
JB
1246 {
1247 register Lisp_Object tem;
1248 register char **new_env;
5990851d 1249 char **p, **q;
80856e74 1250 register int new_length;
d2bb6598 1251 Lisp_Object display = Qnil;
361358ea 1252
80856e74 1253 new_length = 0;
f105f403 1254
80856e74 1255 for (tem = Vprocess_environment;
19ed11ba
AS
1256 CONSP (tem) && STRINGP (XCAR (tem));
1257 tem = XCDR (tem))
d2bb6598 1258 {
42a5b22f 1259 if (strncmp (SSDATA (XCAR (tem)), "DISPLAY", 7) == 0
d2bb6598
SM
1260 && (SDATA (XCAR (tem)) [7] == '\0'
1261 || SDATA (XCAR (tem)) [7] == '='))
1262 /* DISPLAY is specified in process-environment. */
1263 display = Qt;
1264 new_length++;
1265 }
de87fb59 1266
d2bb6598
SM
1267 /* If not provided yet, use the frame's DISPLAY. */
1268 if (NILP (display))
1269 {
1270 Lisp_Object tmp = Fframe_parameter (selected_frame, Qdisplay);
1271 if (!STRINGP (tmp) && CONSP (Vinitial_environment))
1272 /* If still not found, Look for DISPLAY in Vinitial_environment. */
1273 tmp = Fgetenv_internal (build_string ("DISPLAY"),
1274 Vinitial_environment);
1275 if (STRINGP (tmp))
1276 {
1277 display = tmp;
1278 new_length++;
1279 }
1280 }
80856e74 1281
7fcf7f05 1282 /* new_length + 2 to include PWD and terminating 0. */
38182d90 1283 env = new_env = alloca ((new_length + 2) * sizeof *env);
7fcf7f05
RS
1284 /* If we have a PWD envvar, pass one down,
1285 but with corrected value. */
a13f8f50 1286 if (egetenv ("PWD"))
7fcf7f05 1287 *new_env++ = pwd_var;
361358ea 1288
6b8e474c 1289 if (STRINGP (display))
de87fb59 1290 {
38182d90 1291 char *vdata = alloca (sizeof "DISPLAY=" + SBYTES (display));
de87fb59 1292 strcpy (vdata, "DISPLAY=");
42a5b22f 1293 strcat (vdata, SSDATA (display));
de87fb59
DN
1294 new_env = add_env (env, new_env, vdata);
1295 }
80856e74 1296
5990851d 1297 /* Overrides. */
80856e74 1298 for (tem = Vprocess_environment;
70949dac
KR
1299 CONSP (tem) && STRINGP (XCAR (tem));
1300 tem = XCDR (tem))
42a5b22f 1301 new_env = add_env (env, new_env, SSDATA (XCAR (tem)));
d2bb6598 1302
5990851d
KL
1303 *new_env = 0;
1304
1305 /* Remove variable names without values. */
1306 p = q = env;
1307 while (*p != 0)
cd9565ba 1308 {
19ed11ba
AS
1309 while (*q != 0 && strchr (*q, '=') == NULL)
1310 q++;
1311 *p = *q++;
1312 if (*p != 0)
1313 p++;
cd9565ba 1314 }
80856e74 1315 }
de87fb59 1316
361358ea 1317
bad95d8f
RS
1318#ifdef WINDOWSNT
1319 prepare_standard_handles (in, out, err, handles);
d5db4077 1320 set_process_dir (SDATA (current_dir));
d3d14b40 1321 /* Spawn the child. (See w32proc.c:sys_spawnve). */
67802943
DN
1322 cpid = spawnve (_P_NOWAIT, new_argv[0], new_argv, env);
1323 reset_standard_handles (in, out, err, handles);
1324 if (cpid == -1)
1325 /* An error occurred while trying to spawn the process. */
1326 report_file_error ("Spawning child process", Qnil);
1327 return cpid;
1328
bad95d8f 1329#else /* not WINDOWSNT */
426b37ae
JB
1330 /* Make sure that in, out, and err are not actually already in
1331 descriptors zero, one, or two; this could happen if Emacs is
7e6c2178 1332 started with its standard in, out, or error closed, as might
426b37ae 1333 happen under X. */
f29f9e4a
RS
1334 {
1335 int oin = in, oout = out;
1336
1337 /* We have to avoid relocating the same descriptor twice! */
1338
1339 in = relocate_fd (in, 3);
1340
1341 if (out == oin)
1342 out = in;
1343 else
3e9367e7 1344 out = relocate_fd (out, 3);
f29f9e4a
RS
1345
1346 if (err == oin)
1347 err = in;
1348 else if (err == oout)
1349 err = out;
1350 else
3e9367e7 1351 err = relocate_fd (err, 3);
f29f9e4a 1352 }
426b37ae 1353
c17c4250 1354#ifndef MSDOS
4700b5a5
PE
1355 /* Redirect file descriptors and clear the close-on-exec flag on the
1356 redirected ones. IN, OUT, and ERR are close-on-exec so they
1357 need not be closed explicitly. */
80856e74
JB
1358 dup2 (in, 0);
1359 dup2 (out, 1);
1360 dup2 (err, 2);
067428c1 1361
dd0333b6 1362 setpgid (0, 0);
12e610e8 1363 tcsetpgrp (0, pid);
a7ebc409 1364
21e54a94 1365 execve (new_argv[0], new_argv, env);
ee010797 1366 exec_errno = errno;
80856e74 1367
ee010797
PE
1368 /* Avoid deadlock if the child's perror writes to a full pipe; the
1369 pipe's reader is the parent, but with vfork the parent can't
1370 run until the child exits. Truncate the diagnostic instead. */
1371 fcntl (STDERR_FILENO, F_SETFL, O_NONBLOCK);
4ebbdd67 1372
ee010797
PE
1373 errno = exec_errno;
1374 emacs_perror (new_argv[0]);
1375 _exit (exec_errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE);
67802943
DN
1376
1377#else /* MSDOS */
1378 pid = run_msdos_command (new_argv, pwd_var + 4, in, out, err, env);
1379 xfree (pwd_var);
1380 if (pid == -1)
1381 /* An error occurred while trying to run the subprocess. */
1382 report_file_error ("Spawning child process", Qnil);
1383 return pid;
1384#endif /* MSDOS */
ae76d9e1 1385#endif /* not WINDOWSNT */
80856e74
JB
1386}
1387
361358ea 1388#ifndef WINDOWSNT
a3833dfe 1389/* Move the file descriptor FD so that its number is not less than MINFD.
4700b5a5
PE
1390 If the file descriptor is moved at all, the original is closed on MSDOS,
1391 but not elsewhere as the caller will close it anyway. */
dfcf069d 1392static int
971de7fb 1393relocate_fd (int fd, int minfd)
426b37ae 1394{
a3833dfe 1395 if (fd >= minfd)
426b37ae
JB
1396 return fd;
1397 else
1398 {
067428c1 1399 int new = fcntl (fd, F_DUPFD_CLOEXEC, minfd);
426b37ae
JB
1400 if (new == -1)
1401 {
4ebbdd67
PE
1402 emacs_perror ("while setting up child");
1403 _exit (EXIT_CANCELED);
426b37ae 1404 }
4700b5a5 1405#ifdef MSDOS
68c45bf0 1406 emacs_close (fd);
4700b5a5 1407#endif
426b37ae
JB
1408 return new;
1409 }
1410}
361358ea 1411#endif /* not WINDOWSNT */
426b37ae 1412
2f221583 1413static bool
989f33ba
PE
1414getenv_internal_1 (const char *var, ptrdiff_t varlen, char **value,
1415 ptrdiff_t *valuelen, Lisp_Object env)
012c6fcb 1416{
db699fc6 1417 for (; CONSP (env); env = XCDR (env))
012c6fcb 1418 {
db699fc6 1419 Lisp_Object entry = XCAR (env);
d50d3dc8 1420 if (STRINGP (entry)
db699fc6 1421 && SBYTES (entry) >= varlen
bad95d8f
RS
1422#ifdef WINDOWSNT
1423 /* NT environment variables are case insensitive. */
d5db4077 1424 && ! strnicmp (SDATA (entry), var, varlen)
bad95d8f 1425#else /* not WINDOWSNT */
72af86bd 1426 && ! memcmp (SDATA (entry), var, varlen)
bad95d8f 1427#endif /* not WINDOWSNT */
a9971c6d 1428 )
012c6fcb 1429 {
db699fc6
SM
1430 if (SBYTES (entry) > varlen && SREF (entry, varlen) == '=')
1431 {
51b59d79 1432 *value = SSDATA (entry) + (varlen + 1);
db699fc6
SM
1433 *valuelen = SBYTES (entry) - (varlen + 1);
1434 return 1;
1435 }
1436 else if (SBYTES (entry) == varlen)
1437 {
1438 /* Lone variable names in Vprocess_environment mean that
1439 variable should be removed from the environment. */
1440 *value = NULL;
1441 return 1;
1442 }
1443 }
1444 }
1445 return 0;
1446}
1447
2f221583 1448static bool
989f33ba
PE
1449getenv_internal (const char *var, ptrdiff_t varlen, char **value,
1450 ptrdiff_t *valuelen, Lisp_Object frame)
012c6fcb 1451{
d2bb6598
SM
1452 /* Try to find VAR in Vprocess_environment first. */
1453 if (getenv_internal_1 (var, varlen, value, valuelen,
1454 Vprocess_environment))
1455 return *value ? 1 : 0;
f105f403 1456
d2bb6598 1457 /* For DISPLAY try to get the values from the frame or the initial env. */
de87fb59 1458 if (strcmp (var, "DISPLAY") == 0)
d2bb6598
SM
1459 {
1460 Lisp_Object display
1461 = Fframe_parameter (NILP (frame) ? selected_frame : frame, Qdisplay);
1462 if (STRINGP (display))
1463 {
51b59d79 1464 *value = SSDATA (display);
de87fb59 1465 *valuelen = SBYTES (display);
012c6fcb
JA
1466 return 1;
1467 }
d2bb6598
SM
1468 /* If still not found, Look for DISPLAY in Vinitial_environment. */
1469 if (getenv_internal_1 (var, varlen, value, valuelen,
1470 Vinitial_environment))
1471 return *value ? 1 : 0;
012c6fcb
JA
1472 }
1473
1474 return 0;
1475}
1476
f105f403 1477DEFUN ("getenv-internal", Fgetenv_internal, Sgetenv_internal, 1, 2, 0,
5990851d
KL
1478 doc: /* Get the value of environment variable VARIABLE.
1479VARIABLE should be a string. Value is nil if VARIABLE is undefined in
1480the environment. Otherwise, value is a string.
f105f403 1481
acf20901 1482This function searches `process-environment' for VARIABLE.
5990851d 1483
db699fc6 1484If optional parameter ENV is a list, then search this list instead of
acf20901
JB
1485`process-environment', and return t when encountering a negative entry
1486\(an entry for a variable with no value). */)
5842a27b 1487 (Lisp_Object variable, Lisp_Object env)
012c6fcb
JA
1488{
1489 char *value;
989f33ba 1490 ptrdiff_t valuelen;
012c6fcb 1491
5990851d 1492 CHECK_STRING (variable);
db699fc6
SM
1493 if (CONSP (env))
1494 {
42a5b22f 1495 if (getenv_internal_1 (SSDATA (variable), SBYTES (variable),
db699fc6
SM
1496 &value, &valuelen, env))
1497 return value ? make_string (value, valuelen) : Qt;
1498 else
1499 return Qnil;
1500 }
42a5b22f 1501 else if (getenv_internal (SSDATA (variable), SBYTES (variable),
d2bb6598 1502 &value, &valuelen, env))
012c6fcb
JA
1503 return make_string (value, valuelen);
1504 else
1505 return Qnil;
1506}
1507
5990851d
KL
1508/* A version of getenv that consults the Lisp environment lists,
1509 easily callable from C. */
012c6fcb 1510char *
a8fe7202 1511egetenv (const char *var)
012c6fcb
JA
1512{
1513 char *value;
25c7e41f 1514 ptrdiff_t valuelen;
012c6fcb 1515
f105f403 1516 if (getenv_internal (var, strlen (var), &value, &valuelen, Qnil))
012c6fcb
JA
1517 return value;
1518 else
1519 return 0;
1520}
1521
80856e74 1522\f
8de15d69 1523/* This is run before init_cmdargs. */
177c0ea7 1524
dfcf069d 1525void
971de7fb 1526init_callproc_1 (void)
8de15d69 1527{
d01ba2f1
GM
1528#ifdef HAVE_NS
1529 const char *etc_dir = ns_etc_directory ();
cbb31951 1530 const char *path_exec = ns_exec_path ();
d01ba2f1 1531#endif
35a2f4b8 1532
76151e2c 1533 Vdata_directory = decode_env_path ("EMACSDATA",
d01ba2f1 1534#ifdef HAVE_NS
76151e2c 1535 etc_dir ? etc_dir :
d01ba2f1 1536#endif
17e0445b 1537 PATH_DATA, 0);
76151e2c
EZ
1538 Vdata_directory = Ffile_name_as_directory (Fcar (Vdata_directory));
1539
1540 Vdoc_directory = decode_env_path ("EMACSDOC",
d01ba2f1 1541#ifdef HAVE_NS
76151e2c 1542 etc_dir ? etc_dir :
d01ba2f1 1543#endif
17e0445b 1544 PATH_DOC, 0);
76151e2c 1545 Vdoc_directory = Ffile_name_as_directory (Fcar (Vdoc_directory));
9453ea7b 1546
e576cab4 1547 /* Check the EMACSPATH environment variable, defaulting to the
57bda87a 1548 PATH_EXEC path from epaths.h. */
cbb31951
GM
1549 Vexec_path = decode_env_path ("EMACSPATH",
1550#ifdef HAVE_NS
1551 path_exec ? path_exec :
1552#endif
17e0445b 1553 PATH_EXEC, 0);
80856e74 1554 Vexec_directory = Ffile_name_as_directory (Fcar (Vexec_path));
cbb31951 1555 /* FIXME? For ns, path_exec should go at the front? */
17e0445b 1556 Vexec_path = nconc2 (decode_env_path ("PATH", "", 0), Vexec_path);
8de15d69
RS
1557}
1558
e17f7533 1559/* This is run after init_cmdargs, when Vinstallation_directory is valid. */
8de15d69 1560
dfcf069d 1561void
971de7fb 1562init_callproc (void)
8de15d69
RS
1563{
1564 char *data_dir = egetenv ("EMACSDATA");
177c0ea7 1565
8de15d69
RS
1566 register char * sh;
1567 Lisp_Object tempdir;
d01ba2f1
GM
1568#ifdef HAVE_NS
1569 if (data_dir == 0)
1570 {
1571 const char *etc_dir = ns_etc_directory ();
1572 if (etc_dir)
1573 {
1574 data_dir = alloca (strlen (etc_dir) + 1);
1575 strcpy (data_dir, etc_dir);
1576 }
1577 }
1578#endif
8de15d69 1579
9cc4fad5 1580 if (!NILP (Vinstallation_directory))
8de15d69 1581 {
05630743
RS
1582 /* Add to the path the lib-src subdir of the installation dir. */
1583 Lisp_Object tem;
1584 tem = Fexpand_file_name (build_string ("lib-src"),
1585 Vinstallation_directory);
76151e2c 1586#ifndef MSDOS
1a6640ec 1587 /* MSDOS uses wrapped binaries, so don't do this. */
0fa248bc 1588 if (NILP (Fmember (tem, Vexec_path)))
70ec1377 1589 {
cbb31951
GM
1590#ifdef HAVE_NS
1591 const char *path_exec = ns_exec_path ();
1592#endif
1593 Vexec_path = decode_env_path ("EMACSPATH",
1594#ifdef HAVE_NS
1595 path_exec ? path_exec :
1596#endif
17e0445b 1597 PATH_EXEC, 0);
70ec1377 1598 Vexec_path = Fcons (tem, Vexec_path);
17e0445b 1599 Vexec_path = nconc2 (decode_env_path ("PATH", "", 0), Vexec_path);
70ec1377 1600 }
177c0ea7 1601
0fa248bc 1602 Vexec_directory = Ffile_name_as_directory (tem);
76151e2c 1603#endif /* not MSDOS */
8de15d69 1604
e17f7533
RS
1605 /* Maybe use ../etc as well as ../lib-src. */
1606 if (data_dir == 0)
1607 {
1608 tem = Fexpand_file_name (build_string ("etc"),
1609 Vinstallation_directory);
1610 Vdoc_directory = Ffile_name_as_directory (tem);
8de15d69
RS
1611 }
1612 }
7e933683
RS
1613
1614 /* Look for the files that should be in etc. We don't use
1615 Vinstallation_directory, because these files are never installed
e17f7533 1616 near the executable, and they are never in the build
7e933683
RS
1617 directory when that's different from the source directory.
1618
1619 Instead, if these files are not in the nominal place, we try the
1620 source directory. */
1621 if (data_dir == 0)
1622 {
70ec1377 1623 Lisp_Object tem, tem1, srcdir;
624780f0
GM
1624 Lisp_Object lispdir = Fcar (decode_env_path (0, PATH_DUMPLOADSEARCH, 0));
1625
1626 srcdir = Fexpand_file_name (build_string ("../src/"), lispdir);
7e933683
RS
1627
1628 tem = Fexpand_file_name (build_string ("GNU"), Vdata_directory);
1629 tem1 = Ffile_exists_p (tem);
70ec1377 1630 if (!NILP (Fequal (srcdir, Vinvocation_directory)) || NILP (tem1))
7e933683 1631 {
70ec1377 1632 Lisp_Object newdir;
624780f0 1633 newdir = Fexpand_file_name (build_string ("../etc/"), lispdir);
7e933683
RS
1634 tem = Fexpand_file_name (build_string ("GNU"), newdir);
1635 tem1 = Ffile_exists_p (tem);
1636 if (!NILP (tem1))
1637 Vdata_directory = newdir;
1638 }
1639 }
80856e74 1640
d883eb62
RS
1641#ifndef CANNOT_DUMP
1642 if (initialized)
1643#endif
1644 {
1645 tempdir = Fdirectory_file_name (Vexec_directory);
73dcdb9f
PE
1646 if (! file_accessible_directory_p (SSDATA (tempdir)))
1647 dir_warning ("arch-dependent data dir", Vexec_directory);
d883eb62 1648 }
80856e74 1649
e576cab4 1650 tempdir = Fdirectory_file_name (Vdata_directory);
73dcdb9f
PE
1651 if (! file_accessible_directory_p (SSDATA (tempdir)))
1652 dir_warning ("arch-independent data dir", Vdata_directory);
e576cab4 1653
83be8524 1654 sh = getenv ("SHELL");
80856e74 1655 Vshell_file_name = build_string (sh ? sh : "/bin/sh");
8abd035b 1656
40b49d4b
JB
1657#ifdef DOS_NT
1658 Vshared_game_score_directory = Qnil;
1659#else
d0065ff1 1660 Vshared_game_score_directory = build_unibyte_string (PATH_GAME);
73dcdb9f 1661 if (NILP (Ffile_accessible_directory_p (Vshared_game_score_directory)))
63789758 1662 Vshared_game_score_directory = Qnil;
40b49d4b 1663#endif
9fefd2ba
JB
1664}
1665
dfcf069d 1666void
971de7fb 1667set_initial_environment (void)
9fefd2ba 1668{
738db178
DN
1669 char **envp;
1670 for (envp = environ; *envp; envp++)
1671 Vprocess_environment = Fcons (build_string (*envp),
1672 Vprocess_environment);
1673 /* Ideally, the `copy' shouldn't be necessary, but it seems it's frequent
1674 to use `delete' and friends on process-environment. */
1675 Vinitial_environment = Fcopy_sequence (Vprocess_environment);
80856e74
JB
1676}
1677
dfcf069d 1678void
971de7fb 1679syms_of_callproc (void)
80856e74 1680{
f92d51d8
CY
1681#ifndef DOS_NT
1682 Vtemp_file_name_pattern = build_string ("emacsXXXXXX");
bf6b4923 1683#else /* DOS_NT */
f92d51d8 1684 Vtemp_file_name_pattern = build_string ("emXXXXXX");
f92d51d8
CY
1685#endif
1686 staticpro (&Vtemp_file_name_pattern);
1687
94fcd171
PE
1688#ifdef MSDOS
1689 synch_process_tempfile = make_number (0);
1690 staticpro (&synch_process_tempfile);
1691#endif
1692
29208e82 1693 DEFVAR_LISP ("shell-file-name", Vshell_file_name,
fb7ada5f 1694 doc: /* File name to load inferior shells from.
b20b29be
EZ
1695Initialized from the SHELL environment variable, or to a system-dependent
1696default if SHELL is not set. */);
80856e74 1697
29208e82 1698 DEFVAR_LISP ("exec-path", Vexec_path,
fb7ada5f 1699 doc: /* List of directories to search programs to run in subprocesses.
fdadeb49
JC
1700Each element is a string (directory name) or nil (try default directory).
1701
1702By default the last element of this list is `exec-directory'. The
1703last element is not always used, for example in shell completion
1704(`shell-dynamic-complete-command'). */);
80856e74 1705
29208e82 1706 DEFVAR_LISP ("exec-suffixes", Vexec_suffixes,
fb7ada5f 1707 doc: /* List of suffixes to try to find executable file names.
fdb82f93 1708Each element is a string. */);
33d5af99 1709 Vexec_suffixes = Qnil;
b81a1b72 1710
29208e82 1711 DEFVAR_LISP ("exec-directory", Vexec_directory,
fdb82f93
PJ
1712 doc: /* Directory for executables for Emacs to invoke.
1713More generally, this includes any architecture-dependent files
1714that are built and installed from the Emacs distribution. */);
e576cab4 1715
29208e82 1716 DEFVAR_LISP ("data-directory", Vdata_directory,
fdb82f93
PJ
1717 doc: /* Directory of machine-independent files that come with GNU Emacs.
1718These are files intended for Emacs to use while it runs. */);
80856e74 1719
29208e82 1720 DEFVAR_LISP ("doc-directory", Vdoc_directory,
fdb82f93 1721 doc: /* Directory containing the DOC file that comes with GNU Emacs.
ebf24b59 1722This is usually the same as `data-directory'. */);
35a2f4b8 1723
29208e82 1724 DEFVAR_LISP ("configure-info-directory", Vconfigure_info_directory,
fdb82f93
PJ
1725 doc: /* For internal use by the build procedure only.
1726This is the name of the directory in which the build procedure installed
ebf24b59 1727Emacs's info files; the default value for `Info-default-directory-list'
fdb82f93 1728includes this. */);
ed61592a
JB
1729 Vconfigure_info_directory = build_string (PATH_INFO);
1730
29208e82 1731 DEFVAR_LISP ("shared-game-score-directory", Vshared_game_score_directory,
b065672a
CW
1732 doc: /* Directory of score files for games which come with GNU Emacs.
1733If this variable is nil, then Emacs is unable to use a shared directory. */);
40b49d4b
JB
1734#ifdef DOS_NT
1735 Vshared_game_score_directory = Qnil;
1736#else
63789758 1737 Vshared_game_score_directory = build_string (PATH_GAME);
40b49d4b 1738#endif
b065672a 1739
29208e82 1740 DEFVAR_LISP ("initial-environment", Vinitial_environment,
6b8e474c
SM
1741 doc: /* List of environment variables inherited from the parent process.
1742Each element should be a string of the form ENVVARNAME=VALUE.
1743The elements must normally be decoded (using `locale-coding-system') for use. */);
1744 Vinitial_environment = Qnil;
1745
29208e82 1746 DEFVAR_LISP ("process-environment", Vprocess_environment,
5990851d 1747 doc: /* List of overridden environment variables for subprocesses to inherit.
fdb82f93 1748Each element should be a string of the form ENVVARNAME=VALUE.
5990851d 1749
a13f8f50
KL
1750Entries in this list take precedence to those in the frame-local
1751environments. Therefore, let-binding `process-environment' is an easy
1752way to temporarily change the value of an environment variable,
1753irrespective of where it comes from. To use `process-environment' to
1754remove an environment variable, include only its name in the list,
1755without "=VALUE".
5990851d
KL
1756
1757This variable is set to nil when Emacs starts.
1758
fdb82f93
PJ
1759If multiple entries define the same variable, the first one always
1760takes precedence.
5990851d 1761
776a24a1 1762Non-ASCII characters are encoded according to the initial value of
5990851d
KL
1763`locale-coding-system', i.e. the elements must normally be decoded for
1764use.
1765
776a24a1 1766See `setenv' and `getenv'. */);
86f5ca04 1767 Vprocess_environment = Qnil;
80856e74 1768
80856e74 1769 defsubr (&Scall_process);
83fa009c 1770 defsubr (&Sgetenv_internal);
e576cab4 1771 defsubr (&Scall_process_region);
80856e74 1772}