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