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