Merge from emacs-24; up to 2012-05-07T14:57:18Z!michael.albinus@gmx.de
[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"
aba637ec 54#include "blockinput.h"
f105f403
KL
55#include "frame.h"
56#include "termhooks.h"
80856e74 57
5f027cea
EZ
58#ifdef MSDOS
59#include "msdos.h"
60#endif
61
d01ba2f1
GM
62#ifdef HAVE_NS
63#include "nsterm.h"
64#endif
65
f95c3f91 66#ifdef HAVE_SETPGID
58eb6cf0 67#if !defined (USG)
320695d8 68#undef setpgrp
f95c3f91
GM
69#define setpgrp setpgid
70#endif
2b7e8799 71#endif
f95c3f91 72
f92d51d8
CY
73/* Pattern used by call-process-region to make temp files. */
74static Lisp_Object Vtemp_file_name_pattern;
75
e0f24100 76/* True if we are about to fork off a synchronous process or if we
80856e74 77 are waiting for it. */
2f221583 78bool synch_process_alive;
80856e74
JB
79
80/* Nonzero => this is a string explaining death of synchronous subprocess. */
42ca4633 81const char *synch_process_death;
80856e74 82
6b61353c
KH
83/* Nonzero => this is the signal number that terminated the subprocess. */
84int synch_process_termsig;
85
80856e74
JB
86/* If synch_process_death is zero,
87 this is exit code of synchronous subprocess. */
88int synch_process_retcode;
f105f403 89
80856e74 90\f
37d54121
RS
91/* Clean up when exiting Fcall_process.
92 On MSDOS, delete the temporary file on any kind of termination.
93 On Unix, kill the process and any children on termination by signal. */
94
2f221583
PE
95/* True if this is termination due to exit. */
96static bool call_process_exited;
37d54121 97
d177f194 98static Lisp_Object
971de7fb 99call_process_kill (Lisp_Object fdpid)
d177f194 100{
d311d28c
PE
101 int fd;
102 pid_t pid;
103 CONS_TO_INTEGER (Fcar (fdpid), int, fd);
104 CONS_TO_INTEGER (Fcdr (fdpid), pid_t, pid);
105 emacs_close (fd);
106 EMACS_KILLPG (pid, SIGKILL);
d177f194
JB
107 synch_process_alive = 0;
108 return Qnil;
109}
110
7710357c 111static Lisp_Object
971de7fb 112call_process_cleanup (Lisp_Object arg)
80856e74 113{
ad3aaf33 114 Lisp_Object fdpid = Fcdr (arg);
d311d28c 115 int fd;
ad3aaf33
AS
116#if defined (MSDOS)
117 Lisp_Object file;
118#else
d311d28c 119 pid_t pid;
ad3aaf33
AS
120#endif
121
122 Fset_buffer (Fcar (arg));
d311d28c 123 CONS_TO_INTEGER (Fcar (fdpid), int, fd);
ad3aaf33 124
e39a993c 125#if defined (MSDOS)
7e6c2178 126 /* for MSDOS fdpid is really (fd . tempfile) */
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 */
d311d28c 135 CONS_TO_INTEGER (Fcdr (fdpid), pid_t, pid);
d177f194 136
37d54121 137 if (call_process_exited)
6b6e798b 138 {
d311d28c 139 emacs_close (fd);
6b6e798b
RS
140 return Qnil;
141 }
37d54121 142
d177f194
JB
143 if (EMACS_KILLPG (pid, SIGINT) == 0)
144 {
d311d28c 145 ptrdiff_t 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;
d311d28c 156 emacs_close (fd);
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{
d311d28c 190 Lisp_Object infile, buffer, current_dir, path, cleanup_info_tail;
2f221583 191 bool display_p;
80856e74
JB
192 int fd[2];
193 int filefd;
4da256b1
KS
194#define CALLPROC_BUFFER_SIZE_MIN (16 * 1024)
195#define CALLPROC_BUFFER_SIZE_MAX (4 * CALLPROC_BUFFER_SIZE_MIN)
196 char buf[CALLPROC_BUFFER_SIZE_MAX];
197 int bufsize = CALLPROC_BUFFER_SIZE_MIN;
d311d28c
PE
198 ptrdiff_t count = SPECPDL_INDEX ();
199 USE_SAFE_ALLOCA;
2d607244 200
1aa83b22 201 register const unsigned char **new_argv;
39eaa782
RS
202 /* File to use for stderr in the child.
203 t means use same as standard output. */
204 Lisp_Object error_file;
1ef14cb4 205 Lisp_Object output_file = Qnil;
7e6c2178 206#ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
888c9e86 207 char *outf, *tempfile = NULL;
7e6c2178 208 int outfilefd;
d311d28c
PE
209 int pid;
210#else
211 pid_t pid;
80856e74 212#endif
1ef14cb4 213 int fd_output = -1;
32d08644
KH
214 struct coding_system process_coding; /* coding-system of process output */
215 struct coding_system argument_coding; /* coding-system of arguments */
09494912
RS
216 /* Set to the return value of Ffind_operation_coding_system. */
217 Lisp_Object coding_systems;
2f221583 218 bool output_to_buffer = 1;
09494912
RS
219
220 /* Qt denotes that Ffind_operation_coding_system is not yet called. */
221 coding_systems = Qt;
32d08644 222
b7826503 223 CHECK_STRING (args[0]);
80856e74 224
39eaa782
RS
225 error_file = Qt;
226
7e6c2178
RS
227#ifndef subprocesses
228 /* Without asynchronous processes we cannot have BUFFER == 0. */
177c0ea7 229 if (nargs >= 3
09ffb8b5 230 && (INTEGERP (CONSP (args[2]) ? XCAR (args[2]) : args[2])))
7e6c2178
RS
231 error ("Operating system cannot handle asynchronous subprocesses");
232#endif /* subprocesses */
233
09494912 234 /* Decide the coding-system for giving arguments. */
32d08644
KH
235 {
236 Lisp_Object val, *args2;
f66c7cf8 237 ptrdiff_t i;
32d08644
KH
238
239 /* If arguments are supplied, we may have to encode them. */
240 if (nargs >= 5)
241 {
2f221583 242 bool must_encode = 0;
6e50da0a 243 Lisp_Object coding_attrs;
30d57b8e 244
e7c1c20e 245 for (i = 4; i < nargs; i++)
b7826503 246 CHECK_STRING (args[i]);
e7c1c20e 247
a2286b5c 248 for (i = 4; i < nargs; i++)
30d57b8e
RS
249 if (STRING_MULTIBYTE (args[i]))
250 must_encode = 1;
251
beacaab3
KH
252 if (!NILP (Vcoding_system_for_write))
253 val = Vcoding_system_for_write;
30d57b8e 254 else if (! must_encode)
fcaf8878 255 val = Qraw_text;
beacaab3 256 else
32d08644 257 {
0065d054 258 SAFE_NALLOCA (args2, 1, nargs + 1);
32d08644
KH
259 args2[0] = Qcall_process;
260 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
08ee4e87 261 coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
fcaf8878 262 val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil;
32d08644 263 }
fcaf8878 264 val = complement_process_encoding_system (val);
32d08644 265 setup_coding_system (Fcheck_coding_system (val), &argument_coding);
6e50da0a
KH
266 coding_attrs = CODING_ID_ATTRS (argument_coding.id);
267 if (NILP (CODING_ATTR_ASCII_COMPAT (coding_attrs)))
268 {
269 /* We should not use an ASCII incompatible coding system. */
270 val = raw_text_coding_system (val);
271 setup_coding_system (val, &argument_coding);
272 }
32d08644 273 }
32d08644
KH
274 }
275
e576cab4
JB
276 if (nargs >= 2 && ! NILP (args[1]))
277 {
4b4deea2 278 infile = Fexpand_file_name (args[1], BVAR (current_buffer, directory));
b7826503 279 CHECK_STRING (infile);
e576cab4 280 }
80856e74 281 else
5437e9f9 282 infile = build_string (NULL_DEVICE);
80856e74 283
e576cab4
JB
284 if (nargs >= 3)
285 {
39eaa782
RS
286 buffer = args[2];
287
1ef14cb4
LMI
288 /* If BUFFER is a list, its meaning is (BUFFER-FOR-STDOUT
289 FILE-FOR-STDERR), unless the first element is :file, in which case see
290 the next paragraph. */
19ed11ba
AS
291 if (CONSP (buffer)
292 && (! SYMBOLP (XCAR (buffer))
293 || strcmp (SSDATA (SYMBOL_NAME (XCAR (buffer))), ":file")))
39eaa782 294 {
70949dac 295 if (CONSP (XCDR (buffer)))
45be8a1e 296 {
a9d4f28a 297 Lisp_Object stderr_file;
70949dac 298 stderr_file = XCAR (XCDR (buffer));
45be8a1e
RS
299
300 if (NILP (stderr_file) || EQ (Qt, stderr_file))
301 error_file = stderr_file;
302 else
303 error_file = Fexpand_file_name (stderr_file, Qnil);
304 }
305
70949dac 306 buffer = XCAR (buffer);
39eaa782 307 }
044512ed 308
1ef14cb4 309 /* If the buffer is (still) a list, it might be a (:file "file") spec. */
19ed11ba
AS
310 if (CONSP (buffer)
311 && SYMBOLP (XCAR (buffer))
312 && ! strcmp (SSDATA (SYMBOL_NAME (XCAR (buffer))), ":file"))
1ef14cb4
LMI
313 {
314 output_file = Fexpand_file_name (XCAR (XCDR (buffer)),
315 BVAR (current_buffer, directory));
316 CHECK_STRING (output_file);
317 buffer = Qnil;
318 }
319
39eaa782
RS
320 if (!(EQ (buffer, Qnil)
321 || EQ (buffer, Qt)
3ffde7d6 322 || INTEGERP (buffer)))
e576cab4 323 {
39eaa782
RS
324 Lisp_Object spec_buffer;
325 spec_buffer = buffer;
50fe359b 326 buffer = Fget_buffer_create (buffer);
39eaa782
RS
327 /* Mention the buffer name for a better error message. */
328 if (NILP (buffer))
b7826503
PJ
329 CHECK_BUFFER (spec_buffer);
330 CHECK_BUFFER (buffer);
e576cab4
JB
331 }
332 }
177c0ea7 333 else
e576cab4 334 buffer = Qnil;
80856e74 335
58616e67
JB
336 /* Make sure that the child will be able to chdir to the current
337 buffer's current directory, or its unhandled equivalent. We
338 can't just have the child check for an error when it does the
339 chdir, since it's in a vfork.
340
341 We have to GCPRO around this because Fexpand_file_name,
342 Funhandled_file_name_directory, and Ffile_accessible_directory_p
343 might call a file name handling function. The argument list is
344 protected by the caller, so all we really have to worry about is
345 buffer. */
346 {
1ef14cb4 347 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
58616e67 348
4b4deea2 349 current_dir = BVAR (current_buffer, directory);
58616e67 350
1ef14cb4 351 GCPRO5 (infile, buffer, current_dir, error_file, output_file);
58616e67 352
ca319910
SM
353 current_dir = Funhandled_file_name_directory (current_dir);
354 if (NILP (current_dir))
355 /* If the file name handler says that current_dir is unreachable, use
356 a sensible default. */
357 current_dir = build_string ("~/");
358 current_dir = expand_and_dir_to_file (current_dir, Qnil);
db8454b0
CY
359 current_dir = Ffile_name_as_directory (current_dir);
360
58616e67
JB
361 if (NILP (Ffile_accessible_directory_p (current_dir)))
362 report_file_error ("Setting current directory",
4b4deea2 363 Fcons (BVAR (current_buffer, directory), Qnil));
58616e67 364
34b87689
KH
365 if (STRING_MULTIBYTE (infile))
366 infile = ENCODE_FILE (infile);
367 if (STRING_MULTIBYTE (current_dir))
368 current_dir = ENCODE_FILE (current_dir);
369 if (STRINGP (error_file) && STRING_MULTIBYTE (error_file))
370 error_file = ENCODE_FILE (error_file);
1ef14cb4
LMI
371 if (STRINGP (output_file) && STRING_MULTIBYTE (output_file))
372 output_file = ENCODE_FILE (output_file);
58616e67
JB
373 UNGCPRO;
374 }
375
d311d28c 376 display_p = INTERACTIVE && nargs >= 4 && !NILP (args[3]);
80856e74 377
42a5b22f 378 filefd = emacs_open (SSDATA (infile), O_RDONLY, 0);
80856e74
JB
379 if (filefd < 0)
380 {
34b87689 381 infile = DECODE_FILE (infile);
e576cab4 382 report_file_error ("Opening process input file", Fcons (infile, Qnil));
80856e74 383 }
1ef14cb4
LMI
384
385 if (STRINGP (output_file))
386 {
387#ifdef DOS_NT
388 fd_output = emacs_open (SSDATA (output_file),
389 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
390 S_IREAD | S_IWRITE);
391#else /* not DOS_NT */
392 fd_output = creat (SSDATA (output_file), 0666);
393#endif /* not DOS_NT */
394 if (fd_output < 0)
395 {
396 output_file = DECODE_FILE (output_file);
397 report_file_error ("Opening process output file",
398 Fcons (output_file, Qnil));
19ed11ba 399 }
1ef14cb4 400 if (STRINGP (error_file) || NILP (error_file))
19ed11ba 401 output_to_buffer = 0;
1ef14cb4
LMI
402 }
403
80856e74 404 /* Search for program; barf if not found. */
c52b0b34 405 {
ad3aaf33 406 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
c52b0b34 407
ad3aaf33 408 GCPRO4 (infile, buffer, current_dir, error_file);
5c150961 409 openp (Vexec_path, args[0], Vexec_suffixes, &path, make_number (X_OK));
c52b0b34
KH
410 UNGCPRO;
411 }
012c6fcb 412 if (NILP (path))
80856e74 413 {
68c45bf0 414 emacs_close (filefd);
80856e74
JB
415 report_file_error ("Searching for program", Fcons (args[0], Qnil));
416 }
8ee8f447
RS
417
418 /* If program file name starts with /: for quoting a magic name,
419 discard that. */
420 if (SBYTES (path) > 2 && SREF (path, 0) == '/'
421 && SREF (path, 1) == ':')
422 path = Fsubstring (path, make_number (2), Qnil);
423
98c6f1e3 424 new_argv = SAFE_ALLOCA ((nargs > 4 ? nargs - 2 : 2) * sizeof *new_argv);
c364e618
KH
425 if (nargs > 4)
426 {
f66c7cf8 427 ptrdiff_t i;
ad3aaf33 428 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
c364e618 429
ad3aaf33 430 GCPRO5 (infile, buffer, current_dir, path, error_file);
c5bfa12b
KH
431 argument_coding.dst_multibyte = 0;
432 for (i = 4; i < nargs; i++)
c364e618 433 {
c5bfa12b
KH
434 argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]);
435 if (CODING_REQUIRE_ENCODING (&argument_coding))
91183bfd
KH
436 /* We must encode this argument. */
437 args[i] = encode_coding_string (&argument_coding, args[i], 1);
c364e618 438 }
c5bfa12b 439 UNGCPRO;
1aa83b22
AS
440 for (i = 4; i < nargs; i++)
441 new_argv[i - 3] = SDATA (args[i]);
442 new_argv[i - 3] = 0;
c364e618 443 }
db54baaa
KH
444 else
445 new_argv[1] = 0;
1aa83b22 446 new_argv[0] = SDATA (path);
80856e74 447
7e6c2178 448#ifdef MSDOS /* MW, July 1993 */
7e6c2178 449
888c9e86
EZ
450 /* If we're redirecting STDOUT to a file, that file is already open
451 on fd_output. */
1ef14cb4 452 if (fd_output < 0)
7e6c2178 453 {
888c9e86
EZ
454 if ((outf = egetenv ("TMPDIR")))
455 strcpy (tempfile = alloca (strlen (outf) + 20), outf);
456 else
457 {
458 tempfile = alloca (20);
459 *tempfile = '\0';
460 }
461 dostounix_filename (tempfile);
462 if (*tempfile == '\0' || tempfile[strlen (tempfile) - 1] != '/')
463 strcat (tempfile, "/");
464 strcat (tempfile, "detmp.XXX");
465 mktemp (tempfile);
1ef14cb4
LMI
466 outfilefd = creat (tempfile, S_IREAD | S_IWRITE);
467 if (outfilefd < 0) {
468 emacs_close (filefd);
469 report_file_error ("Opening process output file",
470 Fcons (build_string (tempfile), Qnil));
471 }
7e6c2178 472 }
1ef14cb4
LMI
473 else
474 outfilefd = fd_output;
6f89d28a 475 fd[0] = filefd;
2610078a 476 fd[1] = outfilefd;
6f89d28a 477#endif /* MSDOS */
7e6c2178 478
d50d3dc8 479 if (INTEGERP (buffer))
68c45bf0 480 fd[1] = emacs_open (NULL_DEVICE, O_WRONLY, 0), fd[0] = -1;
80856e74
JB
481 else
482 {
7e6c2178 483#ifndef MSDOS
db92b288
GM
484 errno = 0;
485 if (pipe (fd) == -1)
486 {
487 emacs_close (filefd);
488 report_file_error ("Creating process pipe", Qnil);
489 }
80856e74
JB
490#endif
491 }
492
493 {
494 /* child_setup must clobber environ in systems with true vfork.
495 Protect it from permanent change. */
496 register char **save_environ = environ;
497 register int fd1 = fd[1];
39eaa782 498 int fd_error = fd1;
80856e74 499
1ef14cb4
LMI
500 if (fd_output >= 0)
501 fd1 = fd_output;
80856e74
JB
502
503 /* Record that we're about to create a synchronous process. */
504 synch_process_alive = 1;
505
5c03767e
RS
506 /* These vars record information from process termination.
507 Clear them now before process can possibly terminate,
508 to avoid timing error if process terminates soon. */
509 synch_process_death = 0;
510 synch_process_retcode = 0;
6b61353c 511 synch_process_termsig = 0;
5c03767e 512
39eaa782 513 if (NILP (error_file))
68c45bf0 514 fd_error = emacs_open (NULL_DEVICE, O_WRONLY, 0);
39eaa782
RS
515 else if (STRINGP (error_file))
516 {
517#ifdef DOS_NT
42a5b22f 518 fd_error = emacs_open (SSDATA (error_file),
68c45bf0
PE
519 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
520 S_IREAD | S_IWRITE);
39eaa782 521#else /* not DOS_NT */
42a5b22f 522 fd_error = creat (SSDATA (error_file), 0666);
39eaa782
RS
523#endif /* not DOS_NT */
524 }
525
526 if (fd_error < 0)
527 {
68c45bf0 528 emacs_close (filefd);
6f89d28a 529 if (fd[0] != filefd)
68c45bf0 530 emacs_close (fd[0]);
39eaa782 531 if (fd1 >= 0)
68c45bf0 532 emacs_close (fd1);
6f89d28a
MB
533#ifdef MSDOS
534 unlink (tempfile);
535#endif
34b87689
KH
536 if (NILP (error_file))
537 error_file = build_string (NULL_DEVICE);
538 else if (STRINGP (error_file))
539 error_file = DECODE_FILE (error_file);
540 report_file_error ("Cannot redirect stderr", Fcons (error_file, Qnil));
39eaa782 541 }
89e1ec1d 542
2610078a 543#ifdef MSDOS /* MW, July 1993 */
c17c4250 544 /* Note that on MSDOS `child_setup' actually returns the child process
2610078a
KH
545 exit status, not its PID, so we assign it to `synch_process_retcode'
546 below. */
c17c4250
EZ
547 pid = child_setup (filefd, outfilefd, fd_error, (char **) new_argv,
548 0, current_dir);
39eaa782 549
2610078a
KH
550 /* Record that the synchronous process exited and note its
551 termination status. */
552 synch_process_alive = 0;
553 synch_process_retcode = pid;
554 if (synch_process_retcode < 0) /* means it couldn't be exec'ed */
68c45bf0 555 {
ca9c0567 556 synchronize_system_messages_locale ();
68c45bf0
PE
557 synch_process_death = strerror (errno);
558 }
2610078a 559
68c45bf0 560 emacs_close (outfilefd);
2610078a 561 if (fd_error != outfilefd)
68c45bf0 562 emacs_close (fd_error);
2610078a 563 fd1 = -1; /* No harm in closing that one! */
888c9e86 564 if (tempfile)
2610078a 565 {
888c9e86
EZ
566 /* Since CRLF is converted to LF within `decode_coding', we
567 can always open a file with binary mode. */
568 fd[0] = emacs_open (tempfile, O_RDONLY | O_BINARY, 0);
569 if (fd[0] < 0)
570 {
571 unlink (tempfile);
572 emacs_close (filefd);
573 report_file_error ("Cannot re-open temporary file",
7285dc67 574 Fcons (build_string (tempfile), Qnil));
888c9e86 575 }
2610078a 576 }
888c9e86
EZ
577 else
578 fd[0] = -1; /* We are not going to read from tempfile. */
2610078a 579#else /* not MSDOS */
bad95d8f 580#ifdef WINDOWSNT
2d607244
RS
581 pid = child_setup (filefd, fd1, fd_error, (char **) new_argv,
582 0, current_dir);
bad95d8f 583#else /* not WINDOWSNT */
c0ad4ea5 584
aba637ec
KS
585 BLOCK_INPUT;
586
db6c0e74 587 /* vfork, and prevent local vars from being clobbered by the vfork. */
b08a63cc 588 {
c74e9d86
PE
589 Lisp_Object volatile buffer_volatile = buffer;
590 Lisp_Object volatile coding_systems_volatile = coding_systems;
591 Lisp_Object volatile current_dir_volatile = current_dir;
2f221583
PE
592 bool volatile display_p_volatile = display_p;
593 bool volatile output_to_buffer_volatile = output_to_buffer;
594 bool volatile sa_must_free_volatile = sa_must_free;
5266b4bb 595 int volatile fd1_volatile = fd1;
db6c0e74
PE
596 int volatile fd_error_volatile = fd_error;
597 int volatile fd_output_volatile = fd_output;
d311d28c 598 ptrdiff_t volatile sa_count_volatile = sa_count;
db6c0e74 599 unsigned char const **volatile new_argv_volatile = new_argv;
80856e74 600
db6c0e74 601 pid = vfork ();
80856e74 602
c74e9d86
PE
603 buffer = buffer_volatile;
604 coding_systems = coding_systems_volatile;
605 current_dir = current_dir_volatile;
d311d28c 606 display_p = display_p_volatile;
5266b4bb 607 fd1 = fd1_volatile;
db6c0e74
PE
608 fd_error = fd_error_volatile;
609 fd_output = fd_output_volatile;
610 output_to_buffer = output_to_buffer_volatile;
12b3abd5 611 sa_must_free = sa_must_free_volatile;
d311d28c 612 sa_count = sa_count_volatile;
db6c0e74
PE
613 new_argv = new_argv_volatile;
614 }
b9c7f648 615
80856e74
JB
616 if (pid == 0)
617 {
618 if (fd[0] >= 0)
68c45bf0 619 emacs_close (fd[0]);
1e7963c7 620#ifdef HAVE_SETSID
19ed11ba 621 setsid ();
1e7963c7 622#endif
58eb6cf0 623#if defined (USG)
19ed11ba 624 setpgrp ();
80856e74 625#else
19ed11ba 626 setpgrp (pid, pid);
80856e74 627#endif /* USG */
c0ad4ea5 628
2f9a22e2 629 /* GConf causes us to ignore SIGPIPE, make sure it is restored
c0ad4ea5 630 in the child. */
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
KS
636
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
979 BLOCK_INPUT;
980 fd = mkstemp (tempfile);
981 UNBLOCK_INPUT;
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}