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