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