Merge from trunk.
[emacs.git] / src / callproc.c
blob22245f2d688de743a1e90b34e03335af038a56e3
1 /* Synchronous subprocess invocation for GNU Emacs.
2 Copyright (C) 1985-1988, 1993-1995, 1999-2012
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 #include <config.h>
22 #include <signal.h>
23 #include <errno.h>
24 #include <stdio.h>
25 #include <setjmp.h>
26 #include <sys/types.h>
27 #include <unistd.h>
29 #include <sys/file.h>
30 #include <fcntl.h>
32 #include "lisp.h"
34 #ifdef WINDOWSNT
35 #define NOMINMAX
36 #include <windows.h>
37 #include "w32.h"
38 #define _P_NOWAIT 1 /* from process.h */
39 #endif
41 #ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
42 #include <sys/stat.h>
43 #include <sys/param.h>
44 #endif /* MSDOS */
46 #include "commands.h"
47 #include "buffer.h"
48 #include "character.h"
49 #include "ccl.h"
50 #include "coding.h"
51 #include "composite.h"
52 #include <epaths.h>
53 #include "process.h"
54 #include "syssignal.h"
55 #include "systty.h"
56 #include "blockinput.h"
57 #include "frame.h"
58 #include "termhooks.h"
60 #ifdef MSDOS
61 #include "msdos.h"
62 #endif
64 #ifndef USE_CRT_DLL
65 extern char **environ;
66 #endif
68 #ifdef HAVE_SETPGID
69 #if !defined (USG)
70 #undef setpgrp
71 #define setpgrp setpgid
72 #endif
73 #endif
75 /* Pattern used by call-process-region to make temp files. */
76 static Lisp_Object Vtemp_file_name_pattern;
78 /* True if we are about to fork off a synchronous process or if we
79 are waiting for it. */
80 int synch_process_alive;
82 /* Nonzero => this is a string explaining death of synchronous subprocess. */
83 const char *synch_process_death;
85 /* Nonzero => this is the signal number that terminated the subprocess. */
86 int synch_process_termsig;
88 /* If synch_process_death is zero,
89 this is exit code of synchronous subprocess. */
90 int synch_process_retcode;
93 /* Clean up when exiting Fcall_process.
94 On MSDOS, delete the temporary file on any kind of termination.
95 On Unix, kill the process and any children on termination by signal. */
97 /* Nonzero if this is termination due to exit. */
98 static int call_process_exited;
100 static Lisp_Object Fgetenv_internal (Lisp_Object, Lisp_Object);
102 static Lisp_Object
103 call_process_kill (Lisp_Object fdpid)
105 int fd;
106 pid_t pid;
107 CONS_TO_INTEGER (Fcar (fdpid), int, fd);
108 CONS_TO_INTEGER (Fcdr (fdpid), pid_t, pid);
109 emacs_close (fd);
110 EMACS_KILLPG (pid, SIGKILL);
111 synch_process_alive = 0;
112 return Qnil;
115 static Lisp_Object
116 call_process_cleanup (Lisp_Object arg)
118 Lisp_Object fdpid = Fcdr (arg);
119 int fd;
120 #if defined (MSDOS)
121 Lisp_Object file;
122 #else
123 pid_t pid;
124 #endif
126 Fset_buffer (Fcar (arg));
127 CONS_TO_INTEGER (Fcar (fdpid), int, fd);
129 #if defined (MSDOS)
130 /* for MSDOS fdpid is really (fd . tempfile) */
131 file = Fcdr (fdpid);
132 /* FD is -1 and FILE is "" when we didn't actually create a
133 temporary file in call-process. */
134 if (fd >= 0)
135 emacs_close (fd);
136 if (!(strcmp (SDATA (file), NULL_DEVICE) == 0 || SREF (file, 0) == '\0'))
137 unlink (SDATA (file));
138 #else /* not MSDOS */
139 CONS_TO_INTEGER (Fcdr (fdpid), pid_t, pid);
141 if (call_process_exited)
143 emacs_close (fd);
144 return Qnil;
147 if (EMACS_KILLPG (pid, SIGINT) == 0)
149 ptrdiff_t count = SPECPDL_INDEX ();
150 record_unwind_protect (call_process_kill, fdpid);
151 message1 ("Waiting for process to die...(type C-g again to kill it instantly)");
152 immediate_quit = 1;
153 QUIT;
154 wait_for_termination (pid);
155 immediate_quit = 0;
156 specpdl_ptr = specpdl + count; /* Discard the unwind protect. */
157 message1 ("Waiting for process to die...done");
159 synch_process_alive = 0;
160 emacs_close (fd);
161 #endif /* not MSDOS */
162 return Qnil;
165 DEFUN ("call-process", Fcall_process, Scall_process, 1, MANY, 0,
166 doc: /* Call PROGRAM synchronously in separate process.
167 The remaining arguments are optional.
168 The program's input comes from file INFILE (nil means `/dev/null').
169 Insert output in BUFFER before point; t means current buffer; nil for BUFFER
170 means discard it; 0 means discard and don't wait; and `(:file FILE)', where
171 FILE is a file name string, means that it should be written to that file.
172 BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,
173 REAL-BUFFER says what to do with standard output, as above,
174 while STDERR-FILE says what to do with standard error in the child.
175 STDERR-FILE may be nil (discard standard error output),
176 t (mix it with ordinary output), or a file name string.
178 Fourth arg DISPLAY non-nil means redisplay buffer as output is inserted.
179 Remaining arguments are strings passed as command arguments to PROGRAM.
181 If executable PROGRAM can't be found as an executable, `call-process'
182 signals a Lisp error. `call-process' reports errors in execution of
183 the program only through its return and output.
185 If BUFFER is 0, `call-process' returns immediately with value nil.
186 Otherwise it waits for PROGRAM to terminate
187 and returns a numeric exit status or a signal description string.
188 If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.
190 usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
191 (ptrdiff_t nargs, Lisp_Object *args)
193 Lisp_Object infile, buffer, current_dir, path, cleanup_info_tail;
194 int display_p;
195 int fd[2];
196 int filefd;
197 #define CALLPROC_BUFFER_SIZE_MIN (16 * 1024)
198 #define CALLPROC_BUFFER_SIZE_MAX (4 * CALLPROC_BUFFER_SIZE_MIN)
199 char buf[CALLPROC_BUFFER_SIZE_MAX];
200 int bufsize = CALLPROC_BUFFER_SIZE_MIN;
201 ptrdiff_t count = SPECPDL_INDEX ();
202 USE_SAFE_ALLOCA;
204 register const unsigned char **new_argv;
205 /* File to use for stderr in the child.
206 t means use same as standard output. */
207 Lisp_Object error_file;
208 Lisp_Object output_file = Qnil;
209 #ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
210 char *outf, *tempfile = NULL;
211 int outfilefd;
212 int pid;
213 #else
214 pid_t pid;
215 #endif
216 int fd_output = -1;
217 struct coding_system process_coding; /* coding-system of process output */
218 struct coding_system argument_coding; /* coding-system of arguments */
219 /* Set to the return value of Ffind_operation_coding_system. */
220 Lisp_Object coding_systems;
221 int output_to_buffer = 1;
223 /* Qt denotes that Ffind_operation_coding_system is not yet called. */
224 coding_systems = Qt;
226 CHECK_STRING (args[0]);
228 error_file = Qt;
230 #ifndef subprocesses
231 /* Without asynchronous processes we cannot have BUFFER == 0. */
232 if (nargs >= 3
233 && (INTEGERP (CONSP (args[2]) ? XCAR (args[2]) : args[2])))
234 error ("Operating system cannot handle asynchronous subprocesses");
235 #endif /* subprocesses */
237 /* Decide the coding-system for giving arguments. */
239 Lisp_Object val, *args2;
240 ptrdiff_t i;
242 /* If arguments are supplied, we may have to encode them. */
243 if (nargs >= 5)
245 int must_encode = 0;
246 Lisp_Object coding_attrs;
248 for (i = 4; i < nargs; i++)
249 CHECK_STRING (args[i]);
251 for (i = 4; i < nargs; i++)
252 if (STRING_MULTIBYTE (args[i]))
253 must_encode = 1;
255 if (!NILP (Vcoding_system_for_write))
256 val = Vcoding_system_for_write;
257 else if (! must_encode)
258 val = Qraw_text;
259 else
261 SAFE_NALLOCA (args2, 1, nargs + 1);
262 args2[0] = Qcall_process;
263 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
264 coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
265 val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil;
267 val = complement_process_encoding_system (val);
268 setup_coding_system (Fcheck_coding_system (val), &argument_coding);
269 coding_attrs = CODING_ID_ATTRS (argument_coding.id);
270 if (NILP (CODING_ATTR_ASCII_COMPAT (coding_attrs)))
272 /* We should not use an ASCII incompatible coding system. */
273 val = raw_text_coding_system (val);
274 setup_coding_system (val, &argument_coding);
279 if (nargs >= 2 && ! NILP (args[1]))
281 infile = Fexpand_file_name (args[1], BVAR (current_buffer, directory));
282 CHECK_STRING (infile);
284 else
285 infile = build_string (NULL_DEVICE);
287 if (nargs >= 3)
289 buffer = args[2];
291 /* If BUFFER is a list, its meaning is (BUFFER-FOR-STDOUT
292 FILE-FOR-STDERR), unless the first element is :file, in which case see
293 the next paragraph. */
294 if (CONSP (buffer)
295 && (! SYMBOLP (XCAR (buffer))
296 || strcmp (SSDATA (SYMBOL_NAME (XCAR (buffer))), ":file")))
298 if (CONSP (XCDR (buffer)))
300 Lisp_Object stderr_file;
301 stderr_file = XCAR (XCDR (buffer));
303 if (NILP (stderr_file) || EQ (Qt, stderr_file))
304 error_file = stderr_file;
305 else
306 error_file = Fexpand_file_name (stderr_file, Qnil);
309 buffer = XCAR (buffer);
312 /* If the buffer is (still) a list, it might be a (:file "file") spec. */
313 if (CONSP (buffer)
314 && SYMBOLP (XCAR (buffer))
315 && ! strcmp (SSDATA (SYMBOL_NAME (XCAR (buffer))), ":file"))
317 output_file = Fexpand_file_name (XCAR (XCDR (buffer)),
318 BVAR (current_buffer, directory));
319 CHECK_STRING (output_file);
320 buffer = Qnil;
323 if (!(EQ (buffer, Qnil)
324 || EQ (buffer, Qt)
325 || INTEGERP (buffer)))
327 Lisp_Object spec_buffer;
328 spec_buffer = buffer;
329 buffer = Fget_buffer_create (buffer);
330 /* Mention the buffer name for a better error message. */
331 if (NILP (buffer))
332 CHECK_BUFFER (spec_buffer);
333 CHECK_BUFFER (buffer);
336 else
337 buffer = Qnil;
339 /* Make sure that the child will be able to chdir to the current
340 buffer's current directory, or its unhandled equivalent. We
341 can't just have the child check for an error when it does the
342 chdir, since it's in a vfork.
344 We have to GCPRO around this because Fexpand_file_name,
345 Funhandled_file_name_directory, and Ffile_accessible_directory_p
346 might call a file name handling function. The argument list is
347 protected by the caller, so all we really have to worry about is
348 buffer. */
350 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
352 current_dir = BVAR (current_buffer, directory);
354 GCPRO5 (infile, buffer, current_dir, error_file, output_file);
356 current_dir = Funhandled_file_name_directory (current_dir);
357 if (NILP (current_dir))
358 /* If the file name handler says that current_dir is unreachable, use
359 a sensible default. */
360 current_dir = build_string ("~/");
361 current_dir = expand_and_dir_to_file (current_dir, Qnil);
362 current_dir = Ffile_name_as_directory (current_dir);
364 if (NILP (Ffile_accessible_directory_p (current_dir)))
365 report_file_error ("Setting current directory",
366 Fcons (BVAR (current_buffer, directory), Qnil));
368 if (STRING_MULTIBYTE (infile))
369 infile = ENCODE_FILE (infile);
370 if (STRING_MULTIBYTE (current_dir))
371 current_dir = ENCODE_FILE (current_dir);
372 if (STRINGP (error_file) && STRING_MULTIBYTE (error_file))
373 error_file = ENCODE_FILE (error_file);
374 if (STRINGP (output_file) && STRING_MULTIBYTE (output_file))
375 output_file = ENCODE_FILE (output_file);
376 UNGCPRO;
379 display_p = INTERACTIVE && nargs >= 4 && !NILP (args[3]);
381 filefd = emacs_open (SSDATA (infile), O_RDONLY, 0);
382 if (filefd < 0)
384 infile = DECODE_FILE (infile);
385 report_file_error ("Opening process input file", Fcons (infile, Qnil));
388 if (STRINGP (output_file))
390 #ifdef DOS_NT
391 fd_output = emacs_open (SSDATA (output_file),
392 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
393 S_IREAD | S_IWRITE);
394 #else /* not DOS_NT */
395 fd_output = creat (SSDATA (output_file), 0666);
396 #endif /* not DOS_NT */
397 if (fd_output < 0)
399 output_file = DECODE_FILE (output_file);
400 report_file_error ("Opening process output file",
401 Fcons (output_file, Qnil));
403 if (STRINGP (error_file) || NILP (error_file))
404 output_to_buffer = 0;
407 /* Search for program; barf if not found. */
409 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
411 GCPRO4 (infile, buffer, current_dir, error_file);
412 openp (Vexec_path, args[0], Vexec_suffixes, &path, make_number (X_OK));
413 UNGCPRO;
415 if (NILP (path))
417 emacs_close (filefd);
418 report_file_error ("Searching for program", Fcons (args[0], Qnil));
421 /* If program file name starts with /: for quoting a magic name,
422 discard that. */
423 if (SBYTES (path) > 2 && SREF (path, 0) == '/'
424 && SREF (path, 1) == ':')
425 path = Fsubstring (path, make_number (2), Qnil);
427 SAFE_ALLOCA (new_argv, const unsigned char **,
428 (nargs > 4 ? nargs - 2 : 2) * sizeof *new_argv);
429 if (nargs > 4)
431 ptrdiff_t i;
432 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
434 GCPRO5 (infile, buffer, current_dir, path, error_file);
435 argument_coding.dst_multibyte = 0;
436 for (i = 4; i < nargs; i++)
438 argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]);
439 if (CODING_REQUIRE_ENCODING (&argument_coding))
440 /* We must encode this argument. */
441 args[i] = encode_coding_string (&argument_coding, args[i], 1);
443 UNGCPRO;
444 for (i = 4; i < nargs; i++)
445 new_argv[i - 3] = SDATA (args[i]);
446 new_argv[i - 3] = 0;
448 else
449 new_argv[1] = 0;
450 new_argv[0] = SDATA (path);
452 #ifdef MSDOS /* MW, July 1993 */
454 /* If we're redirecting STDOUT to a file, that file is already open
455 on fd_output. */
456 if (fd_output < 0)
458 if ((outf = egetenv ("TMPDIR")))
459 strcpy (tempfile = alloca (strlen (outf) + 20), outf);
460 else
462 tempfile = alloca (20);
463 *tempfile = '\0';
465 dostounix_filename (tempfile);
466 if (*tempfile == '\0' || tempfile[strlen (tempfile) - 1] != '/')
467 strcat (tempfile, "/");
468 strcat (tempfile, "detmp.XXX");
469 mktemp (tempfile);
470 outfilefd = creat (tempfile, S_IREAD | S_IWRITE);
471 if (outfilefd < 0) {
472 emacs_close (filefd);
473 report_file_error ("Opening process output file",
474 Fcons (build_string (tempfile), Qnil));
477 else
478 outfilefd = fd_output;
479 fd[0] = filefd;
480 fd[1] = outfilefd;
481 #endif /* MSDOS */
483 if (INTEGERP (buffer))
484 fd[1] = emacs_open (NULL_DEVICE, O_WRONLY, 0), fd[0] = -1;
485 else
487 #ifndef MSDOS
488 errno = 0;
489 if (pipe (fd) == -1)
491 emacs_close (filefd);
492 report_file_error ("Creating process pipe", Qnil);
494 #endif
498 /* child_setup must clobber environ in systems with true vfork.
499 Protect it from permanent change. */
500 register char **save_environ = environ;
501 register int fd1 = fd[1];
502 int fd_error = fd1;
503 #ifdef HAVE_WORKING_VFORK
504 sigset_t procmask;
505 sigset_t blocked;
506 struct sigaction sigpipe_action;
507 #endif
509 if (fd_output >= 0)
510 fd1 = fd_output;
511 #if 0 /* Some systems don't have sigblock. */
512 mask = sigblock (sigmask (SIGCHLD));
513 #endif
515 /* Record that we're about to create a synchronous process. */
516 synch_process_alive = 1;
518 /* These vars record information from process termination.
519 Clear them now before process can possibly terminate,
520 to avoid timing error if process terminates soon. */
521 synch_process_death = 0;
522 synch_process_retcode = 0;
523 synch_process_termsig = 0;
525 if (NILP (error_file))
526 fd_error = emacs_open (NULL_DEVICE, O_WRONLY, 0);
527 else if (STRINGP (error_file))
529 #ifdef DOS_NT
530 fd_error = emacs_open (SSDATA (error_file),
531 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
532 S_IREAD | S_IWRITE);
533 #else /* not DOS_NT */
534 fd_error = creat (SSDATA (error_file), 0666);
535 #endif /* not DOS_NT */
538 if (fd_error < 0)
540 emacs_close (filefd);
541 if (fd[0] != filefd)
542 emacs_close (fd[0]);
543 if (fd1 >= 0)
544 emacs_close (fd1);
545 #ifdef MSDOS
546 unlink (tempfile);
547 #endif
548 if (NILP (error_file))
549 error_file = build_string (NULL_DEVICE);
550 else if (STRINGP (error_file))
551 error_file = DECODE_FILE (error_file);
552 report_file_error ("Cannot redirect stderr", Fcons (error_file, Qnil));
555 #ifdef MSDOS /* MW, July 1993 */
556 /* Note that on MSDOS `child_setup' actually returns the child process
557 exit status, not its PID, so we assign it to `synch_process_retcode'
558 below. */
559 pid = child_setup (filefd, outfilefd, fd_error, (char **) new_argv,
560 0, current_dir);
562 /* Record that the synchronous process exited and note its
563 termination status. */
564 synch_process_alive = 0;
565 synch_process_retcode = pid;
566 if (synch_process_retcode < 0) /* means it couldn't be exec'ed */
568 synchronize_system_messages_locale ();
569 synch_process_death = strerror (errno);
572 emacs_close (outfilefd);
573 if (fd_error != outfilefd)
574 emacs_close (fd_error);
575 fd1 = -1; /* No harm in closing that one! */
576 if (tempfile)
578 /* Since CRLF is converted to LF within `decode_coding', we
579 can always open a file with binary mode. */
580 fd[0] = emacs_open (tempfile, O_RDONLY | O_BINARY, 0);
581 if (fd[0] < 0)
583 unlink (tempfile);
584 emacs_close (filefd);
585 report_file_error ("Cannot re-open temporary file",
586 Fcons (build_string (tempfile), Qnil));
589 else
590 fd[0] = -1; /* We are not going to read from tempfile. */
591 #else /* not MSDOS */
592 #ifdef WINDOWSNT
593 pid = child_setup (filefd, fd1, fd_error, (char **) new_argv,
594 0, current_dir);
595 #else /* not WINDOWSNT */
597 #ifdef HAVE_WORKING_VFORK
598 /* On many hosts (e.g. Solaris 2.4), if a vforked child calls `signal',
599 this sets the parent's signal handlers as well as the child's.
600 So delay all interrupts whose handlers the child might munge,
601 and record the current handlers so they can be restored later. */
602 sigemptyset (&blocked);
603 sigaddset (&blocked, SIGPIPE);
604 sigaction (SIGPIPE, 0, &sigpipe_action);
605 pthread_sigmask (SIG_BLOCK, &blocked, &procmask);
606 #endif
608 BLOCK_INPUT;
610 /* vfork, and prevent local vars from being clobbered by the vfork. */
612 Lisp_Object volatile buffer_volatile = buffer;
613 Lisp_Object volatile coding_systems_volatile = coding_systems;
614 Lisp_Object volatile current_dir_volatile = current_dir;
615 int volatile display_p_volatile = display_p;
616 int volatile fd1_volatile = fd1;
617 int volatile fd_error_volatile = fd_error;
618 int volatile fd_output_volatile = fd_output;
619 int volatile output_to_buffer_volatile = output_to_buffer;
620 int volatile sa_must_free_volatile = sa_must_free;
621 ptrdiff_t volatile sa_count_volatile = sa_count;
622 unsigned char const **volatile new_argv_volatile = new_argv;
624 pid = vfork ();
626 buffer = buffer_volatile;
627 coding_systems = coding_systems_volatile;
628 current_dir = current_dir_volatile;
629 display_p = display_p_volatile;
630 fd1 = fd1_volatile;
631 fd_error = fd_error_volatile;
632 fd_output = fd_output_volatile;
633 output_to_buffer = output_to_buffer_volatile;
634 sa_must_free = sa_must_free_volatile;
635 sa_count = sa_count_volatile;
636 new_argv = new_argv_volatile;
639 if (pid == 0)
641 if (fd[0] >= 0)
642 emacs_close (fd[0]);
643 #ifdef HAVE_SETSID
644 setsid ();
645 #endif
646 #if defined (USG)
647 setpgrp ();
648 #else
649 setpgrp (pid, pid);
650 #endif /* USG */
652 /* GConf causes us to ignore SIGPIPE, make sure it is restored
653 in the child. */
654 //signal (SIGPIPE, SIG_DFL);
655 #ifdef HAVE_WORKING_VFORK
656 pthread_sigmask (SIG_SETMASK, &procmask, 0);
657 #endif
659 child_setup (filefd, fd1, fd_error, (char **) new_argv,
660 0, current_dir);
663 UNBLOCK_INPUT;
665 #ifdef HAVE_WORKING_VFORK
666 /* Restore the signal state. */
667 sigaction (SIGPIPE, &sigpipe_action, 0);
668 pthread_sigmask (SIG_SETMASK, &procmask, 0);
669 #endif
671 #endif /* not WINDOWSNT */
673 /* The MSDOS case did this already. */
674 if (fd_error >= 0)
675 emacs_close (fd_error);
676 #endif /* not MSDOS */
678 environ = save_environ;
680 /* Close most of our fd's, but not fd[0]
681 since we will use that to read input from. */
682 emacs_close (filefd);
683 if (fd_output >= 0)
684 emacs_close (fd_output);
685 if (fd1 >= 0 && fd1 != fd_error)
686 emacs_close (fd1);
689 if (pid < 0)
691 if (fd[0] >= 0)
692 emacs_close (fd[0]);
693 report_file_error ("Doing vfork", Qnil);
696 if (INTEGERP (buffer))
698 if (fd[0] >= 0)
699 emacs_close (fd[0]);
700 return Qnil;
703 /* Enable sending signal if user quits below. */
704 call_process_exited = 0;
706 #if defined (MSDOS)
707 /* MSDOS needs different cleanup information. */
708 cleanup_info_tail = build_string (tempfile ? tempfile : "");
709 #else
710 cleanup_info_tail = INTEGER_TO_CONS (pid);
711 #endif /* not MSDOS */
712 record_unwind_protect (call_process_cleanup,
713 Fcons (Fcurrent_buffer (),
714 Fcons (INTEGER_TO_CONS (fd[0]),
715 cleanup_info_tail)));
717 if (BUFFERP (buffer))
718 Fset_buffer (buffer);
720 if (NILP (buffer))
722 /* If BUFFER is nil, we must read process output once and then
723 discard it, so setup coding system but with nil. */
724 setup_coding_system (Qnil, &process_coding);
725 process_coding.dst_multibyte = 0;
727 else
729 Lisp_Object val, *args2;
731 val = Qnil;
732 if (!NILP (Vcoding_system_for_read))
733 val = Vcoding_system_for_read;
734 else
736 if (EQ (coding_systems, Qt))
738 ptrdiff_t i;
740 SAFE_NALLOCA (args2, 1, nargs + 1);
741 args2[0] = Qcall_process;
742 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
743 coding_systems
744 = Ffind_operation_coding_system (nargs + 1, args2);
746 if (CONSP (coding_systems))
747 val = XCAR (coding_systems);
748 else if (CONSP (Vdefault_process_coding_system))
749 val = XCAR (Vdefault_process_coding_system);
750 else
751 val = Qnil;
753 Fcheck_coding_system (val);
754 /* In unibyte mode, character code conversion should not take
755 place but EOL conversion should. So, setup raw-text or one
756 of the subsidiary according to the information just setup. */
757 if (NILP (BVAR (current_buffer, enable_multibyte_characters))
758 && !NILP (val))
759 val = raw_text_coding_system (val);
760 setup_coding_system (val, &process_coding);
761 process_coding.dst_multibyte
762 = ! NILP (BVAR (current_buffer, enable_multibyte_characters));
764 process_coding.src_multibyte = 0;
766 immediate_quit = 1;
767 QUIT;
769 if (output_to_buffer)
771 register int nread;
772 int first = 1;
773 EMACS_INT total_read = 0;
774 int carryover = 0;
775 int display_on_the_fly = display_p;
776 struct coding_system saved_coding;
778 saved_coding = process_coding;
779 while (1)
781 /* Repeatedly read until we've filled as much as possible
782 of the buffer size we have. But don't read
783 less than 1024--save that for the next bufferful. */
784 nread = carryover;
785 while (nread < bufsize - 1024)
787 int this_read = emacs_read (fd[0], buf + nread,
788 bufsize - nread);
790 if (this_read < 0)
791 goto give_up;
793 if (this_read == 0)
795 process_coding.mode |= CODING_MODE_LAST_BLOCK;
796 break;
799 nread += this_read;
800 total_read += this_read;
802 if (display_on_the_fly)
803 break;
806 /* Now NREAD is the total amount of data in the buffer. */
807 immediate_quit = 0;
809 if (!NILP (buffer))
811 if (NILP (BVAR (current_buffer, enable_multibyte_characters))
812 && ! CODING_MAY_REQUIRE_DECODING (&process_coding))
813 insert_1_both (buf, nread, nread, 0, 1, 0);
814 else
815 { /* We have to decode the input. */
816 Lisp_Object curbuf;
817 ptrdiff_t count1 = SPECPDL_INDEX ();
819 XSETBUFFER (curbuf, current_buffer);
820 /* We cannot allow after-change-functions be run
821 during decoding, because that might modify the
822 buffer, while we rely on process_coding.produced to
823 faithfully reflect inserted text until we
824 TEMP_SET_PT_BOTH below. */
825 specbind (Qinhibit_modification_hooks, Qt);
826 decode_coding_c_string (&process_coding,
827 (unsigned char *) buf, nread, curbuf);
828 unbind_to (count1, Qnil);
829 if (display_on_the_fly
830 && CODING_REQUIRE_DETECTION (&saved_coding)
831 && ! CODING_REQUIRE_DETECTION (&process_coding))
833 /* We have detected some coding system. But,
834 there's a possibility that the detection was
835 done by insufficient data. So, we give up
836 displaying on the fly. */
837 if (process_coding.produced > 0)
838 del_range_2 (process_coding.dst_pos,
839 process_coding.dst_pos_byte,
840 process_coding.dst_pos
841 + process_coding.produced_char,
842 process_coding.dst_pos_byte
843 + process_coding.produced, 0);
844 display_on_the_fly = 0;
845 process_coding = saved_coding;
846 carryover = nread;
847 /* This is to make the above condition always
848 fails in the future. */
849 saved_coding.common_flags
850 &= ~CODING_REQUIRE_DETECTION_MASK;
851 continue;
854 TEMP_SET_PT_BOTH (PT + process_coding.produced_char,
855 PT_BYTE + process_coding.produced);
856 carryover = process_coding.carryover_bytes;
857 if (carryover > 0)
858 memcpy (buf, process_coding.carryover,
859 process_coding.carryover_bytes);
863 if (process_coding.mode & CODING_MODE_LAST_BLOCK)
864 break;
866 /* Make the buffer bigger as we continue to read more data,
867 but not past CALLPROC_BUFFER_SIZE_MAX. */
868 if (bufsize < CALLPROC_BUFFER_SIZE_MAX && total_read > 32 * bufsize)
869 if ((bufsize *= 2) > CALLPROC_BUFFER_SIZE_MAX)
870 bufsize = CALLPROC_BUFFER_SIZE_MAX;
872 if (display_p)
874 if (first)
875 prepare_menu_bars ();
876 first = 0;
877 redisplay_preserve_echo_area (1);
878 /* This variable might have been set to 0 for code
879 detection. In that case, we set it back to 1 because
880 we should have already detected a coding system. */
881 display_on_the_fly = 1;
883 immediate_quit = 1;
884 QUIT;
886 give_up: ;
888 Vlast_coding_system_used = CODING_ID_NAME (process_coding.id);
889 /* If the caller required, let the buffer inherit the
890 coding-system used to decode the process output. */
891 if (inherit_process_coding_system)
892 call1 (intern ("after-insert-file-set-buffer-file-coding-system"),
893 make_number (total_read));
896 #ifndef MSDOS
897 /* Wait for it to terminate, unless it already has. */
898 if (output_to_buffer)
899 wait_for_termination (pid);
900 else
901 interruptible_wait_for_termination (pid);
902 #endif
904 immediate_quit = 0;
906 /* Don't kill any children that the subprocess may have left behind
907 when exiting. */
908 call_process_exited = 1;
910 SAFE_FREE ();
911 unbind_to (count, Qnil);
913 if (synch_process_termsig)
915 const char *signame;
917 synchronize_system_messages_locale ();
918 signame = strsignal (synch_process_termsig);
920 if (signame == 0)
921 signame = "unknown";
923 synch_process_death = signame;
926 if (synch_process_death)
927 return code_convert_string_norecord (build_string (synch_process_death),
928 Vlocale_coding_system, 0);
929 return make_number (synch_process_retcode);
932 static Lisp_Object
933 delete_temp_file (Lisp_Object name)
935 /* Suppress jka-compr handling, etc. */
936 ptrdiff_t count = SPECPDL_INDEX ();
937 specbind (intern ("file-name-handler-alist"), Qnil);
938 internal_delete_file (name);
939 unbind_to (count, Qnil);
940 return Qnil;
943 DEFUN ("call-process-region", Fcall_process_region, Scall_process_region,
944 3, MANY, 0,
945 doc: /* Send text from START to END to a synchronous process running PROGRAM.
946 The remaining arguments are optional.
947 Delete the text if fourth arg DELETE is non-nil.
949 Insert output in BUFFER before point; t means current buffer; nil for
950 BUFFER means discard it; 0 means discard and don't wait; and `(:file
951 FILE)', where FILE is a file name string, means that it should be
952 written to that file.
953 BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,
954 REAL-BUFFER says what to do with standard output, as above,
955 while STDERR-FILE says what to do with standard error in the child.
956 STDERR-FILE may be nil (discard standard error output),
957 t (mix it with ordinary output), or a file name string.
959 Sixth arg DISPLAY non-nil means redisplay buffer as output is inserted.
960 Remaining args are passed to PROGRAM at startup as command args.
962 If BUFFER is 0, `call-process-region' returns immediately with value nil.
963 Otherwise it waits for PROGRAM to terminate
964 and returns a numeric exit status or a signal description string.
965 If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.
967 usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &rest ARGS) */)
968 (ptrdiff_t nargs, Lisp_Object *args)
970 struct gcpro gcpro1;
971 Lisp_Object filename_string;
972 register Lisp_Object start, end;
973 ptrdiff_t count = SPECPDL_INDEX ();
974 /* Qt denotes we have not yet called Ffind_operation_coding_system. */
975 Lisp_Object coding_systems;
976 Lisp_Object val, *args2;
977 ptrdiff_t i;
978 char *tempfile;
979 Lisp_Object tmpdir, pattern;
981 if (STRINGP (Vtemporary_file_directory))
982 tmpdir = Vtemporary_file_directory;
983 else
985 #ifndef DOS_NT
986 if (getenv ("TMPDIR"))
987 tmpdir = build_string (getenv ("TMPDIR"));
988 else
989 tmpdir = build_string ("/tmp/");
990 #else /* DOS_NT */
991 char *outf;
992 if ((outf = egetenv ("TMPDIR"))
993 || (outf = egetenv ("TMP"))
994 || (outf = egetenv ("TEMP")))
995 tmpdir = build_string (outf);
996 else
997 tmpdir = Ffile_name_as_directory (build_string ("c:/temp"));
998 #endif
1002 USE_SAFE_ALLOCA;
1003 pattern = Fexpand_file_name (Vtemp_file_name_pattern, tmpdir);
1004 SAFE_ALLOCA (tempfile, char *, SBYTES (pattern) + 1);
1005 memcpy (tempfile, SDATA (pattern), SBYTES (pattern) + 1);
1006 coding_systems = Qt;
1008 #ifdef HAVE_MKSTEMP
1010 int fd;
1012 BLOCK_INPUT;
1013 fd = mkstemp (tempfile);
1014 UNBLOCK_INPUT;
1015 if (fd == -1)
1016 report_file_error ("Failed to open temporary file",
1017 Fcons (Vtemp_file_name_pattern, Qnil));
1018 else
1019 close (fd);
1021 #else
1022 mktemp (tempfile);
1023 #endif
1025 filename_string = build_string (tempfile);
1026 GCPRO1 (filename_string);
1027 SAFE_FREE ();
1030 start = args[0];
1031 end = args[1];
1032 /* Decide coding-system of the contents of the temporary file. */
1033 if (!NILP (Vcoding_system_for_write))
1034 val = Vcoding_system_for_write;
1035 else if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
1036 val = Qraw_text;
1037 else
1039 USE_SAFE_ALLOCA;
1040 SAFE_NALLOCA (args2, 1, nargs + 1);
1041 args2[0] = Qcall_process_region;
1042 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
1043 coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
1044 val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil;
1045 SAFE_FREE ();
1047 val = complement_process_encoding_system (val);
1050 ptrdiff_t count1 = SPECPDL_INDEX ();
1052 specbind (intern ("coding-system-for-write"), val);
1053 /* POSIX lets mk[s]temp use "."; don't invoke jka-compr if we
1054 happen to get a ".Z" suffix. */
1055 specbind (intern ("file-name-handler-alist"), Qnil);
1056 Fwrite_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil);
1058 unbind_to (count1, Qnil);
1061 /* Note that Fcall_process takes care of binding
1062 coding-system-for-read. */
1064 record_unwind_protect (delete_temp_file, filename_string);
1066 if (nargs > 3 && !NILP (args[3]))
1067 Fdelete_region (start, end);
1069 if (nargs > 3)
1071 args += 2;
1072 nargs -= 2;
1074 else
1076 args[0] = args[2];
1077 nargs = 2;
1079 args[1] = filename_string;
1081 RETURN_UNGCPRO (unbind_to (count, Fcall_process (nargs, args)));
1084 #ifndef WINDOWSNT
1085 static int relocate_fd (int fd, int minfd);
1086 #endif
1088 static char **
1089 add_env (char **env, char **new_env, char *string)
1091 char **ep;
1092 int ok = 1;
1093 if (string == NULL)
1094 return new_env;
1096 /* See if this string duplicates any string already in the env.
1097 If so, don't put it in.
1098 When an env var has multiple definitions,
1099 we keep the definition that comes first in process-environment. */
1100 for (ep = env; ok && ep != new_env; ep++)
1102 char *p = *ep, *q = string;
1103 while (ok)
1105 if (*q != *p)
1106 break;
1107 if (*q == 0)
1108 /* The string is a lone variable name; keep it for now, we
1109 will remove it later. It is a placeholder for a
1110 variable that is not to be included in the environment. */
1111 break;
1112 if (*q == '=')
1113 ok = 0;
1114 p++, q++;
1117 if (ok)
1118 *new_env++ = string;
1119 return new_env;
1122 /* This is the last thing run in a newly forked inferior
1123 either synchronous or asynchronous.
1124 Copy descriptors IN, OUT and ERR as descriptors 0, 1 and 2.
1125 Initialize inferior's priority, pgrp, connected dir and environment.
1126 then exec another program based on new_argv.
1128 This function may change environ for the superior process.
1129 Therefore, the superior process must save and restore the value
1130 of environ around the vfork and the call to this function.
1132 SET_PGRP is nonzero if we should put the subprocess into a separate
1133 process group.
1135 CURRENT_DIR is an elisp string giving the path of the current
1136 directory the subprocess should have. Since we can't really signal
1137 a decent error from within the child, this should be verified as an
1138 executable directory by the parent. */
1141 child_setup (int in, int out, int err, register char **new_argv, int set_pgrp, Lisp_Object current_dir)
1143 char **env;
1144 char *pwd_var;
1145 #ifdef WINDOWSNT
1146 int cpid;
1147 HANDLE handles[3];
1148 #endif /* WINDOWSNT */
1150 pid_t pid = getpid ();
1152 /* Close Emacs's descriptors that this process should not have. */
1153 close_process_descs ();
1155 /* DOS_NT isn't in a vfork, so if we are in the middle of load-file,
1156 we will lose if we call close_load_descs here. */
1157 #ifndef DOS_NT
1158 close_load_descs ();
1159 #endif
1161 /* Note that use of alloca is always safe here. It's obvious for systems
1162 that do not have true vfork or that have true (stack) alloca.
1163 If using vfork and C_ALLOCA (when Emacs used to include
1164 src/alloca.c) it is safe because that changes the superior's
1165 static variables as if the superior had done alloca and will be
1166 cleaned up in the usual way. */
1168 register char *temp;
1169 size_t i; /* size_t, because ptrdiff_t might overflow here! */
1171 i = SBYTES (current_dir);
1172 #ifdef MSDOS
1173 /* MSDOS must have all environment variables malloc'ed, because
1174 low-level libc functions that launch subsidiary processes rely
1175 on that. */
1176 pwd_var = (char *) xmalloc (i + 6);
1177 #else
1178 pwd_var = (char *) alloca (i + 6);
1179 #endif
1180 temp = pwd_var + 4;
1181 memcpy (pwd_var, "PWD=", 4);
1182 memcpy (temp, SDATA (current_dir), i);
1183 if (!IS_DIRECTORY_SEP (temp[i - 1])) temp[i++] = DIRECTORY_SEP;
1184 temp[i] = 0;
1186 #ifndef DOS_NT
1187 /* We can't signal an Elisp error here; we're in a vfork. Since
1188 the callers check the current directory before forking, this
1189 should only return an error if the directory's permissions
1190 are changed between the check and this chdir, but we should
1191 at least check. */
1192 if (chdir (temp) < 0)
1193 _exit (errno);
1194 #else /* DOS_NT */
1195 /* Get past the drive letter, so that d:/ is left alone. */
1196 if (i > 2 && IS_DEVICE_SEP (temp[1]) && IS_DIRECTORY_SEP (temp[2]))
1198 temp += 2;
1199 i -= 2;
1201 #endif /* DOS_NT */
1203 /* Strip trailing slashes for PWD, but leave "/" and "//" alone. */
1204 while (i > 2 && IS_DIRECTORY_SEP (temp[i - 1]))
1205 temp[--i] = 0;
1208 /* Set `env' to a vector of the strings in the environment. */
1210 register Lisp_Object tem;
1211 register char **new_env;
1212 char **p, **q;
1213 register int new_length;
1214 Lisp_Object display = Qnil;
1216 new_length = 0;
1218 for (tem = Vprocess_environment;
1219 CONSP (tem) && STRINGP (XCAR (tem));
1220 tem = XCDR (tem))
1222 if (strncmp (SSDATA (XCAR (tem)), "DISPLAY", 7) == 0
1223 && (SDATA (XCAR (tem)) [7] == '\0'
1224 || SDATA (XCAR (tem)) [7] == '='))
1225 /* DISPLAY is specified in process-environment. */
1226 display = Qt;
1227 new_length++;
1230 /* If not provided yet, use the frame's DISPLAY. */
1231 if (NILP (display))
1233 Lisp_Object tmp = Fframe_parameter (selected_frame, Qdisplay);
1234 if (!STRINGP (tmp) && CONSP (Vinitial_environment))
1235 /* If still not found, Look for DISPLAY in Vinitial_environment. */
1236 tmp = Fgetenv_internal (build_string ("DISPLAY"),
1237 Vinitial_environment);
1238 if (STRINGP (tmp))
1240 display = tmp;
1241 new_length++;
1245 /* new_length + 2 to include PWD and terminating 0. */
1246 env = new_env = (char **) alloca ((new_length + 2) * sizeof (char *));
1247 /* If we have a PWD envvar, pass one down,
1248 but with corrected value. */
1249 if (egetenv ("PWD"))
1250 *new_env++ = pwd_var;
1252 if (STRINGP (display))
1254 char *vdata = (char *) alloca (sizeof "DISPLAY=" + SBYTES (display));
1255 strcpy (vdata, "DISPLAY=");
1256 strcat (vdata, SSDATA (display));
1257 new_env = add_env (env, new_env, vdata);
1260 /* Overrides. */
1261 for (tem = Vprocess_environment;
1262 CONSP (tem) && STRINGP (XCAR (tem));
1263 tem = XCDR (tem))
1264 new_env = add_env (env, new_env, SSDATA (XCAR (tem)));
1266 *new_env = 0;
1268 /* Remove variable names without values. */
1269 p = q = env;
1270 while (*p != 0)
1272 while (*q != 0 && strchr (*q, '=') == NULL)
1273 q++;
1274 *p = *q++;
1275 if (*p != 0)
1276 p++;
1281 #ifdef WINDOWSNT
1282 prepare_standard_handles (in, out, err, handles);
1283 set_process_dir (SDATA (current_dir));
1284 /* Spawn the child. (See ntproc.c:Spawnve). */
1285 cpid = spawnve (_P_NOWAIT, new_argv[0], new_argv, env);
1286 reset_standard_handles (in, out, err, handles);
1287 if (cpid == -1)
1288 /* An error occurred while trying to spawn the process. */
1289 report_file_error ("Spawning child process", Qnil);
1290 return cpid;
1292 #else /* not WINDOWSNT */
1293 /* Make sure that in, out, and err are not actually already in
1294 descriptors zero, one, or two; this could happen if Emacs is
1295 started with its standard in, out, or error closed, as might
1296 happen under X. */
1298 int oin = in, oout = out;
1300 /* We have to avoid relocating the same descriptor twice! */
1302 in = relocate_fd (in, 3);
1304 if (out == oin)
1305 out = in;
1306 else
1307 out = relocate_fd (out, 3);
1309 if (err == oin)
1310 err = in;
1311 else if (err == oout)
1312 err = out;
1313 else
1314 err = relocate_fd (err, 3);
1317 #ifndef MSDOS
1318 emacs_close (0);
1319 emacs_close (1);
1320 emacs_close (2);
1322 dup2 (in, 0);
1323 dup2 (out, 1);
1324 dup2 (err, 2);
1325 emacs_close (in);
1326 if (out != in)
1327 emacs_close (out);
1328 if (err != in && err != out)
1329 emacs_close (err);
1331 #if defined (USG)
1332 #ifndef SETPGRP_RELEASES_CTTY
1333 setpgrp (); /* No arguments but equivalent in this case */
1334 #endif
1335 #else /* not USG */
1336 setpgrp (pid, pid);
1337 #endif /* not USG */
1339 /* setpgrp_of_tty is incorrect here; it uses input_fd. */
1340 tcsetpgrp (0, pid);
1342 /* execvp does not accept an environment arg so the only way
1343 to pass this environment is to set environ. Our caller
1344 is responsible for restoring the ambient value of environ. */
1345 environ = env;
1346 execvp (new_argv[0], new_argv);
1348 emacs_write (1, "Can't exec program: ", 20);
1349 emacs_write (1, new_argv[0], strlen (new_argv[0]));
1350 emacs_write (1, "\n", 1);
1351 _exit (1);
1353 #else /* MSDOS */
1354 pid = run_msdos_command (new_argv, pwd_var + 4, in, out, err, env);
1355 xfree (pwd_var);
1356 if (pid == -1)
1357 /* An error occurred while trying to run the subprocess. */
1358 report_file_error ("Spawning child process", Qnil);
1359 return pid;
1360 #endif /* MSDOS */
1361 #endif /* not WINDOWSNT */
1364 #ifndef WINDOWSNT
1365 /* Move the file descriptor FD so that its number is not less than MINFD.
1366 If the file descriptor is moved at all, the original is freed. */
1367 static int
1368 relocate_fd (int fd, int minfd)
1370 if (fd >= minfd)
1371 return fd;
1372 else
1374 int new;
1375 #ifdef F_DUPFD
1376 new = fcntl (fd, F_DUPFD, minfd);
1377 #else
1378 new = dup (fd);
1379 if (new != -1)
1380 /* Note that we hold the original FD open while we recurse,
1381 to guarantee we'll get a new FD if we need it. */
1382 new = relocate_fd (new, minfd);
1383 #endif
1384 if (new == -1)
1386 const char *message_1 = "Error while setting up child: ";
1387 const char *errmessage = strerror (errno);
1388 const char *message_2 = "\n";
1389 emacs_write (2, message_1, strlen (message_1));
1390 emacs_write (2, errmessage, strlen (errmessage));
1391 emacs_write (2, message_2, strlen (message_2));
1392 _exit (1);
1394 emacs_close (fd);
1395 return new;
1398 #endif /* not WINDOWSNT */
1400 static int
1401 getenv_internal_1 (const char *var, ptrdiff_t varlen, char **value,
1402 ptrdiff_t *valuelen, Lisp_Object env)
1404 for (; CONSP (env); env = XCDR (env))
1406 Lisp_Object entry = XCAR (env);
1407 if (STRINGP (entry)
1408 && SBYTES (entry) >= varlen
1409 #ifdef WINDOWSNT
1410 /* NT environment variables are case insensitive. */
1411 && ! strnicmp (SDATA (entry), var, varlen)
1412 #else /* not WINDOWSNT */
1413 && ! memcmp (SDATA (entry), var, varlen)
1414 #endif /* not WINDOWSNT */
1417 if (SBYTES (entry) > varlen && SREF (entry, varlen) == '=')
1419 *value = SSDATA (entry) + (varlen + 1);
1420 *valuelen = SBYTES (entry) - (varlen + 1);
1421 return 1;
1423 else if (SBYTES (entry) == varlen)
1425 /* Lone variable names in Vprocess_environment mean that
1426 variable should be removed from the environment. */
1427 *value = NULL;
1428 return 1;
1432 return 0;
1435 static int
1436 getenv_internal (const char *var, ptrdiff_t varlen, char **value,
1437 ptrdiff_t *valuelen, Lisp_Object frame)
1439 /* Try to find VAR in Vprocess_environment first. */
1440 if (getenv_internal_1 (var, varlen, value, valuelen,
1441 Vprocess_environment))
1442 return *value ? 1 : 0;
1444 /* For DISPLAY try to get the values from the frame or the initial env. */
1445 if (strcmp (var, "DISPLAY") == 0)
1447 Lisp_Object display
1448 = Fframe_parameter (NILP (frame) ? selected_frame : frame, Qdisplay);
1449 if (STRINGP (display))
1451 *value = SSDATA (display);
1452 *valuelen = SBYTES (display);
1453 return 1;
1455 /* If still not found, Look for DISPLAY in Vinitial_environment. */
1456 if (getenv_internal_1 (var, varlen, value, valuelen,
1457 Vinitial_environment))
1458 return *value ? 1 : 0;
1461 return 0;
1464 DEFUN ("getenv-internal", Fgetenv_internal, Sgetenv_internal, 1, 2, 0,
1465 doc: /* Get the value of environment variable VARIABLE.
1466 VARIABLE should be a string. Value is nil if VARIABLE is undefined in
1467 the environment. Otherwise, value is a string.
1469 This function searches `process-environment' for VARIABLE.
1471 If optional parameter ENV is a list, then search this list instead of
1472 `process-environment', and return t when encountering a negative entry
1473 \(an entry for a variable with no value). */)
1474 (Lisp_Object variable, Lisp_Object env)
1476 char *value;
1477 ptrdiff_t valuelen;
1479 CHECK_STRING (variable);
1480 if (CONSP (env))
1482 if (getenv_internal_1 (SSDATA (variable), SBYTES (variable),
1483 &value, &valuelen, env))
1484 return value ? make_string (value, valuelen) : Qt;
1485 else
1486 return Qnil;
1488 else if (getenv_internal (SSDATA (variable), SBYTES (variable),
1489 &value, &valuelen, env))
1490 return make_string (value, valuelen);
1491 else
1492 return Qnil;
1495 /* A version of getenv that consults the Lisp environment lists,
1496 easily callable from C. */
1497 char *
1498 egetenv (const char *var)
1500 char *value;
1501 ptrdiff_t valuelen;
1503 if (getenv_internal (var, strlen (var), &value, &valuelen, Qnil))
1504 return value;
1505 else
1506 return 0;
1510 /* This is run before init_cmdargs. */
1512 void
1513 init_callproc_1 (void)
1515 char *data_dir = egetenv ("EMACSDATA");
1516 char *doc_dir = egetenv ("EMACSDOC");
1518 Vdata_directory
1519 = Ffile_name_as_directory (build_string (data_dir ? data_dir
1520 : PATH_DATA));
1521 Vdoc_directory
1522 = Ffile_name_as_directory (build_string (doc_dir ? doc_dir
1523 : PATH_DOC));
1525 /* Check the EMACSPATH environment variable, defaulting to the
1526 PATH_EXEC path from epaths.h. */
1527 Vexec_path = decode_env_path ("EMACSPATH", PATH_EXEC);
1528 Vexec_directory = Ffile_name_as_directory (Fcar (Vexec_path));
1529 Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path);
1532 /* This is run after init_cmdargs, when Vinstallation_directory is valid. */
1534 void
1535 init_callproc (void)
1537 char *data_dir = egetenv ("EMACSDATA");
1539 register char * sh;
1540 Lisp_Object tempdir;
1542 if (!NILP (Vinstallation_directory))
1544 /* Add to the path the lib-src subdir of the installation dir. */
1545 Lisp_Object tem;
1546 tem = Fexpand_file_name (build_string ("lib-src"),
1547 Vinstallation_directory);
1548 #ifndef DOS_NT
1549 /* MSDOS uses wrapped binaries, so don't do this. */
1550 if (NILP (Fmember (tem, Vexec_path)))
1552 Vexec_path = decode_env_path ("EMACSPATH", PATH_EXEC);
1553 Vexec_path = Fcons (tem, Vexec_path);
1554 Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path);
1557 Vexec_directory = Ffile_name_as_directory (tem);
1558 #endif /* not DOS_NT */
1560 /* Maybe use ../etc as well as ../lib-src. */
1561 if (data_dir == 0)
1563 tem = Fexpand_file_name (build_string ("etc"),
1564 Vinstallation_directory);
1565 Vdoc_directory = Ffile_name_as_directory (tem);
1569 /* Look for the files that should be in etc. We don't use
1570 Vinstallation_directory, because these files are never installed
1571 near the executable, and they are never in the build
1572 directory when that's different from the source directory.
1574 Instead, if these files are not in the nominal place, we try the
1575 source directory. */
1576 if (data_dir == 0)
1578 Lisp_Object tem, tem1, srcdir;
1580 srcdir = Fexpand_file_name (build_string ("../src/"),
1581 build_string (PATH_DUMPLOADSEARCH));
1582 tem = Fexpand_file_name (build_string ("GNU"), Vdata_directory);
1583 tem1 = Ffile_exists_p (tem);
1584 if (!NILP (Fequal (srcdir, Vinvocation_directory)) || NILP (tem1))
1586 Lisp_Object newdir;
1587 newdir = Fexpand_file_name (build_string ("../etc/"),
1588 build_string (PATH_DUMPLOADSEARCH));
1589 tem = Fexpand_file_name (build_string ("GNU"), newdir);
1590 tem1 = Ffile_exists_p (tem);
1591 if (!NILP (tem1))
1592 Vdata_directory = newdir;
1596 #ifndef CANNOT_DUMP
1597 if (initialized)
1598 #endif
1600 tempdir = Fdirectory_file_name (Vexec_directory);
1601 if (access (SSDATA (tempdir), 0) < 0)
1602 dir_warning ("Warning: arch-dependent data dir (%s) does not exist.\n",
1603 Vexec_directory);
1606 tempdir = Fdirectory_file_name (Vdata_directory);
1607 if (access (SSDATA (tempdir), 0) < 0)
1608 dir_warning ("Warning: arch-independent data dir (%s) does not exist.\n",
1609 Vdata_directory);
1611 sh = (char *) getenv ("SHELL");
1612 Vshell_file_name = build_string (sh ? sh : "/bin/sh");
1614 #ifdef DOS_NT
1615 Vshared_game_score_directory = Qnil;
1616 #else
1617 Vshared_game_score_directory = build_string (PATH_GAME);
1618 if (NILP (Ffile_directory_p (Vshared_game_score_directory)))
1619 Vshared_game_score_directory = Qnil;
1620 #endif
1623 void
1624 set_initial_environment (void)
1626 char **envp;
1627 for (envp = environ; *envp; envp++)
1628 Vprocess_environment = Fcons (build_string (*envp),
1629 Vprocess_environment);
1630 /* Ideally, the `copy' shouldn't be necessary, but it seems it's frequent
1631 to use `delete' and friends on process-environment. */
1632 Vinitial_environment = Fcopy_sequence (Vprocess_environment);
1635 void
1636 syms_of_callproc (void)
1638 #ifndef DOS_NT
1639 Vtemp_file_name_pattern = build_string ("emacsXXXXXX");
1640 #elif defined (WINDOWSNT)
1641 Vtemp_file_name_pattern = build_string ("emXXXXXX");
1642 #else
1643 Vtemp_file_name_pattern = build_string ("detmp.XXX");
1644 #endif
1645 staticpro (&Vtemp_file_name_pattern);
1647 DEFVAR_LISP ("shell-file-name", Vshell_file_name,
1648 doc: /* *File name to load inferior shells from.
1649 Initialized from the SHELL environment variable, or to a system-dependent
1650 default if SHELL is not set. */);
1652 DEFVAR_LISP ("exec-path", Vexec_path,
1653 doc: /* *List of directories to search programs to run in subprocesses.
1654 Each element is a string (directory name) or nil (try default directory). */);
1656 DEFVAR_LISP ("exec-suffixes", Vexec_suffixes,
1657 doc: /* *List of suffixes to try to find executable file names.
1658 Each element is a string. */);
1659 Vexec_suffixes = Qnil;
1661 DEFVAR_LISP ("exec-directory", Vexec_directory,
1662 doc: /* Directory for executables for Emacs to invoke.
1663 More generally, this includes any architecture-dependent files
1664 that are built and installed from the Emacs distribution. */);
1666 DEFVAR_LISP ("data-directory", Vdata_directory,
1667 doc: /* Directory of machine-independent files that come with GNU Emacs.
1668 These are files intended for Emacs to use while it runs. */);
1670 DEFVAR_LISP ("doc-directory", Vdoc_directory,
1671 doc: /* Directory containing the DOC file that comes with GNU Emacs.
1672 This is usually the same as `data-directory'. */);
1674 DEFVAR_LISP ("configure-info-directory", Vconfigure_info_directory,
1675 doc: /* For internal use by the build procedure only.
1676 This is the name of the directory in which the build procedure installed
1677 Emacs's info files; the default value for `Info-default-directory-list'
1678 includes this. */);
1679 Vconfigure_info_directory = build_string (PATH_INFO);
1681 DEFVAR_LISP ("shared-game-score-directory", Vshared_game_score_directory,
1682 doc: /* Directory of score files for games which come with GNU Emacs.
1683 If this variable is nil, then Emacs is unable to use a shared directory. */);
1684 #ifdef DOS_NT
1685 Vshared_game_score_directory = Qnil;
1686 #else
1687 Vshared_game_score_directory = build_string (PATH_GAME);
1688 #endif
1690 DEFVAR_LISP ("initial-environment", Vinitial_environment,
1691 doc: /* List of environment variables inherited from the parent process.
1692 Each element should be a string of the form ENVVARNAME=VALUE.
1693 The elements must normally be decoded (using `locale-coding-system') for use. */);
1694 Vinitial_environment = Qnil;
1696 DEFVAR_LISP ("process-environment", Vprocess_environment,
1697 doc: /* List of overridden environment variables for subprocesses to inherit.
1698 Each element should be a string of the form ENVVARNAME=VALUE.
1700 Entries in this list take precedence to those in the frame-local
1701 environments. Therefore, let-binding `process-environment' is an easy
1702 way to temporarily change the value of an environment variable,
1703 irrespective of where it comes from. To use `process-environment' to
1704 remove an environment variable, include only its name in the list,
1705 without "=VALUE".
1707 This variable is set to nil when Emacs starts.
1709 If multiple entries define the same variable, the first one always
1710 takes precedence.
1712 Non-ASCII characters are encoded according to the initial value of
1713 `locale-coding-system', i.e. the elements must normally be decoded for
1714 use.
1716 See `setenv' and `getenv'. */);
1717 Vprocess_environment = Qnil;
1719 defsubr (&Scall_process);
1720 defsubr (&Sgetenv_internal);
1721 defsubr (&Scall_process_region);