(setpgrp): Don't define it here because this
[bpt/emacs.git] / src / callproc.c
CommitLineData
80856e74 1/* Synchronous subprocess invocation for GNU Emacs.
68c45bf0 2 Copyright (C) 1985, 86,87,88,93,94,95, 1999 Free Software Foundation, Inc.
80856e74
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
826c56ac 8the Free Software Foundation; either version 2, or (at your option)
80856e74
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
3b7ad313
EN
18the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
80856e74
JB
20
21
68c45bf0 22#include <config.h>
80856e74 23#include <signal.h>
e576cab4 24#include <errno.h>
565620a5 25#include <stdio.h>
80856e74 26
426b37ae 27extern int errno;
426b37ae 28
80856e74
JB
29/* Define SIGCHLD as an alias for SIGCLD. */
30
31#if !defined (SIGCHLD) && defined (SIGCLD)
32#define SIGCHLD SIGCLD
33#endif /* SIGCLD */
34
35#include <sys/types.h>
88a64fef 36
3cbd6585
GM
37#ifdef HAVE_UNISTD_H
38#include <unistd.h>
39#endif
40
80856e74
JB
41#include <sys/file.h>
42#ifdef USG5
472e83fe 43#define INCLUDED_FCNTL
80856e74
JB
44#include <fcntl.h>
45#endif
46
bad95d8f
RS
47#ifdef WINDOWSNT
48#define NOMINMAX
49#include <windows.h>
50#include <stdlib.h> /* for proper declaration of environ */
51#include <fcntl.h>
489f9371 52#include "w32.h"
bad95d8f
RS
53#define _P_NOWAIT 1 /* from process.h */
54#endif
55
7e6c2178 56#ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
472e83fe 57#define INCLUDED_FCNTL
7e6c2178
RS
58#include <fcntl.h>
59#include <sys/stat.h>
60#include <sys/param.h>
61#include <errno.h>
62#endif /* MSDOS */
63
80856e74
JB
64#ifndef O_RDONLY
65#define O_RDONLY 0
66#endif
67
68#ifndef O_WRONLY
69#define O_WRONLY 1
70#endif
71
72#include "lisp.h"
73#include "commands.h"
74#include "buffer.h"
32d08644 75#include "charset.h"
edf496dd 76#include "ccl.h"
32d08644 77#include "coding.h"
57bda87a 78#include <epaths.h>
80856e74 79#include "process.h"
d177f194 80#include "syssignal.h"
a129418f 81#include "systty.h"
80856e74 82
5f027cea
EZ
83#ifdef MSDOS
84#include "msdos.h"
85#endif
86
80856e74
JB
87#ifdef VMS
88extern noshare char **environ;
89#else
90extern char **environ;
91#endif
92
93#define max(a, b) ((a) > (b) ? (a) : (b))
94
35a2f4b8 95Lisp_Object Vexec_path, Vexec_directory, Vdata_directory, Vdoc_directory;
ed61592a 96Lisp_Object Vconfigure_info_directory;
8abd035b 97Lisp_Object Vtemp_file_name_pattern;
80856e74
JB
98
99Lisp_Object Vshell_file_name;
100
80856e74 101Lisp_Object Vprocess_environment;
80856e74 102
bad95d8f 103#ifdef DOS_NT
093650fe 104Lisp_Object Qbuffer_file_type;
bad95d8f 105#endif /* DOS_NT */
093650fe 106
80856e74
JB
107/* True iff we are about to fork off a synchronous process or if we
108 are waiting for it. */
109int synch_process_alive;
110
111/* Nonzero => this is a string explaining death of synchronous subprocess. */
112char *synch_process_death;
113
114/* If synch_process_death is zero,
115 this is exit code of synchronous subprocess. */
116int synch_process_retcode;
8de15d69
RS
117
118extern Lisp_Object Vdoc_file_name;
89e1ec1d 119
8d024345 120extern Lisp_Object Vfile_name_coding_system, Vdefault_file_name_coding_system;
80856e74 121\f
37d54121
RS
122/* Clean up when exiting Fcall_process.
123 On MSDOS, delete the temporary file on any kind of termination.
124 On Unix, kill the process and any children on termination by signal. */
125
126/* Nonzero if this is termination due to exit. */
127static int call_process_exited;
128
80856e74
JB
129#ifndef VMS /* VMS version is in vmsproc.c. */
130
d177f194
JB
131static Lisp_Object
132call_process_kill (fdpid)
133 Lisp_Object fdpid;
134{
68c45bf0 135 emacs_close (XFASTINT (Fcar (fdpid)));
d177f194
JB
136 EMACS_KILLPG (XFASTINT (Fcdr (fdpid)), SIGKILL);
137 synch_process_alive = 0;
138 return Qnil;
139}
140
80856e74
JB
141Lisp_Object
142call_process_cleanup (fdpid)
143 Lisp_Object fdpid;
144{
052062e0 145#if defined (MSDOS) || defined (macintosh)
7e6c2178 146 /* for MSDOS fdpid is really (fd . tempfile) */
c1350752
KH
147 register Lisp_Object file;
148 file = Fcdr (fdpid);
68c45bf0 149 emacs_close (XFASTINT (Fcar (fdpid)));
7e6c2178
RS
150 if (strcmp (XSTRING (file)-> data, NULL_DEVICE) != 0)
151 unlink (XSTRING (file)->data);
052062e0 152#else /* not MSDOS and not macintosh */
d177f194
JB
153 register int pid = XFASTINT (Fcdr (fdpid));
154
37d54121 155 if (call_process_exited)
6b6e798b 156 {
68c45bf0 157 emacs_close (XFASTINT (Fcar (fdpid)));
6b6e798b
RS
158 return Qnil;
159 }
37d54121 160
d177f194
JB
161 if (EMACS_KILLPG (pid, SIGINT) == 0)
162 {
163 int count = specpdl_ptr - specpdl;
164 record_unwind_protect (call_process_kill, fdpid);
165 message1 ("Waiting for process to die...(type C-g again to kill it instantly)");
166 immediate_quit = 1;
167 QUIT;
168 wait_for_termination (pid);
169 immediate_quit = 0;
170 specpdl_ptr = specpdl + count; /* Discard the unwind protect. */
171 message1 ("Waiting for process to die...done");
172 }
80856e74 173 synch_process_alive = 0;
68c45bf0 174 emacs_close (XFASTINT (Fcar (fdpid)));
7e6c2178 175#endif /* not MSDOS */
80856e74
JB
176 return Qnil;
177}
178
179DEFUN ("call-process", Fcall_process, Scall_process, 1, MANY, 0,
180 "Call PROGRAM synchronously in separate process.\n\
edf496dd 181The remaining arguments are optional.\n\
80856e74
JB
182The program's input comes from file INFILE (nil means `/dev/null').\n\
183Insert output in BUFFER before point; t means current buffer;\n\
184 nil for BUFFER means discard it; 0 means discard and don't wait.\n\
39eaa782
RS
185BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,\n\
186REAL-BUFFER says what to do with standard output, as above,\n\
187while STDERR-FILE says what to do with standard error in the child.\n\
188STDERR-FILE may be nil (discard standard error output),\n\
189t (mix it with ordinary output), or a file name string.\n\
190\n\
80856e74
JB
191Fourth arg DISPLAY non-nil means redisplay buffer as output is inserted.\n\
192Remaining arguments are strings passed as command arguments to PROGRAM.\n\
39eaa782
RS
193\n\
194If BUFFER is 0, `call-process' returns immediately with value nil.\n\
195Otherwise it waits for PROGRAM to terminate\n\
e576cab4 196and returns a numeric exit status or a signal description string.\n\
d177f194 197If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
80856e74
JB
198 (nargs, args)
199 int nargs;
200 register Lisp_Object *args;
201{
58616e67 202 Lisp_Object infile, buffer, current_dir, display, path;
80856e74
JB
203 int fd[2];
204 int filefd;
205 register int pid;
6e3bfbb2
RS
206 char buf[16384];
207 char *bufptr = buf;
208 int bufsize = 16384;
80856e74 209 int count = specpdl_ptr - specpdl;
2d607244 210
80856e74
JB
211 register unsigned char **new_argv
212 = (unsigned char **) alloca ((max (2, nargs - 2)) * sizeof (char *));
213 struct buffer *old = current_buffer;
39eaa782
RS
214 /* File to use for stderr in the child.
215 t means use same as standard output. */
216 Lisp_Object error_file;
7e6c2178
RS
217#ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
218 char *outf, *tempfile;
219 int outfilefd;
220#endif
052062e0
RS
221#ifdef macintosh
222 char *tempfile;
223 int outfilefd;
224#endif
80856e74
JB
225#if 0
226 int mask;
227#endif
32d08644
KH
228 struct coding_system process_coding; /* coding-system of process output */
229 struct coding_system argument_coding; /* coding-system of arguments */
09494912
RS
230 /* Set to the return value of Ffind_operation_coding_system. */
231 Lisp_Object coding_systems;
232
233 /* Qt denotes that Ffind_operation_coding_system is not yet called. */
234 coding_systems = Qt;
32d08644 235
80856e74
JB
236 CHECK_STRING (args[0], 0);
237
39eaa782
RS
238 error_file = Qt;
239
7e6c2178
RS
240#ifndef subprocesses
241 /* Without asynchronous processes we cannot have BUFFER == 0. */
3ffde7d6 242 if (nargs >= 3
09ffb8b5 243 && (INTEGERP (CONSP (args[2]) ? XCAR (args[2]) : args[2])))
7e6c2178
RS
244 error ("Operating system cannot handle asynchronous subprocesses");
245#endif /* subprocesses */
246
09494912 247 /* Decide the coding-system for giving arguments. */
32d08644
KH
248 {
249 Lisp_Object val, *args2;
32d08644
KH
250 int i;
251
252 /* If arguments are supplied, we may have to encode them. */
253 if (nargs >= 5)
254 {
30d57b8e
RS
255 int must_encode = 0;
256
e7c1c20e
RS
257 for (i = 4; i < nargs; i++)
258 CHECK_STRING (args[i], i);
259
a2286b5c 260 for (i = 4; i < nargs; i++)
30d57b8e
RS
261 if (STRING_MULTIBYTE (args[i]))
262 must_encode = 1;
263
beacaab3
KH
264 if (!NILP (Vcoding_system_for_write))
265 val = Vcoding_system_for_write;
30d57b8e 266 else if (! must_encode)
beacaab3
KH
267 val = Qnil;
268 else
32d08644
KH
269 {
270 args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2);
271 args2[0] = Qcall_process;
272 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
08ee4e87 273 coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
776b95cb 274 if (CONSP (coding_systems))
70949dac 275 val = XCDR (coding_systems);
776b95cb 276 else if (CONSP (Vdefault_process_coding_system))
70949dac 277 val = XCDR (Vdefault_process_coding_system);
beacaab3
KH
278 else
279 val = Qnil;
32d08644
KH
280 }
281 setup_coding_system (Fcheck_coding_system (val), &argument_coding);
282 }
32d08644
KH
283 }
284
e576cab4
JB
285 if (nargs >= 2 && ! NILP (args[1]))
286 {
287 infile = Fexpand_file_name (args[1], current_buffer->directory);
288 CHECK_STRING (infile, 1);
289 }
80856e74 290 else
5437e9f9 291 infile = build_string (NULL_DEVICE);
80856e74 292
e576cab4
JB
293 if (nargs >= 3)
294 {
39eaa782
RS
295 buffer = args[2];
296
297 /* If BUFFER is a list, its meaning is
298 (BUFFER-FOR-STDOUT FILE-FOR-STDERR). */
299 if (CONSP (buffer))
300 {
70949dac 301 if (CONSP (XCDR (buffer)))
45be8a1e 302 {
a9d4f28a 303 Lisp_Object stderr_file;
70949dac 304 stderr_file = XCAR (XCDR (buffer));
45be8a1e
RS
305
306 if (NILP (stderr_file) || EQ (Qt, stderr_file))
307 error_file = stderr_file;
308 else
309 error_file = Fexpand_file_name (stderr_file, Qnil);
310 }
311
70949dac 312 buffer = XCAR (buffer);
39eaa782 313 }
044512ed 314
39eaa782
RS
315 if (!(EQ (buffer, Qnil)
316 || EQ (buffer, Qt)
3ffde7d6 317 || INTEGERP (buffer)))
e576cab4 318 {
39eaa782
RS
319 Lisp_Object spec_buffer;
320 spec_buffer = buffer;
50fe359b 321 buffer = Fget_buffer_create (buffer);
39eaa782
RS
322 /* Mention the buffer name for a better error message. */
323 if (NILP (buffer))
324 CHECK_BUFFER (spec_buffer, 2);
e576cab4
JB
325 CHECK_BUFFER (buffer, 2);
326 }
327 }
328 else
329 buffer = Qnil;
80856e74 330
58616e67
JB
331 /* Make sure that the child will be able to chdir to the current
332 buffer's current directory, or its unhandled equivalent. We
333 can't just have the child check for an error when it does the
334 chdir, since it's in a vfork.
335
336 We have to GCPRO around this because Fexpand_file_name,
337 Funhandled_file_name_directory, and Ffile_accessible_directory_p
338 might call a file name handling function. The argument list is
339 protected by the caller, so all we really have to worry about is
340 buffer. */
341 {
342 struct gcpro gcpro1, gcpro2, gcpro3;
343
344 current_dir = current_buffer->directory;
345
346 GCPRO3 (infile, buffer, current_dir);
347
c52b0b34
KH
348 current_dir
349 = expand_and_dir_to_file (Funhandled_file_name_directory (current_dir),
350 Qnil);
58616e67
JB
351 if (NILP (Ffile_accessible_directory_p (current_dir)))
352 report_file_error ("Setting current directory",
353 Fcons (current_buffer->directory, Qnil));
354
355 UNGCPRO;
356 }
357
e576cab4 358 display = nargs >= 4 ? args[3] : Qnil;
80856e74 359
68c45bf0 360 filefd = emacs_open (XSTRING (infile)->data, O_RDONLY, 0);
80856e74
JB
361 if (filefd < 0)
362 {
e576cab4 363 report_file_error ("Opening process input file", Fcons (infile, Qnil));
80856e74
JB
364 }
365 /* Search for program; barf if not found. */
c52b0b34
KH
366 {
367 struct gcpro gcpro1;
368
369 GCPRO1 (current_dir);
370 openp (Vexec_path, args[0], EXEC_SUFFIXES, &path, 1);
371 UNGCPRO;
372 }
012c6fcb 373 if (NILP (path))
80856e74 374 {
68c45bf0 375 emacs_close (filefd);
80856e74
JB
376 report_file_error ("Searching for program", Fcons (args[0], Qnil));
377 }
378 new_argv[0] = XSTRING (path)->data;
c364e618
KH
379 if (nargs > 4)
380 {
381 register int i;
c5bfa12b 382 struct gcpro gcpro1, gcpro2, gcpro3;
c364e618 383
c5bfa12b
KH
384 GCPRO3 (infile, buffer, current_dir);
385 argument_coding.dst_multibyte = 0;
386 for (i = 4; i < nargs; i++)
c364e618 387 {
c5bfa12b
KH
388 argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]);
389 if (CODING_REQUIRE_ENCODING (&argument_coding))
c364e618 390 {
c5bfa12b
KH
391 /* We must encode this argument. */
392 args[i] = encode_coding_string (args[i], &argument_coding, 1);
393 if (argument_coding.type == coding_type_ccl)
394 setup_ccl_program (&(argument_coding.spec.ccl.encoder), Qnil);
c364e618 395 }
c5bfa12b 396 new_argv[i - 3] = XSTRING (args[i])->data;
c364e618 397 }
c5bfa12b 398 UNGCPRO;
db54baaa 399 new_argv[nargs - 3] = 0;
c364e618 400 }
db54baaa
KH
401 else
402 new_argv[1] = 0;
80856e74 403
7e6c2178 404#ifdef MSDOS /* MW, July 1993 */
8a52365c 405 if ((outf = egetenv ("TMPDIR")))
7e6c2178
RS
406 strcpy (tempfile = alloca (strlen (outf) + 20), outf);
407 else
408 {
409 tempfile = alloca (20);
410 *tempfile = '\0';
411 }
412 dostounix_filename (tempfile);
413 if (*tempfile == '\0' || tempfile[strlen (tempfile) - 1] != '/')
414 strcat (tempfile, "/");
415 strcat (tempfile, "detmp.XXX");
416 mktemp (tempfile);
417
418 outfilefd = creat (tempfile, S_IREAD | S_IWRITE);
419 if (outfilefd < 0)
420 {
68c45bf0 421 emacs_close (filefd);
6f89d28a
MB
422 report_file_error ("Opening process output file",
423 Fcons (build_string (tempfile), Qnil));
7e6c2178 424 }
6f89d28a 425 fd[0] = filefd;
2610078a 426 fd[1] = outfilefd;
6f89d28a 427#endif /* MSDOS */
7e6c2178 428
052062e0
RS
429#ifdef macintosh
430 /* Since we don't have pipes on the Mac, create a temporary file to
431 hold the output of the subprocess. */
432 tempfile = (char *) alloca (STRING_BYTES (XSTRING (Vtemp_file_name_pattern)) + 1);
433 bcopy (XSTRING (Vtemp_file_name_pattern)->data, tempfile,
434 STRING_BYTES (XSTRING (Vtemp_file_name_pattern)) + 1);
435
436 mktemp (tempfile);
437
438 outfilefd = creat (tempfile, S_IREAD | S_IWRITE);
439 if (outfilefd < 0)
440 {
441 close (filefd);
442 report_file_error ("Opening process output file",
443 Fcons (build_string (tempfile), Qnil));
444 }
445 fd[0] = filefd;
446 fd[1] = outfilefd;
447#endif /* macintosh */
448
d50d3dc8 449 if (INTEGERP (buffer))
68c45bf0 450 fd[1] = emacs_open (NULL_DEVICE, O_WRONLY, 0), fd[0] = -1;
80856e74
JB
451 else
452 {
7e6c2178 453#ifndef MSDOS
052062e0 454#ifndef macintosh
80856e74 455 pipe (fd);
7e6c2178 456#endif
052062e0 457#endif
80856e74
JB
458#if 0
459 /* Replaced by close_process_descs */
460 set_exclusive_use (fd[0]);
461#endif
462 }
463
464 {
465 /* child_setup must clobber environ in systems with true vfork.
466 Protect it from permanent change. */
467 register char **save_environ = environ;
468 register int fd1 = fd[1];
39eaa782 469 int fd_error = fd1;
80856e74
JB
470
471#if 0 /* Some systems don't have sigblock. */
e065a56e 472 mask = sigblock (sigmask (SIGCHLD));
80856e74
JB
473#endif
474
475 /* Record that we're about to create a synchronous process. */
476 synch_process_alive = 1;
477
5c03767e
RS
478 /* These vars record information from process termination.
479 Clear them now before process can possibly terminate,
480 to avoid timing error if process terminates soon. */
481 synch_process_death = 0;
482 synch_process_retcode = 0;
483
39eaa782 484 if (NILP (error_file))
68c45bf0 485 fd_error = emacs_open (NULL_DEVICE, O_WRONLY, 0);
39eaa782
RS
486 else if (STRINGP (error_file))
487 {
488#ifdef DOS_NT
68c45bf0
PE
489 fd_error = emacs_open (XSTRING (error_file)->data,
490 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
491 S_IREAD | S_IWRITE);
39eaa782
RS
492#else /* not DOS_NT */
493 fd_error = creat (XSTRING (error_file)->data, 0666);
494#endif /* not DOS_NT */
495 }
496
497 if (fd_error < 0)
498 {
68c45bf0 499 emacs_close (filefd);
6f89d28a 500 if (fd[0] != filefd)
68c45bf0 501 emacs_close (fd[0]);
39eaa782 502 if (fd1 >= 0)
68c45bf0 503 emacs_close (fd1);
6f89d28a
MB
504#ifdef MSDOS
505 unlink (tempfile);
506#endif
507 report_file_error ("Cannot redirect stderr",
508 Fcons ((NILP (error_file)
509 ? build_string (NULL_DEVICE) : error_file),
510 Qnil));
39eaa782 511 }
89e1ec1d 512
8d024345 513 current_dir = ENCODE_FILE (current_dir);
89e1ec1d 514
052062e0
RS
515#ifdef macintosh
516 {
517 /* Call run_mac_command in sysdep.c here directly instead of doing
518 a child_setup as for MSDOS and other platforms. Note that this
519 code does not handle passing the environment to the synchronous
520 Mac subprocess. */
521 char *infn, *outfn, *errfn, *currdn;
522
523 /* close these files so subprocess can write to them */
524 close (outfilefd);
525 if (fd_error != outfilefd)
526 close (fd_error);
527 fd1 = -1; /* No harm in closing that one! */
528
529 infn = XSTRING (infile)->data;
530 outfn = tempfile;
531 if (NILP (error_file))
532 errfn = NULL_DEVICE;
533 else if (EQ (Qt, error_file))
534 errfn = outfn;
535 else
536 errfn = XSTRING (error_file)->data;
537 currdn = XSTRING (current_dir)->data;
538 pid = run_mac_command (new_argv, currdn, infn, outfn, errfn);
539
540 /* Record that the synchronous process exited and note its
541 termination status. */
542 synch_process_alive = 0;
543 synch_process_retcode = pid;
544 if (synch_process_retcode < 0) /* means it couldn't be exec'ed */
68c45bf0 545 {
ca9c0567 546 synchronize_system_messages_locale ();
68c45bf0
PE
547 synch_process_death = strerror (errno);
548 }
052062e0
RS
549
550 /* Since CRLF is converted to LF within `decode_coding', we can
551 always open a file with binary mode. */
552 fd[0] = open (tempfile, O_BINARY);
553 if (fd[0] < 0)
554 {
555 unlink (tempfile);
556 close (filefd);
557 report_file_error ("Cannot re-open temporary file", Qnil);
558 }
559 }
560#else /* not macintosh */
2610078a 561#ifdef MSDOS /* MW, July 1993 */
c17c4250 562 /* Note that on MSDOS `child_setup' actually returns the child process
2610078a
KH
563 exit status, not its PID, so we assign it to `synch_process_retcode'
564 below. */
c17c4250
EZ
565 pid = child_setup (filefd, outfilefd, fd_error, (char **) new_argv,
566 0, current_dir);
39eaa782 567
2610078a
KH
568 /* Record that the synchronous process exited and note its
569 termination status. */
570 synch_process_alive = 0;
571 synch_process_retcode = pid;
572 if (synch_process_retcode < 0) /* means it couldn't be exec'ed */
68c45bf0 573 {
ca9c0567 574 synchronize_system_messages_locale ();
68c45bf0
PE
575 synch_process_death = strerror (errno);
576 }
2610078a 577
68c45bf0 578 emacs_close (outfilefd);
2610078a 579 if (fd_error != outfilefd)
68c45bf0 580 emacs_close (fd_error);
2610078a 581 fd1 = -1; /* No harm in closing that one! */
32d08644
KH
582 /* Since CRLF is converted to LF within `decode_coding', we can
583 always open a file with binary mode. */
68c45bf0 584 fd[0] = emacs_open (tempfile, O_RDONLY | O_BINARY, 0);
2610078a
KH
585 if (fd[0] < 0)
586 {
587 unlink (tempfile);
68c45bf0 588 emacs_close (filefd);
2610078a
KH
589 report_file_error ("Cannot re-open temporary file", Qnil);
590 }
591#else /* not MSDOS */
bad95d8f 592#ifdef WINDOWSNT
2d607244
RS
593 pid = child_setup (filefd, fd1, fd_error, (char **) new_argv,
594 0, current_dir);
bad95d8f 595#else /* not WINDOWSNT */
80856e74
JB
596 pid = vfork ();
597
598 if (pid == 0)
599 {
600 if (fd[0] >= 0)
68c45bf0 601 emacs_close (fd[0]);
1e7963c7
RS
602#ifdef HAVE_SETSID
603 setsid ();
604#endif
605#if defined (USG) && !defined (BSD_PGRPS)
80856e74
JB
606 setpgrp ();
607#else
608 setpgrp (pid, pid);
609#endif /* USG */
2d607244
RS
610 child_setup (filefd, fd1, fd_error, (char **) new_argv,
611 0, current_dir);
80856e74 612 }
bad95d8f 613#endif /* not WINDOWSNT */
cd5f8f60
RS
614
615 /* The MSDOS case did this already. */
616 if (fd_error >= 0)
68c45bf0 617 emacs_close (fd_error);
2610078a 618#endif /* not MSDOS */
052062e0 619#endif /* not macintosh */
80856e74 620
80856e74
JB
621 environ = save_environ;
622
6b6e798b
RS
623 /* Close most of our fd's, but not fd[0]
624 since we will use that to read input from. */
68c45bf0 625 emacs_close (filefd);
799abb26 626 if (fd1 >= 0 && fd1 != fd_error)
68c45bf0 627 emacs_close (fd1);
80856e74
JB
628 }
629
630 if (pid < 0)
631 {
6b6e798b 632 if (fd[0] >= 0)
68c45bf0 633 emacs_close (fd[0]);
80856e74
JB
634 report_file_error ("Doing vfork", Qnil);
635 }
636
d50d3dc8 637 if (INTEGERP (buffer))
80856e74 638 {
6b6e798b 639 if (fd[0] >= 0)
68c45bf0 640 emacs_close (fd[0]);
80856e74 641#ifndef subprocesses
e576cab4
JB
642 /* If Emacs has been built with asynchronous subprocess support,
643 we don't need to do this, I think because it will then have
644 the facilities for handling SIGCHLD. */
80856e74
JB
645 wait_without_blocking ();
646#endif /* subprocesses */
80856e74
JB
647 return Qnil;
648 }
649
6b6e798b 650 /* Enable sending signal if user quits below. */
37d54121
RS
651 call_process_exited = 0;
652
052062e0 653#if defined(MSDOS) || defined(macintosh)
7e6c2178
RS
654 /* MSDOS needs different cleanup information. */
655 record_unwind_protect (call_process_cleanup,
656 Fcons (make_number (fd[0]), build_string (tempfile)));
657#else
80856e74
JB
658 record_unwind_protect (call_process_cleanup,
659 Fcons (make_number (fd[0]), make_number (pid)));
052062e0 660#endif /* not MSDOS and not macintosh */
80856e74
JB
661
662
d50d3dc8 663 if (BUFFERP (buffer))
80856e74
JB
664 Fset_buffer (buffer);
665
09494912
RS
666 if (NILP (buffer))
667 {
668 /* If BUFFER is nil, we must read process output once and then
669 discard it, so setup coding system but with nil. */
670 setup_coding_system (Qnil, &process_coding);
671 }
672 else
673 {
674 Lisp_Object val, *args2;
675
676 val = Qnil;
677 if (!NILP (Vcoding_system_for_read))
678 val = Vcoding_system_for_read;
679 else
680 {
681 if (EQ (coding_systems, Qt))
682 {
683 int i;
684
685 args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2);
686 args2[0] = Qcall_process;
687 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
688 coding_systems
689 = Ffind_operation_coding_system (nargs + 1, args2);
690 }
691 if (CONSP (coding_systems))
70949dac 692 val = XCAR (coding_systems);
09494912 693 else if (CONSP (Vdefault_process_coding_system))
70949dac 694 val = XCAR (Vdefault_process_coding_system);
09494912
RS
695 else
696 val = Qnil;
697 }
698 setup_coding_system (Fcheck_coding_system (val), &process_coding);
699 /* In unibyte mode, character code conversion should not take
700 place but EOL conversion should. So, setup raw-text or one
701 of the subsidiary according to the information just setup. */
702 if (NILP (current_buffer->enable_multibyte_characters)
703 && !NILP (val))
704 setup_raw_text_coding_system (&process_coding);
705 }
c5bfa12b
KH
706 process_coding.src_multibyte = 0;
707 process_coding.dst_multibyte
708 = (BUFFERP (buffer)
709 ? ! NILP (XBUFFER (buffer)->enable_multibyte_characters)
710 : ! NILP (current_buffer->enable_multibyte_characters));
09494912 711
80856e74
JB
712 immediate_quit = 1;
713 QUIT;
714
715 {
716 register int nread;
0ad477db 717 int first = 1;
6e3bfbb2 718 int total_read = 0;
321fecde 719 int carryover = 0;
7a7ab107 720 int display_on_the_fly = !NILP (display) && INTERACTIVE;
05b44e90
KH
721 struct coding_system saved_coding;
722
723 saved_coding = process_coding;
80856e74 724
60558b19 725 while (1)
80856e74 726 {
60558b19
RS
727 /* Repeatedly read until we've filled as much as possible
728 of the buffer size we have. But don't read
8e6208c5 729 less than 1024--save that for the next bufferful. */
321fecde 730 nread = carryover;
60558b19 731 while (nread < bufsize - 1024)
00fb3e95 732 {
68c45bf0
PE
733 int this_read = emacs_read (fd[0], bufptr + nread,
734 bufsize - nread);
60558b19
RS
735
736 if (this_read < 0)
737 goto give_up;
738
739 if (this_read == 0)
7a7ab107
KH
740 {
741 process_coding.mode |= CODING_MODE_LAST_BLOCK;
742 break;
743 }
60558b19
RS
744
745 nread += this_read;
7a7ab107 746 total_read += this_read;
60558b19 747
7a7ab107
KH
748 if (display_on_the_fly)
749 break;
750 }
60558b19
RS
751
752 /* Now NREAD is the total amount of data in the buffer. */
80856e74 753 immediate_quit = 0;
6e3bfbb2 754
012c6fcb 755 if (!NILP (buffer))
32d08644 756 {
c5bfa12b
KH
757 if (! CODING_MAY_REQUIRE_DECODING (&process_coding))
758 insert_1_both (bufptr, nread, nread, 0, 1, 0);
32d08644
KH
759 else
760 { /* We have to decode the input. */
321fecde 761 int size = decoding_buffer_size (&process_coding, nread);
a871dd58 762 char *decoding_buf = (char *) xmalloc (size);
32d08644 763
321fecde
KH
764 decode_coding (&process_coding, bufptr, decoding_buf,
765 nread, size);
7a7ab107
KH
766 if (display_on_the_fly
767 && saved_coding.type == coding_type_undecided
768 && process_coding.type != coding_type_undecided)
769 {
770 /* We have detected some coding system. But,
771 there's a possibility that the detection was
772 done by insufficient data. So, we give up
773 displaying on the fly. */
a871dd58 774 xfree (decoding_buf);
7a7ab107
KH
775 display_on_the_fly = 0;
776 process_coding = saved_coding;
777 carryover = nread;
778 continue;
779 }
321fecde 780 if (process_coding.produced > 0)
c5bfa12b
KH
781 insert_1_both (decoding_buf, process_coding.produced_char,
782 process_coding.produced, 0, 1, 0);
a871dd58 783 xfree (decoding_buf);
11218c68 784 carryover = nread - process_coding.consumed;
321fecde 785 if (carryover > 0)
c5bfa12b
KH
786 /* As CARRYOVER should not be that large, we had
787 better avoid overhead of bcopy. */
788 BCOPY_SHORT (bufptr + process_coding.consumed, bufptr,
789 carryover);
32d08644
KH
790 }
791 }
c5bfa12b 792
321fecde 793 if (process_coding.mode & CODING_MODE_LAST_BLOCK)
c5bfa12b 794 break;
6e3bfbb2
RS
795
796 /* Make the buffer bigger as we continue to read more data,
797 but not past 64k. */
798 if (bufsize < 64 * 1024 && total_read > 32 * bufsize)
799 {
800 bufsize *= 2;
801 bufptr = (char *) alloca (bufsize);
802 }
803
012c6fcb 804 if (!NILP (display) && INTERACTIVE)
0ad477db
RS
805 {
806 if (first)
807 prepare_menu_bars ();
808 first = 0;
809 redisplay_preserve_echo_area ();
810 }
80856e74
JB
811 immediate_quit = 1;
812 QUIT;
813 }
60558b19 814 give_up: ;
80856e74 815
bca78757 816 Vlast_coding_system_used = process_coding.symbol;
bbd29cfe 817
bca78757
KH
818 /* If the caller required, let the buffer inherit the
819 coding-system used to decode the process output. */
820 if (inherit_process_coding_system)
821 call1 (intern ("after-insert-file-set-buffer-file-coding-system"),
822 make_number (total_read));
3b440bb5
EZ
823 }
824
80856e74
JB
825 /* Wait for it to terminate, unless it already has. */
826 wait_for_termination (pid);
827
828 immediate_quit = 0;
829
830 set_buffer_internal (old);
831
37d54121
RS
832 /* Don't kill any children that the subprocess may have left behind
833 when exiting. */
834 call_process_exited = 1;
835
80856e74
JB
836 unbind_to (count, Qnil);
837
80856e74 838 if (synch_process_death)
68c45bf0
PE
839 return code_convert_string_norecord (build_string (synch_process_death),
840 Vlocale_coding_system, 0);
80856e74
JB
841 return make_number (synch_process_retcode);
842}
843#endif
844\f
9fefd2ba 845static Lisp_Object
80856e74
JB
846delete_temp_file (name)
847 Lisp_Object name;
848{
2e3dc201 849 /* Use Fdelete_file (indirectly) because that runs a file name handler.
59750d69 850 We did that when writing the file, so we should do so when deleting. */
2e3dc201 851 internal_delete_file (name);
80856e74
JB
852}
853
854DEFUN ("call-process-region", Fcall_process_region, Scall_process_region,
855 3, MANY, 0,
856 "Send text from START to END to a synchronous process running PROGRAM.\n\
edf496dd 857The remaining arguments are optional.\n\
80856e74 858Delete the text if fourth arg DELETE is non-nil.\n\
39eaa782 859\n\
80856e74
JB
860Insert output in BUFFER before point; t means current buffer;\n\
861 nil for BUFFER means discard it; 0 means discard and don't wait.\n\
39eaa782
RS
862BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,\n\
863REAL-BUFFER says what to do with standard output, as above,\n\
864while STDERR-FILE says what to do with standard error in the child.\n\
865STDERR-FILE may be nil (discard standard error output),\n\
866t (mix it with ordinary output), or a file name string.\n\
867\n\
80856e74
JB
868Sixth arg DISPLAY non-nil means redisplay buffer as output is inserted.\n\
869Remaining args are passed to PROGRAM at startup as command args.\n\
39eaa782
RS
870\n\
871If BUFFER is nil, `call-process-region' returns immediately with value nil.\n\
872Otherwise it waits for PROGRAM to terminate\n\
e576cab4 873and returns a numeric exit status or a signal description string.\n\
d177f194 874If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
80856e74
JB
875 (nargs, args)
876 int nargs;
877 register Lisp_Object *args;
878{
39323a7e
KH
879 struct gcpro gcpro1;
880 Lisp_Object filename_string;
881 register Lisp_Object start, end;
d3e81d0a 882 int count = specpdl_ptr - specpdl;
08ee4e87 883 /* Qt denotes we have not yet called Ffind_operation_coding_system. */
09494912 884 Lisp_Object coding_systems;
32d08644
KH
885 Lisp_Object val, *args2;
886 int i;
bad95d8f 887#ifdef DOS_NT
7e6c2178 888 char *tempfile;
7e6c2178
RS
889 char *outf = '\0';
890
8a52365c
EZ
891 if ((outf = egetenv ("TMPDIR"))
892 || (outf = egetenv ("TMP"))
893 || (outf = egetenv ("TEMP")))
7e6c2178
RS
894 strcpy (tempfile = alloca (strlen (outf) + 20), outf);
895 else
896 {
897 tempfile = alloca (20);
898 *tempfile = '\0';
899 }
0774fcf8 900 if (!IS_DIRECTORY_SEP (tempfile[strlen (tempfile) - 1]))
7e6c2178 901 strcat (tempfile, "/");
5711b547
RS
902 if ('/' == DIRECTORY_SEP)
903 dostounix_filename (tempfile);
904 else
905 unixtodos_filename (tempfile);
0774fcf8
RS
906#ifdef WINDOWSNT
907 strcat (tempfile, "emXXXXXX");
908#else
7e6c2178 909 strcat (tempfile, "detmp.XXX");
0774fcf8 910#endif
bad95d8f 911#else /* not DOS_NT */
fc932ac6 912 char *tempfile = (char *) alloca (STRING_BYTES (XSTRING (Vtemp_file_name_pattern)) + 1);
8abd035b 913 bcopy (XSTRING (Vtemp_file_name_pattern)->data, tempfile,
fc932ac6 914 STRING_BYTES (XSTRING (Vtemp_file_name_pattern)) + 1);
bad95d8f 915#endif /* not DOS_NT */
7e6c2178 916
09494912
RS
917 coding_systems = Qt;
918
80856e74
JB
919 mktemp (tempfile);
920
921 filename_string = build_string (tempfile);
39323a7e 922 GCPRO1 (filename_string);
80856e74
JB
923 start = args[0];
924 end = args[1];
32d08644 925 /* Decide coding-system of the contents of the temporary file. */
91489411
RS
926 if (!NILP (Vcoding_system_for_write))
927 val = Vcoding_system_for_write;
928 else if (NILP (current_buffer->enable_multibyte_characters))
32d08644
KH
929 val = Qnil;
930 else
beacaab3 931 {
91489411
RS
932 args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2);
933 args2[0] = Qcall_process_region;
934 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
935 coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
936 if (CONSP (coding_systems))
70949dac 937 val = XCDR (coding_systems);
91489411 938 else if (CONSP (Vdefault_process_coding_system))
70949dac 939 val = XCDR (Vdefault_process_coding_system);
beacaab3 940 else
91489411 941 val = Qnil;
beacaab3 942 }
32d08644 943
168afdaa
RS
944 {
945 int count1 = specpdl_ptr - specpdl;
946
947 specbind (intern ("coding-system-for-write"), val);
948 Fwrite_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil);
949
950 unbind_to (count1, Qnil);
951 }
91489411
RS
952
953 /* Note that Fcall_process takes care of binding
954 coding-system-for-read. */
093650fe 955
80856e74
JB
956 record_unwind_protect (delete_temp_file, filename_string);
957
edf496dd 958 if (nargs > 3 && !NILP (args[3]))
80856e74
JB
959 Fdelete_region (start, end);
960
edf496dd
KH
961 if (nargs > 3)
962 {
963 args += 2;
964 nargs -= 2;
965 }
966 else
967 {
968 args[0] = args[2];
969 nargs = 2;
970 }
971 args[1] = filename_string;
80856e74 972
edf496dd 973 RETURN_UNGCPRO (unbind_to (count, Fcall_process (nargs, args)));
80856e74
JB
974}
975\f
976#ifndef VMS /* VMS version is in vmsproc.c. */
977
dfcf069d
AS
978static int relocate_fd ();
979
80856e74
JB
980/* This is the last thing run in a newly forked inferior
981 either synchronous or asynchronous.
982 Copy descriptors IN, OUT and ERR as descriptors 0, 1 and 2.
983 Initialize inferior's priority, pgrp, connected dir and environment.
984 then exec another program based on new_argv.
985
986 This function may change environ for the superior process.
987 Therefore, the superior process must save and restore the value
988 of environ around the vfork and the call to this function.
989
80856e74 990 SET_PGRP is nonzero if we should put the subprocess into a separate
e576cab4
JB
991 process group.
992
993 CURRENT_DIR is an elisp string giving the path of the current
994 directory the subprocess should have. Since we can't really signal
995 a decent error from within the child, this should be verified as an
996 executable directory by the parent. */
80856e74 997
dfcf069d 998int
e576cab4 999child_setup (in, out, err, new_argv, set_pgrp, current_dir)
80856e74
JB
1000 int in, out, err;
1001 register char **new_argv;
80856e74 1002 int set_pgrp;
e576cab4 1003 Lisp_Object current_dir;
80856e74 1004{
e576cab4 1005 char **env;
7fcf7f05 1006 char *pwd_var;
bad95d8f
RS
1007#ifdef WINDOWSNT
1008 int cpid;
4252a4bd 1009 HANDLE handles[3];
bad95d8f 1010#endif /* WINDOWSNT */
e576cab4 1011
33abe2d9 1012 int pid = getpid ();
80856e74 1013
68d10241 1014#ifdef SET_EMACS_PRIORITY
4f0b9d49
JB
1015 {
1016 extern int emacs_priority;
1017
68d10241
RS
1018 if (emacs_priority < 0)
1019 nice (- emacs_priority);
4f0b9d49 1020 }
5b633aeb 1021#endif
80856e74
JB
1022
1023#ifdef subprocesses
1024 /* Close Emacs's descriptors that this process should not have. */
1025 close_process_descs ();
1026#endif
c17c4250
EZ
1027 /* DOS_NT isn't in a vfork, so if we are in the middle of load-file,
1028 we will lose if we call close_load_descs here. */
1029#ifndef DOS_NT
4458cebe 1030 close_load_descs ();
c17c4250 1031#endif
80856e74
JB
1032
1033 /* Note that use of alloca is always safe here. It's obvious for systems
1034 that do not have true vfork or that have true (stack) alloca.
1035 If using vfork and C_ALLOCA it is safe because that changes
1036 the superior's static variables as if the superior had done alloca
1037 and will be cleaned up in the usual way. */
e576cab4 1038 {
7fcf7f05 1039 register char *temp;
e576cab4 1040 register int i;
77d78be1 1041
fc932ac6 1042 i = STRING_BYTES (XSTRING (current_dir));
7fcf7f05
RS
1043 pwd_var = (char *) alloca (i + 6);
1044 temp = pwd_var + 4;
1045 bcopy ("PWD=", pwd_var, 4);
e576cab4 1046 bcopy (XSTRING (current_dir)->data, temp, i);
bad95d8f 1047 if (!IS_DIRECTORY_SEP (temp[i - 1])) temp[i++] = DIRECTORY_SEP;
e576cab4
JB
1048 temp[i] = 0;
1049
c17c4250 1050#ifndef DOS_NT
e576cab4
JB
1051 /* We can't signal an Elisp error here; we're in a vfork. Since
1052 the callers check the current directory before forking, this
1053 should only return an error if the directory's permissions
1054 are changed between the check and this chdir, but we should
1055 at least check. */
1056 if (chdir (temp) < 0)
20b25e46 1057 _exit (errno);
b4c7684c 1058#endif
7fcf7f05 1059
c17c4250
EZ
1060#ifdef DOS_NT
1061 /* Get past the drive letter, so that d:/ is left alone. */
1062 if (i > 2 && IS_DEVICE_SEP (temp[1]) && IS_DIRECTORY_SEP (temp[2]))
1063 {
1064 temp += 2;
1065 i -= 2;
1066 }
1067#endif
1068
7fcf7f05 1069 /* Strip trailing slashes for PWD, but leave "/" and "//" alone. */
bad95d8f 1070 while (i > 2 && IS_DIRECTORY_SEP (temp[i - 1]))
7fcf7f05 1071 temp[--i] = 0;
e576cab4 1072 }
80856e74 1073
80856e74
JB
1074 /* Set `env' to a vector of the strings in Vprocess_environment. */
1075 {
1076 register Lisp_Object tem;
1077 register char **new_env;
1078 register int new_length;
1079
1080 new_length = 0;
1081 for (tem = Vprocess_environment;
70949dac
KR
1082 CONSP (tem) && STRINGP (XCAR (tem));
1083 tem = XCDR (tem))
80856e74
JB
1084 new_length++;
1085
7fcf7f05
RS
1086 /* new_length + 2 to include PWD and terminating 0. */
1087 env = new_env = (char **) alloca ((new_length + 2) * sizeof (char *));
1088
1089 /* If we have a PWD envvar, pass one down,
1090 but with corrected value. */
1091 if (getenv ("PWD"))
1092 *new_env++ = pwd_var;
80856e74 1093
cd9565ba 1094 /* Copy the Vprocess_environment strings into new_env. */
80856e74 1095 for (tem = Vprocess_environment;
70949dac
KR
1096 CONSP (tem) && STRINGP (XCAR (tem));
1097 tem = XCDR (tem))
cd9565ba
RS
1098 {
1099 char **ep = env;
70949dac 1100 char *string = (char *) XSTRING (XCAR (tem))->data;
cd9565ba
RS
1101 /* See if this string duplicates any string already in the env.
1102 If so, don't put it in.
1103 When an env var has multiple definitions,
1104 we keep the definition that comes first in process-environment. */
1105 for (; ep != new_env; ep++)
1106 {
1107 char *p = *ep, *q = string;
1108 while (1)
1109 {
1110 if (*q == 0)
1111 /* The string is malformed; might as well drop it. */
1112 goto duplicate;
1113 if (*q != *p)
1114 break;
1115 if (*q == '=')
1116 goto duplicate;
1117 p++, q++;
1118 }
1119 }
1120 *new_env++ = string;
1121 duplicate: ;
1122 }
80856e74
JB
1123 *new_env = 0;
1124 }
bad95d8f
RS
1125#ifdef WINDOWSNT
1126 prepare_standard_handles (in, out, err, handles);
b4c7684c 1127 set_process_dir (XSTRING (current_dir)->data);
bad95d8f 1128#else /* not WINDOWSNT */
426b37ae
JB
1129 /* Make sure that in, out, and err are not actually already in
1130 descriptors zero, one, or two; this could happen if Emacs is
7e6c2178 1131 started with its standard in, out, or error closed, as might
426b37ae 1132 happen under X. */
f29f9e4a
RS
1133 {
1134 int oin = in, oout = out;
1135
1136 /* We have to avoid relocating the same descriptor twice! */
1137
1138 in = relocate_fd (in, 3);
1139
1140 if (out == oin)
1141 out = in;
1142 else
3e9367e7 1143 out = relocate_fd (out, 3);
f29f9e4a
RS
1144
1145 if (err == oin)
1146 err = in;
1147 else if (err == oout)
1148 err = out;
1149 else
3e9367e7 1150 err = relocate_fd (err, 3);
f29f9e4a 1151 }
426b37ae 1152
c17c4250 1153#ifndef MSDOS
68c45bf0
PE
1154 emacs_close (0);
1155 emacs_close (1);
1156 emacs_close (2);
80856e74
JB
1157
1158 dup2 (in, 0);
1159 dup2 (out, 1);
1160 dup2 (err, 2);
68c45bf0
PE
1161 emacs_close (in);
1162 emacs_close (out);
1163 emacs_close (err);
c17c4250 1164#endif /* not MSDOS */
bad95d8f 1165#endif /* not WINDOWSNT */
80856e74 1166
6b2cd868 1167#if defined(USG) && !defined(BSD_PGRPS)
fdba8590 1168#ifndef SETPGRP_RELEASES_CTTY
e576cab4 1169 setpgrp (); /* No arguments but equivalent in this case */
fdba8590 1170#endif
e576cab4
JB
1171#else
1172 setpgrp (pid, pid);
1173#endif /* USG */
a129418f
RS
1174 /* setpgrp_of_tty is incorrect here; it uses input_fd. */
1175 EMACS_SET_TTY_PGRP (0, &pid);
80856e74
JB
1176
1177#ifdef vipc
1178 something missing here;
1179#endif /* vipc */
1180
c17c4250
EZ
1181#ifdef MSDOS
1182 pid = run_msdos_command (new_argv, pwd_var + 4, in, out, err, env);
1183 if (pid == -1)
1184 /* An error occurred while trying to run the subprocess. */
1185 report_file_error ("Spawning child process", Qnil);
1186 return pid;
1187#else /* not MSDOS */
bad95d8f
RS
1188#ifdef WINDOWSNT
1189 /* Spawn the child. (See ntproc.c:Spawnve). */
1190 cpid = spawnve (_P_NOWAIT, new_argv[0], new_argv, env);
db77d785 1191 reset_standard_handles (in, out, err, handles);
ff27bfbe
KH
1192 if (cpid == -1)
1193 /* An error occurred while trying to spawn the process. */
1194 report_file_error ("Spawning child process", Qnil);
bad95d8f
RS
1195 return cpid;
1196#else /* not WINDOWSNT */
80856e74
JB
1197 /* execvp does not accept an environment arg so the only way
1198 to pass this environment is to set environ. Our caller
1199 is responsible for restoring the ambient value of environ. */
1200 environ = env;
1201 execvp (new_argv[0], new_argv);
1202
68c45bf0
PE
1203 emacs_write (1, "Can't exec program: ", 20);
1204 emacs_write (1, new_argv[0], strlen (new_argv[0]));
1205 emacs_write (1, "\n", 1);
80856e74 1206 _exit (1);
bad95d8f 1207#endif /* not WINDOWSNT */
7e6c2178 1208#endif /* not MSDOS */
80856e74
JB
1209}
1210
a3833dfe 1211/* Move the file descriptor FD so that its number is not less than MINFD.
426b37ae 1212 If the file descriptor is moved at all, the original is freed. */
dfcf069d 1213static int
a3833dfe
KH
1214relocate_fd (fd, minfd)
1215 int fd, minfd;
426b37ae 1216{
a3833dfe 1217 if (fd >= minfd)
426b37ae
JB
1218 return fd;
1219 else
1220 {
1221 int new = dup (fd);
1222 if (new == -1)
1223 {
20c018a0 1224 char *message1 = "Error while setting up child: ";
826c56ac 1225 char *errmessage = strerror (errno);
20c018a0 1226 char *message2 = "\n";
68c45bf0
PE
1227 emacs_write (2, message1, strlen (message1));
1228 emacs_write (2, errmessage, strlen (errmessage));
1229 emacs_write (2, message2, strlen (message2));
426b37ae
JB
1230 _exit (1);
1231 }
1232 /* Note that we hold the original FD open while we recurse,
1233 to guarantee we'll get a new FD if we need it. */
a3833dfe 1234 new = relocate_fd (new, minfd);
68c45bf0 1235 emacs_close (fd);
426b37ae
JB
1236 return new;
1237 }
1238}
1239
012c6fcb
JA
1240static int
1241getenv_internal (var, varlen, value, valuelen)
1242 char *var;
1243 int varlen;
1244 char **value;
1245 int *valuelen;
1246{
1247 Lisp_Object scan;
1248
70949dac 1249 for (scan = Vprocess_environment; CONSP (scan); scan = XCDR (scan))
012c6fcb 1250 {
c1350752
KH
1251 Lisp_Object entry;
1252
70949dac 1253 entry = XCAR (scan);
d50d3dc8 1254 if (STRINGP (entry)
fc932ac6 1255 && STRING_BYTES (XSTRING (entry)) > varlen
012c6fcb 1256 && XSTRING (entry)->data[varlen] == '='
bad95d8f
RS
1257#ifdef WINDOWSNT
1258 /* NT environment variables are case insensitive. */
a9971c6d 1259 && ! strnicmp (XSTRING (entry)->data, var, varlen)
bad95d8f 1260#else /* not WINDOWSNT */
a9971c6d 1261 && ! bcmp (XSTRING (entry)->data, var, varlen)
bad95d8f 1262#endif /* not WINDOWSNT */
a9971c6d 1263 )
012c6fcb
JA
1264 {
1265 *value = (char *) XSTRING (entry)->data + (varlen + 1);
fc932ac6 1266 *valuelen = STRING_BYTES (XSTRING (entry)) - (varlen + 1);
012c6fcb
JA
1267 return 1;
1268 }
1269 }
1270
1271 return 0;
1272}
1273
83fa009c 1274DEFUN ("getenv-internal", Fgetenv_internal, Sgetenv_internal, 1, 1, 0,
012c6fcb
JA
1275 "Return the value of environment variable VAR, as a string.\n\
1276VAR should be a string. Value is nil if VAR is undefined in the environment.\n\
1277This function consults the variable ``process-environment'' for its value.")
1278 (var)
1279 Lisp_Object var;
1280{
1281 char *value;
1282 int valuelen;
1283
1284 CHECK_STRING (var, 0);
fc932ac6 1285 if (getenv_internal (XSTRING (var)->data, STRING_BYTES (XSTRING (var)),
012c6fcb
JA
1286 &value, &valuelen))
1287 return make_string (value, valuelen);
1288 else
1289 return Qnil;
1290}
1291
1292/* A version of getenv that consults process_environment, easily
e576cab4 1293 callable from C. */
012c6fcb
JA
1294char *
1295egetenv (var)
e576cab4 1296 char *var;
012c6fcb
JA
1297{
1298 char *value;
1299 int valuelen;
1300
1301 if (getenv_internal (var, strlen (var), &value, &valuelen))
1302 return value;
1303 else
1304 return 0;
1305}
1306
80856e74
JB
1307#endif /* not VMS */
1308\f
8de15d69 1309/* This is run before init_cmdargs. */
7e6c2178 1310
dfcf069d 1311void
8de15d69
RS
1312init_callproc_1 ()
1313{
1314 char *data_dir = egetenv ("EMACSDATA");
35a2f4b8
KH
1315 char *doc_dir = egetenv ("EMACSDOC");
1316
8de15d69 1317 Vdata_directory
7e6c2178 1318 = Ffile_name_as_directory (build_string (data_dir ? data_dir
8de15d69 1319 : PATH_DATA));
35a2f4b8
KH
1320 Vdoc_directory
1321 = Ffile_name_as_directory (build_string (doc_dir ? doc_dir
1322 : PATH_DOC));
9453ea7b 1323
e576cab4 1324 /* Check the EMACSPATH environment variable, defaulting to the
57bda87a 1325 PATH_EXEC path from epaths.h. */
e576cab4 1326 Vexec_path = decode_env_path ("EMACSPATH", PATH_EXEC);
80856e74
JB
1327 Vexec_directory = Ffile_name_as_directory (Fcar (Vexec_path));
1328 Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path);
8de15d69
RS
1329}
1330
e17f7533 1331/* This is run after init_cmdargs, when Vinstallation_directory is valid. */
8de15d69 1332
dfcf069d 1333void
8de15d69
RS
1334init_callproc ()
1335{
1336 char *data_dir = egetenv ("EMACSDATA");
1337
1338 register char * sh;
1339 Lisp_Object tempdir;
1340
9cc4fad5 1341 if (!NILP (Vinstallation_directory))
8de15d69 1342 {
05630743
RS
1343 /* Add to the path the lib-src subdir of the installation dir. */
1344 Lisp_Object tem;
1345 tem = Fexpand_file_name (build_string ("lib-src"),
1346 Vinstallation_directory);
bad95d8f 1347#ifndef DOS_NT
1a6640ec 1348 /* MSDOS uses wrapped binaries, so don't do this. */
0fa248bc
RS
1349 if (NILP (Fmember (tem, Vexec_path)))
1350 Vexec_path = nconc2 (Vexec_path, Fcons (tem, Qnil));
1351
1352 Vexec_directory = Ffile_name_as_directory (tem);
bad95d8f 1353#endif /* not DOS_NT */
8de15d69 1354
e17f7533
RS
1355 /* Maybe use ../etc as well as ../lib-src. */
1356 if (data_dir == 0)
1357 {
1358 tem = Fexpand_file_name (build_string ("etc"),
1359 Vinstallation_directory);
1360 Vdoc_directory = Ffile_name_as_directory (tem);
8de15d69
RS
1361 }
1362 }
7e933683
RS
1363
1364 /* Look for the files that should be in etc. We don't use
1365 Vinstallation_directory, because these files are never installed
e17f7533 1366 near the executable, and they are never in the build
7e933683
RS
1367 directory when that's different from the source directory.
1368
1369 Instead, if these files are not in the nominal place, we try the
1370 source directory. */
1371 if (data_dir == 0)
1372 {
1373 Lisp_Object tem, tem1, newdir;
1374
1375 tem = Fexpand_file_name (build_string ("GNU"), Vdata_directory);
1376 tem1 = Ffile_exists_p (tem);
1377 if (NILP (tem1))
1378 {
1379 newdir = Fexpand_file_name (build_string ("../etc/"),
1380 build_string (PATH_DUMPLOADSEARCH));
1381 tem = Fexpand_file_name (build_string ("GNU"), newdir);
1382 tem1 = Ffile_exists_p (tem);
1383 if (!NILP (tem1))
1384 Vdata_directory = newdir;
1385 }
1386 }
80856e74 1387
d883eb62
RS
1388#ifndef CANNOT_DUMP
1389 if (initialized)
1390#endif
1391 {
1392 tempdir = Fdirectory_file_name (Vexec_directory);
1393 if (access (XSTRING (tempdir)->data, 0) < 0)
1394 dir_warning ("Warning: arch-dependent data dir (%s) does not exist.\n",
1395 Vexec_directory);
1396 }
80856e74 1397
e576cab4
JB
1398 tempdir = Fdirectory_file_name (Vdata_directory);
1399 if (access (XSTRING (tempdir)->data, 0) < 0)
76d5c6cf
RS
1400 dir_warning ("Warning: arch-independent data dir (%s) does not exist.\n",
1401 Vdata_directory);
e576cab4 1402
80856e74
JB
1403#ifdef VMS
1404 Vshell_file_name = build_string ("*dcl*");
1405#else
e576cab4 1406 sh = (char *) getenv ("SHELL");
80856e74
JB
1407 Vshell_file_name = build_string (sh ? sh : "/bin/sh");
1408#endif
8abd035b
RS
1409
1410#ifdef VMS
1411 Vtemp_file_name_pattern = build_string ("tmp:emacsXXXXXX.");
1412#else
1413 if (getenv ("TMPDIR"))
1414 {
1415 char *dir = getenv ("TMPDIR");
1416 Vtemp_file_name_pattern
1417 = Fexpand_file_name (build_string ("emacsXXXXXX"),
1418 build_string (dir));
1419 }
1420 else
1421 Vtemp_file_name_pattern = build_string ("/tmp/emacsXXXXXX");
1422#endif
9fefd2ba
JB
1423}
1424
dfcf069d 1425void
9fefd2ba
JB
1426set_process_environment ()
1427{
1428 register char **envp;
80856e74 1429
80856e74
JB
1430 Vprocess_environment = Qnil;
1431#ifndef CANNOT_DUMP
1432 if (initialized)
1433#endif
1434 for (envp = environ; *envp; envp++)
1435 Vprocess_environment = Fcons (build_string (*envp),
1436 Vprocess_environment);
80856e74
JB
1437}
1438
dfcf069d 1439void
80856e74
JB
1440syms_of_callproc ()
1441{
bad95d8f 1442#ifdef DOS_NT
093650fe
RS
1443 Qbuffer_file_type = intern ("buffer-file-type");
1444 staticpro (&Qbuffer_file_type);
bad95d8f 1445#endif /* DOS_NT */
7e6c2178 1446
80856e74
JB
1447 DEFVAR_LISP ("shell-file-name", &Vshell_file_name,
1448 "*File name to load inferior shells from.\n\
1449Initialized from the SHELL environment variable.");
1450
1451 DEFVAR_LISP ("exec-path", &Vexec_path,
1452 "*List of directories to search programs to run in subprocesses.\n\
1453Each element is a string (directory name) or nil (try default directory).");
1454
1455 DEFVAR_LISP ("exec-directory", &Vexec_directory,
57ca9855
RS
1456 "Directory for executables for Emacs to invoke.\n\
1457More generally, this includes any architecture-dependent files\n\
1458that are built and installed from the Emacs distribution.");
e576cab4
JB
1459
1460 DEFVAR_LISP ("data-directory", &Vdata_directory,
57ca9855
RS
1461 "Directory of machine-independent files that come with GNU Emacs.\n\
1462These are files intended for Emacs to use while it runs.");
80856e74 1463
35a2f4b8
KH
1464 DEFVAR_LISP ("doc-directory", &Vdoc_directory,
1465 "Directory containing the DOC file that comes with GNU Emacs.\n\
1466This is usually the same as data-directory.");
1467
ed61592a
JB
1468 DEFVAR_LISP ("configure-info-directory", &Vconfigure_info_directory,
1469 "For internal use by the build procedure only.\n\
1470This is the name of the directory in which the build procedure installed\n\
1471Emacs's info files; the default value for Info-default-directory-list\n\
1472includes this.");
1473 Vconfigure_info_directory = build_string (PATH_INFO);
1474
8abd035b
RS
1475 DEFVAR_LISP ("temp-file-name-pattern", &Vtemp_file_name_pattern,
1476 "Pattern for making names for temporary files.\n\
1477This is used by `call-process-region'.");
0537ec48 1478 /* This variable is initialized in init_callproc. */
8abd035b 1479
80856e74 1480 DEFVAR_LISP ("process-environment", &Vprocess_environment,
e576cab4
JB
1481 "List of environment variables for subprocesses to inherit.\n\
1482Each element should be a string of the form ENVVARNAME=VALUE.\n\
1483The environment which Emacs inherits is placed in this variable\n\
1484when Emacs starts.");
80856e74
JB
1485
1486#ifndef VMS
1487 defsubr (&Scall_process);
83fa009c 1488 defsubr (&Sgetenv_internal);
986ffb24 1489#endif
e576cab4 1490 defsubr (&Scall_process_region);
80856e74 1491}