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