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