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