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