X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/fabc1281e9cde34ff9a19d843316d2ceca8647ad..da35c2b26f55a329329792f21a297aa8ad08fb95:/src/callproc.c diff --git a/src/callproc.c b/src/callproc.c index 4bf1da04e1..c4177d5044 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -19,10 +19,8 @@ along with GNU Emacs. If not, see . */ #include -#include #include #include -#include #include #include @@ -53,6 +51,7 @@ along with GNU Emacs. If not, see . */ #include "process.h" #include "syssignal.h" #include "systty.h" +#include "syswait.h" #include "blockinput.h" #include "frame.h" #include "termhooks.h" @@ -65,19 +64,12 @@ along with GNU Emacs. If not, see . */ #include "nsterm.h" #endif -#ifdef HAVE_SETPGID -#if !defined (USG) -#undef setpgrp -#define setpgrp setpgid -#endif -#endif - /* Pattern used by call-process-region to make temp files. */ static Lisp_Object Vtemp_file_name_pattern; /* True if we are about to fork off a synchronous process or if we are waiting for it. */ -int synch_process_alive; +bool synch_process_alive; /* Nonzero => this is a string explaining death of synchronous subprocess. */ const char *synch_process_death; @@ -94,8 +86,8 @@ int synch_process_retcode; On MSDOS, delete the temporary file on any kind of termination. On Unix, kill the process and any children on termination by signal. */ -/* Nonzero if this is termination due to exit. */ -static int call_process_exited; +/* True if this is termination due to exit. */ +static bool call_process_exited; static Lisp_Object call_process_kill (Lisp_Object fdpid) @@ -190,7 +182,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) (ptrdiff_t nargs, Lisp_Object *args) { Lisp_Object infile, buffer, current_dir, path, cleanup_info_tail; - int display_p; + bool display_p; int fd[2]; int filefd; #define CALLPROC_BUFFER_SIZE_MIN (16 * 1024) @@ -217,7 +209,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) struct coding_system argument_coding; /* coding-system of arguments */ /* Set to the return value of Ffind_operation_coding_system. */ Lisp_Object coding_systems; - int output_to_buffer = 1; + bool output_to_buffer = 1; /* Qt denotes that Ffind_operation_coding_system is not yet called. */ coding_systems = Qt; @@ -241,7 +233,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) /* If arguments are supplied, we may have to encode them. */ if (nargs >= 5) { - int must_encode = 0; + bool must_encode = 0; Lisp_Object coding_attrs; for (i = 4; i < nargs; i++) @@ -424,28 +416,34 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) path = Fsubstring (path, make_number (2), Qnil); new_argv = SAFE_ALLOCA ((nargs > 4 ? nargs - 2 : 2) * sizeof *new_argv); - if (nargs > 4) - { - ptrdiff_t i; - struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; - GCPRO5 (infile, buffer, current_dir, path, error_file); - argument_coding.dst_multibyte = 0; - for (i = 4; i < nargs; i++) - { - argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]); - if (CODING_REQUIRE_ENCODING (&argument_coding)) - /* We must encode this argument. */ - args[i] = encode_coding_string (&argument_coding, args[i], 1); - } - UNGCPRO; - for (i = 4; i < nargs; i++) - new_argv[i - 3] = SDATA (args[i]); - new_argv[i - 3] = 0; - } - else - new_argv[1] = 0; - new_argv[0] = SDATA (path); + { + struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; + + GCPRO5 (infile, buffer, current_dir, path, error_file); + if (nargs > 4) + { + ptrdiff_t i; + + argument_coding.dst_multibyte = 0; + for (i = 4; i < nargs; i++) + { + argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]); + if (CODING_REQUIRE_ENCODING (&argument_coding)) + /* We must encode this argument. */ + args[i] = encode_coding_string (&argument_coding, args[i], 1); + } + for (i = 4; i < nargs; i++) + new_argv[i - 3] = SDATA (args[i]); + new_argv[i - 3] = 0; + } + else + new_argv[1] = 0; + if (STRING_MULTIBYTE (path)) + path = ENCODE_FILE (path); + new_argv[0] = SDATA (path); + UNGCPRO; + } #ifdef MSDOS /* MW, July 1993 */ @@ -498,17 +496,9 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) register char **save_environ = environ; register int fd1 = fd[1]; int fd_error = fd1; -#ifdef HAVE_WORKING_VFORK - sigset_t procmask; - sigset_t blocked; - struct sigaction sigpipe_action; -#endif if (fd_output >= 0) fd1 = fd_output; -#if 0 /* Some systems don't have sigblock. */ - mask = sigblock (sigmask (SIGCHLD)); -#endif /* Record that we're about to create a synchronous process. */ synch_process_alive = 1; @@ -592,30 +582,19 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) 0, current_dir); #else /* not WINDOWSNT */ -#ifdef HAVE_WORKING_VFORK - /* On many hosts (e.g. Solaris 2.4), if a vforked child calls `signal', - this sets the parent's signal handlers as well as the child's. - So delay all interrupts whose handlers the child might munge, - and record the current handlers so they can be restored later. */ - sigemptyset (&blocked); - sigaddset (&blocked, SIGPIPE); - sigaction (SIGPIPE, 0, &sigpipe_action); - pthread_sigmask (SIG_BLOCK, &blocked, &procmask); -#endif - - BLOCK_INPUT; + block_input (); /* vfork, and prevent local vars from being clobbered by the vfork. */ { Lisp_Object volatile buffer_volatile = buffer; Lisp_Object volatile coding_systems_volatile = coding_systems; Lisp_Object volatile current_dir_volatile = current_dir; - int volatile display_p_volatile = display_p; + bool volatile display_p_volatile = display_p; + bool volatile output_to_buffer_volatile = output_to_buffer; + bool volatile sa_must_free_volatile = sa_must_free; int volatile fd1_volatile = fd1; int volatile fd_error_volatile = fd_error; int volatile fd_output_volatile = fd_output; - int volatile output_to_buffer_volatile = output_to_buffer; - int volatile sa_must_free_volatile = sa_must_free; ptrdiff_t volatile sa_count_volatile = sa_count; unsigned char const **volatile new_argv_volatile = new_argv; @@ -638,33 +617,21 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) { if (fd[0] >= 0) emacs_close (fd[0]); + #ifdef HAVE_SETSID setsid (); -#endif -#if defined (USG) - setpgrp (); #else - setpgrp (pid, pid); -#endif /* USG */ + setpgid (0, 0); +#endif - /* GConf causes us to ignore SIGPIPE, make sure it is restored - in the child. */ + /* Emacs ignores SIGPIPE, but the child should not. */ signal (SIGPIPE, SIG_DFL); -#ifdef HAVE_WORKING_VFORK - pthread_sigmask (SIG_SETMASK, &procmask, 0); -#endif child_setup (filefd, fd1, fd_error, (char **) new_argv, 0, current_dir); } - UNBLOCK_INPUT; - -#ifdef HAVE_WORKING_VFORK - /* Restore the signal state. */ - sigaction (SIGPIPE, &sigpipe_action, 0); - pthread_sigmask (SIG_SETMASK, &procmask, 0); -#endif + unblock_input (); #endif /* not WINDOWSNT */ @@ -766,11 +733,11 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) if (output_to_buffer) { - register int nread; - int first = 1; + int nread; + bool first = 1; EMACS_INT total_read = 0; int carryover = 0; - int display_on_the_fly = display_p; + bool display_on_the_fly = display_p; struct coding_system saved_coding; saved_coding = process_coding; @@ -998,17 +965,18 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r { USE_SAFE_ALLOCA; Lisp_Object pattern = Fexpand_file_name (Vtemp_file_name_pattern, tmpdir); - char *tempfile = SAFE_ALLOCA (SBYTES (pattern) + 1); - memcpy (tempfile, SDATA (pattern), SBYTES (pattern) + 1); + Lisp_Object encoded_tem = ENCODE_FILE (pattern); + char *tempfile = SAFE_ALLOCA (SBYTES (encoded_tem) + 1); + memcpy (tempfile, SDATA (encoded_tem), SBYTES (encoded_tem) + 1); coding_systems = Qt; #ifdef HAVE_MKSTEMP { int fd; - BLOCK_INPUT; + block_input (); fd = mkstemp (tempfile); - UNBLOCK_INPUT; + unblock_input (); if (fd == -1) report_file_error ("Failed to open temporary file", Fcons (build_string (tempfile), Qnil)); @@ -1016,7 +984,15 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r close (fd); } #else + errno = 0; mktemp (tempfile); + if (!*tempfile) + { + if (!errno) + errno = EEXIST; + report_file_error ("Failed to open temporary file using pattern", + Fcons (pattern, Qnil)); + } #endif filename_string = build_string (tempfile); @@ -1086,7 +1062,7 @@ static char ** add_env (char **env, char **new_env, char *string) { char **ep; - int ok = 1; + bool ok = 1; if (string == NULL) return new_env; @@ -1126,8 +1102,7 @@ add_env (char **env, char **new_env, char *string) Therefore, the superior process must save and restore the value of environ around the vfork and the call to this function. - SET_PGRP is nonzero if we should put the subprocess into a separate - process group. + If SET_PGRP, put the subprocess into a separate process group. CURRENT_DIR is an elisp string giving the path of the current directory the subprocess should have. Since we can't really signal @@ -1135,7 +1110,8 @@ add_env (char **env, char **new_env, char *string) executable directory by the parent. */ int -child_setup (int in, int out, int err, register char **new_argv, int set_pgrp, Lisp_Object current_dir) +child_setup (int in, int out, int err, char **new_argv, bool set_pgrp, + Lisp_Object current_dir) { char **env; char *pwd_var; @@ -1325,13 +1301,9 @@ child_setup (int in, int out, int err, register char **new_argv, int set_pgrp, L if (err != in && err != out) emacs_close (err); -#if defined (USG) -#ifndef SETPGRP_RELEASES_CTTY - setpgrp (); /* No arguments but equivalent in this case */ +#if defined HAVE_SETPGID || ! (defined USG && defined SETPGRP_RELEASES_CTTY) + setpgid (pid, pid); #endif -#else /* not USG */ - setpgrp (pid, pid); -#endif /* not USG */ /* setpgrp_of_tty is incorrect here; it uses input_fd. */ tcsetpgrp (0, pid); @@ -1394,7 +1366,7 @@ relocate_fd (int fd, int minfd) } #endif /* not WINDOWSNT */ -static int +static bool getenv_internal_1 (const char *var, ptrdiff_t varlen, char **value, ptrdiff_t *valuelen, Lisp_Object env) { @@ -1429,7 +1401,7 @@ getenv_internal_1 (const char *var, ptrdiff_t varlen, char **value, return 0; } -static int +static bool getenv_internal (const char *var, ptrdiff_t varlen, char **value, ptrdiff_t *valuelen, Lisp_Object frame) {