1 /* Synchronous subprocess invocation for GNU Emacs.
2 Copyright (C) 1985, 1986, 1987, 1988, 1993 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
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 1, or (at your option)
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.
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, 675 Mass Ave, Cambridge, MA 02139, USA. */
28 extern char *sys_errlist
[];
31 /* Define SIGCHLD as an alias for SIGCLD. */
33 #if !defined (SIGCHLD) && defined (SIGCLD)
34 #define SIGCHLD SIGCLD
37 #include <sys/types.h>
44 #ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
47 #include <sys/param.h>
64 #include "syssignal.h"
68 extern noshare
char **environ
;
70 extern char **environ
;
73 #define max(a, b) ((a) > (b) ? (a) : (b))
76 Lisp_Object Vbinary_process
;
79 Lisp_Object Vexec_path
, Vexec_directory
, Vdata_directory
;
80 Lisp_Object Vconfigure_info_directory
;
82 Lisp_Object Vshell_file_name
;
84 Lisp_Object Vprocess_environment
;
86 /* True iff we are about to fork off a synchronous process or if we
87 are waiting for it. */
88 int synch_process_alive
;
90 /* Nonzero => this is a string explaining death of synchronous subprocess. */
91 char *synch_process_death
;
93 /* If synch_process_death is zero,
94 this is exit code of synchronous subprocess. */
95 int synch_process_retcode
;
97 extern Lisp_Object Vdoc_file_name
;
99 #ifndef VMS /* VMS version is in vmsproc.c. */
102 call_process_kill (fdpid
)
105 close (XFASTINT (Fcar (fdpid
)));
106 EMACS_KILLPG (XFASTINT (Fcdr (fdpid
)), SIGKILL
);
107 synch_process_alive
= 0;
112 call_process_cleanup (fdpid
)
116 /* for MSDOS fdpid is really (fd . tempfile) */
117 register Lisp_Object file
= Fcdr (fdpid
);
118 close (XFASTINT (Fcar (fdpid
)));
119 if (strcmp (XSTRING (file
)-> data
, NULL_DEVICE
) != 0)
120 unlink (XSTRING (file
)->data
);
121 #else /* not MSDOS */
122 register int pid
= XFASTINT (Fcdr (fdpid
));
124 if (EMACS_KILLPG (pid
, SIGINT
) == 0)
126 int count
= specpdl_ptr
- specpdl
;
127 record_unwind_protect (call_process_kill
, fdpid
);
128 message1 ("Waiting for process to die...(type C-g again to kill it instantly)");
131 wait_for_termination (pid
);
133 specpdl_ptr
= specpdl
+ count
; /* Discard the unwind protect. */
134 message1 ("Waiting for process to die...done");
136 synch_process_alive
= 0;
137 close (XFASTINT (Fcar (fdpid
)));
138 #endif /* not MSDOS */
142 DEFUN ("call-process", Fcall_process
, Scall_process
, 1, MANY
, 0,
143 "Call PROGRAM synchronously in separate process.\n\
144 The program's input comes from file INFILE (nil means `/dev/null').\n\
145 Insert output in BUFFER before point; t means current buffer;\n\
146 nil for BUFFER means discard it; 0 means discard and don't wait.\n\
147 Fourth arg DISPLAY non-nil means redisplay buffer as output is inserted.\n\
148 Remaining arguments are strings passed as command arguments to PROGRAM.\n\
149 If BUFFER is 0, returns immediately with value nil.\n\
150 Otherwise waits for PROGRAM to terminate\n\
151 and returns a numeric exit status or a signal description string.\n\
152 If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
155 register Lisp_Object
*args
;
157 Lisp_Object infile
, buffer
, current_dir
, display
, path
;
162 int count
= specpdl_ptr
- specpdl
;
163 register unsigned char **new_argv
164 = (unsigned char **) alloca ((max (2, nargs
- 2)) * sizeof (char *));
165 struct buffer
*old
= current_buffer
;
166 #ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
167 char *outf
, *tempfile
;
173 CHECK_STRING (args
[0], 0);
176 /* Without asynchronous processes we cannot have BUFFER == 0. */
177 if (nargs
>= 3 && XTYPE (args
[2]) == Lisp_Int
)
178 error ("Operating system cannot handle asynchronous subprocesses");
179 #endif /* subprocesses */
181 if (nargs
>= 2 && ! NILP (args
[1]))
183 infile
= Fexpand_file_name (args
[1], current_buffer
->directory
);
184 CHECK_STRING (infile
, 1);
187 infile
= build_string (NULL_DEVICE
);
191 register Lisp_Object tem
;
193 buffer
= tem
= args
[2];
196 || XFASTINT (tem
) == 0))
198 buffer
= Fget_buffer (tem
);
199 CHECK_BUFFER (buffer
, 2);
205 /* Make sure that the child will be able to chdir to the current
206 buffer's current directory, or its unhandled equivalent. We
207 can't just have the child check for an error when it does the
208 chdir, since it's in a vfork.
210 We have to GCPRO around this because Fexpand_file_name,
211 Funhandled_file_name_directory, and Ffile_accessible_directory_p
212 might call a file name handling function. The argument list is
213 protected by the caller, so all we really have to worry about is
216 struct gcpro gcpro1
, gcpro2
, gcpro3
;
218 current_dir
= current_buffer
->directory
;
220 GCPRO3 (infile
, buffer
, current_dir
);
223 expand_and_dir_to_file
224 (Funhandled_file_name_directory (current_dir
), Qnil
);
225 if (NILP (Ffile_accessible_directory_p (current_dir
)))
226 report_file_error ("Setting current directory",
227 Fcons (current_buffer
->directory
, Qnil
));
232 display
= nargs
>= 4 ? args
[3] : Qnil
;
236 for (i
= 4; i
< nargs
; i
++)
238 CHECK_STRING (args
[i
], i
);
239 new_argv
[i
- 3] = XSTRING (args
[i
])->data
;
241 /* Program name is first command arg */
242 new_argv
[0] = XSTRING (args
[0])->data
;
246 filefd
= open (XSTRING (infile
)->data
, O_RDONLY
, 0);
249 report_file_error ("Opening process input file", Fcons (infile
, Qnil
));
251 /* Search for program; barf if not found. */
252 openp (Vexec_path
, args
[0], EXEC_SUFFIXES
, &path
, 1);
256 report_file_error ("Searching for program", Fcons (args
[0], Qnil
));
258 new_argv
[0] = XSTRING (path
)->data
;
260 #ifdef MSDOS /* MW, July 1993 */
261 /* These vars record information from process termination.
262 Clear them now before process can possibly terminate,
263 to avoid timing error if process terminates soon. */
264 synch_process_death
= 0;
265 synch_process_retcode
= 0;
267 if ((outf
= egetenv ("TMP")) || (outf
= egetenv ("TEMP")))
268 strcpy (tempfile
= alloca (strlen (outf
) + 20), outf
);
271 tempfile
= alloca (20);
274 dostounix_filename (tempfile
);
275 if (*tempfile
== '\0' || tempfile
[strlen (tempfile
) - 1] != '/')
276 strcat (tempfile
, "/");
277 strcat (tempfile
, "detmp.XXX");
280 outfilefd
= creat (tempfile
, S_IREAD
| S_IWRITE
);
284 report_file_error ("Opening process output file", Fcons (tempfile
, Qnil
));
288 if (XTYPE (buffer
) == Lisp_Int
)
289 fd
[1] = open (NULL_DEVICE
, O_WRONLY
), fd
[0] = -1;
296 /* Replaced by close_process_descs */
297 set_exclusive_use (fd
[0]);
302 /* child_setup must clobber environ in systems with true vfork.
303 Protect it from permanent change. */
304 register char **save_environ
= environ
;
305 register int fd1
= fd
[1];
307 #if 0 /* Some systems don't have sigblock. */
308 mask
= sigblock (sigmask (SIGCHLD
));
311 /* Record that we're about to create a synchronous process. */
312 synch_process_alive
= 1;
314 /* These vars record information from process termination.
315 Clear them now before process can possibly terminate,
316 to avoid timing error if process terminates soon. */
317 synch_process_death
= 0;
318 synch_process_retcode
= 0;
320 #ifdef MSDOS /* MW, July 1993 */
321 pid
= run_msdos_command (new_argv
, current_dir
, filefd
, outfilefd
);
323 fd1
= -1; /* No harm in closing that one! */
324 fd
[0] = open (tempfile
, NILP (Vbinary_process
) ? O_TEXT
: O_BINARY
);
328 report_file_error ("Cannot re-open temporary file", Qnil
);
330 #else /* not MSDOS */
342 child_setup (filefd
, fd1
, fd1
, new_argv
, 0, current_dir
);
344 #endif /* not MSDOS */
347 /* Tell SIGCHLD handler to look for this pid. */
348 synch_process_pid
= pid
;
349 /* Now let SIGCHLD come through. */
353 environ
= save_environ
;
363 report_file_error ("Doing vfork", Qnil
);
366 if (XTYPE (buffer
) == Lisp_Int
)
369 /* If Emacs has been built with asynchronous subprocess support,
370 we don't need to do this, I think because it will then have
371 the facilities for handling SIGCHLD. */
372 wait_without_blocking ();
373 #endif /* subprocesses */
378 /* MSDOS needs different cleanup information. */
379 record_unwind_protect (call_process_cleanup
,
380 Fcons (make_number (fd
[0]), build_string (tempfile
)));
382 record_unwind_protect (call_process_cleanup
,
383 Fcons (make_number (fd
[0]), make_number (pid
)));
384 #endif /* not MSDOS */
387 if (XTYPE (buffer
) == Lisp_Buffer
)
388 Fset_buffer (buffer
);
397 while ((nread
= read (fd
[0], buf
, sizeof buf
)) > 0)
402 if (!NILP (display
) && INTERACTIVE
)
405 prepare_menu_bars ();
407 redisplay_preserve_echo_area ();
414 /* Wait for it to terminate, unless it already has. */
415 wait_for_termination (pid
);
419 set_buffer_internal (old
);
421 unbind_to (count
, Qnil
);
423 if (synch_process_death
)
424 return build_string (synch_process_death
);
425 return make_number (synch_process_retcode
);
430 delete_temp_file (name
)
433 unlink (XSTRING (name
)->data
);
436 DEFUN ("call-process-region", Fcall_process_region
, Scall_process_region
,
438 "Send text from START to END to a synchronous process running PROGRAM.\n\
439 Delete the text if fourth arg DELETE is non-nil.\n\
440 Insert output in BUFFER before point; t means current buffer;\n\
441 nil for BUFFER means discard it; 0 means discard and don't wait.\n\
442 Sixth arg DISPLAY non-nil means redisplay buffer as output is inserted.\n\
443 Remaining args are passed to PROGRAM at startup as command args.\n\
444 If BUFFER is nil, returns immediately with value nil.\n\
445 Otherwise waits for PROGRAM to terminate\n\
446 and returns a numeric exit status or a signal description string.\n\
447 If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
450 register Lisp_Object
*args
;
452 register Lisp_Object filename_string
, start
, end
;
458 int count
= specpdl_ptr
- specpdl
;
462 if ((outf
= egetenv ("TMP")) || (outf
= egetenv ("TEMP")))
463 strcpy (tempfile
= alloca (strlen (outf
) + 20), outf
);
466 tempfile
= alloca (20);
469 dostounix_filename (tempfile
);
470 if (tempfile
[strlen (tempfile
) - 1] != '/')
471 strcat (tempfile
, "/");
472 strcat (tempfile
, "detmp.XXX");
473 #else /* not MSDOS */
476 strcpy (tempfile
, "tmp:emacsXXXXXX.");
478 strcpy (tempfile
, "/tmp/emacsXXXXXX");
480 #endif /* not MSDOS */
484 filename_string
= build_string (tempfile
);
487 Fwrite_region (start
, end
, filename_string
, Qnil
, Qlambda
);
488 record_unwind_protect (delete_temp_file
, filename_string
);
491 Fdelete_region (start
, end
);
493 args
[3] = filename_string
;
495 return unbind_to (count
, Fcall_process (nargs
- 2, args
+ 2));
498 #ifndef VMS /* VMS version is in vmsproc.c. */
500 /* This is the last thing run in a newly forked inferior
501 either synchronous or asynchronous.
502 Copy descriptors IN, OUT and ERR as descriptors 0, 1 and 2.
503 Initialize inferior's priority, pgrp, connected dir and environment.
504 then exec another program based on new_argv.
506 This function may change environ for the superior process.
507 Therefore, the superior process must save and restore the value
508 of environ around the vfork and the call to this function.
510 ENV is the environment for the subprocess.
512 SET_PGRP is nonzero if we should put the subprocess into a separate
515 CURRENT_DIR is an elisp string giving the path of the current
516 directory the subprocess should have. Since we can't really signal
517 a decent error from within the child, this should be verified as an
518 executable directory by the parent. */
520 child_setup (in
, out
, err
, new_argv
, set_pgrp
, current_dir
)
522 register char **new_argv
;
524 Lisp_Object current_dir
;
527 /* The MSDOS port of gcc cannot fork, vfork, ... so we must call system
529 #else /* not MSDOS */
532 register int pid
= getpid ();
535 extern int emacs_priority
;
537 nice (- emacs_priority
);
541 /* Close Emacs's descriptors that this process should not have. */
542 close_process_descs ();
545 /* Note that use of alloca is always safe here. It's obvious for systems
546 that do not have true vfork or that have true (stack) alloca.
547 If using vfork and C_ALLOCA it is safe because that changes
548 the superior's static variables as if the superior had done alloca
549 and will be cleaned up in the usual way. */
551 register unsigned char *temp
;
554 i
= XSTRING (current_dir
)->size
;
555 temp
= (unsigned char *) alloca (i
+ 2);
556 bcopy (XSTRING (current_dir
)->data
, temp
, i
);
557 if (temp
[i
- 1] != '/') temp
[i
++] = '/';
560 /* We can't signal an Elisp error here; we're in a vfork. Since
561 the callers check the current directory before forking, this
562 should only return an error if the directory's permissions
563 are changed between the check and this chdir, but we should
565 if (chdir (temp
) < 0)
569 /* Set `env' to a vector of the strings in Vprocess_environment. */
571 register Lisp_Object tem
;
572 register char **new_env
;
573 register int new_length
;
576 for (tem
= Vprocess_environment
;
577 (XTYPE (tem
) == Lisp_Cons
578 && XTYPE (XCONS (tem
)->car
) == Lisp_String
);
579 tem
= XCONS (tem
)->cdr
)
582 /* new_length + 1 to include terminating 0. */
583 env
= new_env
= (char **) alloca ((new_length
+ 1) * sizeof (char *));
585 /* Copy the Vprocess_environment strings into new_env. */
586 for (tem
= Vprocess_environment
;
587 (XTYPE (tem
) == Lisp_Cons
588 && XTYPE (XCONS (tem
)->car
) == Lisp_String
);
589 tem
= XCONS (tem
)->cdr
)
592 char *string
= (char *) XSTRING (XCONS (tem
)->car
)->data
;
593 /* See if this string duplicates any string already in the env.
594 If so, don't put it in.
595 When an env var has multiple definitions,
596 we keep the definition that comes first in process-environment. */
597 for (; ep
!= new_env
; ep
++)
599 char *p
= *ep
, *q
= string
;
603 /* The string is malformed; might as well drop it. */
618 /* Make sure that in, out, and err are not actually already in
619 descriptors zero, one, or two; this could happen if Emacs is
620 started with its standard in, out, or error closed, as might
622 in
= relocate_fd (in
, 3);
623 out
= relocate_fd (out
, 3);
624 err
= relocate_fd (err
, 3);
638 #ifndef SETPGRP_RELEASES_CTTY
639 setpgrp (); /* No arguments but equivalent in this case */
644 /* setpgrp_of_tty is incorrect here; it uses input_fd. */
645 EMACS_SET_TTY_PGRP (0, &pid
);
648 something missing here
;
651 /* execvp does not accept an environment arg so the only way
652 to pass this environment is to set environ. Our caller
653 is responsible for restoring the ambient value of environ. */
655 execvp (new_argv
[0], new_argv
);
657 write (1, "Couldn't exec the program ", 26);
658 write (1, new_argv
[0], strlen (new_argv
[0]));
660 #endif /* not MSDOS */
663 /* Move the file descriptor FD so that its number is not less than MIN.
664 If the file descriptor is moved at all, the original is freed. */
666 relocate_fd (fd
, min
)
676 char *message1
= "Error while setting up child: ";
677 char *message2
= "\n";
678 write (2, message1
, strlen (message1
));
679 write (2, sys_errlist
[errno
], strlen (sys_errlist
[errno
]));
680 write (2, message2
, strlen (message2
));
683 /* Note that we hold the original FD open while we recurse,
684 to guarantee we'll get a new FD if we need it. */
685 new = relocate_fd (new, min
);
692 getenv_internal (var
, varlen
, value
, valuelen
)
700 for (scan
= Vprocess_environment
; CONSP (scan
); scan
= XCONS (scan
)->cdr
)
702 Lisp_Object entry
= XCONS (scan
)->car
;
704 if (XTYPE (entry
) == Lisp_String
705 && XSTRING (entry
)->size
> varlen
706 && XSTRING (entry
)->data
[varlen
] == '='
707 && ! bcmp (XSTRING (entry
)->data
, var
, varlen
))
709 *value
= (char *) XSTRING (entry
)->data
+ (varlen
+ 1);
710 *valuelen
= XSTRING (entry
)->size
- (varlen
+ 1);
718 DEFUN ("getenv", Fgetenv
, Sgetenv
, 1, 1, 0,
719 "Return the value of environment variable VAR, as a string.\n\
720 VAR should be a string. Value is nil if VAR is undefined in the environment.\n\
721 This function consults the variable ``process-environment'' for its value.")
728 CHECK_STRING (var
, 0);
729 if (getenv_internal (XSTRING (var
)->data
, XSTRING (var
)->size
,
731 return make_string (value
, valuelen
);
736 /* A version of getenv that consults process_environment, easily
745 if (getenv_internal (var
, strlen (var
), &value
, &valuelen
))
753 /* This is run before init_cmdargs. */
757 char *data_dir
= egetenv ("EMACSDATA");
760 = Ffile_name_as_directory (build_string (data_dir
? data_dir
763 /* Check the EMACSPATH environment variable, defaulting to the
764 PATH_EXEC path from paths.h. */
765 Vexec_path
= decode_env_path ("EMACSPATH", PATH_EXEC
);
766 Vexec_directory
= Ffile_name_as_directory (Fcar (Vexec_path
));
767 Vexec_path
= nconc2 (decode_env_path ("PATH", ""), Vexec_path
);
770 /* This is run after init_cmdargs, so that Vinvocation_directory is valid. */
774 char *data_dir
= egetenv ("EMACSDATA");
779 if (initialized
&& !NILP (Vinvocation_directory
))
781 /* Add to the path the ../lib-src dir of the Emacs executable,
782 if that dir exists. */
783 Lisp_Object tem
, tem1
;
784 tem
= Fexpand_file_name (build_string ("../lib-src"),
785 Vinvocation_directory
);
786 tem1
= Ffile_exists_p (tem
);
787 if (!NILP (tem1
) && NILP (Fmember (tem
, Vexec_path
)))
789 Vexec_path
= nconc2 (Vexec_path
, Fcons (tem
, Qnil
));
790 Vexec_directory
= Ffile_name_as_directory (tem
);
792 /* If we use ../lib-src, maybe use ../etc as well.
793 Do so if ../etc exists and has our DOC-... file in it. */
796 Lisp_Object tem
, tem2
, tem3
;
797 tem
= Fexpand_file_name (build_string ("../etc"),
798 Vinvocation_directory
);
799 tem2
= Fexpand_file_name (Vdoc_file_name
, tem
);
800 tem3
= Ffile_exists_p (tem2
);
802 Vdata_directory
= Ffile_name_as_directory (tem
);
807 tempdir
= Fdirectory_file_name (Vexec_directory
);
808 if (access (XSTRING (tempdir
)->data
, 0) < 0)
810 printf ("Warning: arch-dependent data dir (%s) does not exist.\n",
811 XSTRING (Vexec_directory
)->data
);
815 tempdir
= Fdirectory_file_name (Vdata_directory
);
816 if (access (XSTRING (tempdir
)->data
, 0) < 0)
818 printf ("Warning: arch-independent data dir (%s) does not exist.\n",
819 XSTRING (Vdata_directory
)->data
);
824 Vshell_file_name
= build_string ("*dcl*");
826 sh
= (char *) getenv ("SHELL");
827 Vshell_file_name
= build_string (sh
? sh
: "/bin/sh");
831 set_process_environment ()
833 register char **envp
;
835 Vprocess_environment
= Qnil
;
839 for (envp
= environ
; *envp
; envp
++)
840 Vprocess_environment
= Fcons (build_string (*envp
),
841 Vprocess_environment
);
847 DEFVAR_LISP ("binary-process", &Vbinary_process
,
848 "*If non-nil then new subprocesses are assumed to produce binary output.");
849 Vbinary_process
= Qnil
;
852 DEFVAR_LISP ("shell-file-name", &Vshell_file_name
,
853 "*File name to load inferior shells from.\n\
854 Initialized from the SHELL environment variable.");
856 DEFVAR_LISP ("exec-path", &Vexec_path
,
857 "*List of directories to search programs to run in subprocesses.\n\
858 Each element is a string (directory name) or nil (try default directory).");
860 DEFVAR_LISP ("exec-directory", &Vexec_directory
,
861 "Directory of architecture-dependent files that come with GNU Emacs,\n\
862 especially executable programs intended for Emacs to invoke.");
864 DEFVAR_LISP ("data-directory", &Vdata_directory
,
865 "Directory of architecture-independent files that come with GNU Emacs,\n\
866 intended for Emacs to use.");
868 DEFVAR_LISP ("configure-info-directory", &Vconfigure_info_directory
,
869 "For internal use by the build procedure only.\n\
870 This is the name of the directory in which the build procedure installed\n\
871 Emacs's info files; the default value for Info-default-directory-list\n\
873 Vconfigure_info_directory
= build_string (PATH_INFO
);
875 DEFVAR_LISP ("process-environment", &Vprocess_environment
,
876 "List of environment variables for subprocesses to inherit.\n\
877 Each element should be a string of the form ENVVARNAME=VALUE.\n\
878 The environment which Emacs inherits is placed in this variable\n\
879 when Emacs starts.");
882 defsubr (&Scall_process
);
885 defsubr (&Scall_process_region
);