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