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