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