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