X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/6e104790e756226cbb5b7feaf01854103ded9f36..1e11dbe3d862434ded0d5718f737f1f03f3141be:/src/callproc.c diff --git a/src/callproc.c b/src/callproc.c index 378c647f38..59067040fd 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -24,13 +24,6 @@ along with GNU Emacs. If not, see . */ #include #include #include - -/* Define SIGCHLD as an alias for SIGCLD. */ - -#if !defined (SIGCHLD) && defined (SIGCLD) -#define SIGCHLD SIGCLD -#endif /* SIGCLD */ - #include #ifdef HAVE_UNISTD_H @@ -38,35 +31,20 @@ along with GNU Emacs. If not, see . */ #endif #include -#ifdef HAVE_FCNTL_H -#define INCLUDED_FCNTL #include -#endif #ifdef WINDOWSNT #define NOMINMAX #include -#include /* for proper declaration of environ */ -#include #include "w32.h" #define _P_NOWAIT 1 /* from process.h */ #endif #ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */ -#define INCLUDED_FCNTL -#include #include #include #endif /* MSDOS */ -#ifndef O_RDONLY -#define O_RDONLY 0 -#endif - -#ifndef O_WRONLY -#define O_WRONLY 1 -#endif - #include "lisp.h" #include "commands.h" #include "buffer.h" @@ -91,7 +69,7 @@ extern char **environ; #endif #ifdef HAVE_SETPGID -#if !defined (USG) || defined (BSD_PGRPS) +#if !defined (USG) #undef setpgrp #define setpgrp setpgid #endif @@ -104,8 +82,6 @@ Lisp_Object Vconfigure_info_directory, Vshared_game_score_directory; /* Pattern used by call-process-region to make temp files. */ static Lisp_Object Vtemp_file_name_pattern; -extern Lisp_Object Vtemporary_file_directory; - Lisp_Object Vshell_file_name; Lisp_Object Vprocess_environment, Vinitial_environment; @@ -119,7 +95,7 @@ Lisp_Object Qbuffer_file_type; int synch_process_alive; /* Nonzero => this is a string explaining death of synchronous subprocess. */ -char *synch_process_death; +const char *synch_process_death; /* Nonzero => this is the signal number that terminated the subprocess. */ int synch_process_termsig; @@ -139,8 +115,7 @@ static int call_process_exited; EXFUN (Fgetenv_internal, 2); static Lisp_Object -call_process_kill (fdpid) - Lisp_Object fdpid; +call_process_kill (Lisp_Object fdpid) { emacs_close (XFASTINT (Fcar (fdpid))); EMACS_KILLPG (XFASTINT (Fcdr (fdpid)), SIGKILL); @@ -149,8 +124,7 @@ call_process_kill (fdpid) } Lisp_Object -call_process_cleanup (arg) - Lisp_Object arg; +call_process_cleanup (Lisp_Object arg) { Lisp_Object fdpid = Fcdr (arg); #if defined (MSDOS) @@ -219,9 +193,7 @@ and returns a numeric exit status or a signal description string. If you quit, the process is killed with SIGINT, or SIGKILL if you quit again. usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) - (nargs, args) - int nargs; - register Lisp_Object *args; + (int nargs, register Lisp_Object *args) { Lisp_Object infile, buffer, current_dir, path; int display_p; @@ -282,21 +254,16 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) if (!NILP (Vcoding_system_for_write)) val = Vcoding_system_for_write; else if (! must_encode) - val = Qnil; + val = Qraw_text; else { args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2); args2[0] = Qcall_process; for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; coding_systems = Ffind_operation_coding_system (nargs + 1, args2); - if (CONSP (coding_systems)) - val = XCDR (coding_systems); - else if (CONSP (Vdefault_process_coding_system)) - val = XCDR (Vdefault_process_coding_system); - else - val = Qnil; + val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil; } - val = coding_inherit_eol_type (val, Qnil); + val = complement_process_encoding_system (val); setup_coding_system (Fcheck_coding_system (val), &argument_coding); coding_attrs = CODING_ID_ATTRS (argument_coding.id); if (NILP (CODING_ATTR_ASCII_COMPAT (coding_attrs))) @@ -581,7 +548,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) #ifdef HAVE_SETSID setsid (); #endif -#if defined (USG) && !defined (BSD_PGRPS) +#if defined (USG) setpgrp (); #else setpgrp (pid, pid); @@ -618,12 +585,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) { if (fd[0] >= 0) emacs_close (fd[0]); -#ifndef subprocesses - /* If Emacs has been built with asynchronous subprocess support, - we don't need to do this, I think because it will then have - the facilities for handling SIGCHLD. */ - wait_without_blocking (); -#endif /* subprocesses */ return Qnil; } @@ -692,9 +653,9 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) QUIT; { - register int nread; + register EMACS_INT nread; int first = 1; - int total_read = 0; + EMACS_INT total_read = 0; int carryover = 0; int display_on_the_fly = display_p; struct coding_system saved_coding; @@ -779,10 +740,8 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) PT_BYTE + process_coding.produced); carryover = process_coding.carryover_bytes; if (carryover > 0) - /* As CARRYOVER should not be that large, we had - better avoid overhead of bcopy. */ - BCOPY_SHORT (process_coding.carryover, buf, - process_coding.carryover_bytes); + memcpy (buf, process_coding.carryover, + process_coding.carryover_bytes); } } @@ -819,8 +778,10 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) make_number (total_read)); } +#ifndef MSDOS /* Wait for it to terminate, unless it already has. */ wait_for_termination (pid); +#endif immediate_quit = 0; @@ -832,7 +793,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) if (synch_process_termsig) { - char *signame; + const char *signame; synchronize_system_messages_locale (); signame = strsignal (synch_process_termsig); @@ -850,8 +811,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) } static Lisp_Object -delete_temp_file (name) - Lisp_Object name; +delete_temp_file (Lisp_Object name) { /* Suppress jka-compr handling, etc. */ int count = SPECPDL_INDEX (); @@ -884,9 +844,7 @@ and returns a numeric exit status or a signal description string. If you quit, the process is killed with SIGINT, or SIGKILL if you quit again. usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &rest ARGS) */) - (nargs, args) - int nargs; - register Lisp_Object *args; + (int nargs, register Lisp_Object *args) { struct gcpro gcpro1; Lisp_Object filename_string; @@ -921,7 +879,7 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r pattern = Fexpand_file_name (Vtemp_file_name_pattern, tmpdir); tempfile = (char *) alloca (SBYTES (pattern) + 1); - bcopy (SDATA (pattern), tempfile, SBYTES (pattern) + 1); + memcpy (tempfile, SDATA (pattern), SBYTES (pattern) + 1); coding_systems = Qt; #ifdef HAVE_MKSTEMP @@ -949,20 +907,16 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r if (!NILP (Vcoding_system_for_write)) val = Vcoding_system_for_write; else if (NILP (current_buffer->enable_multibyte_characters)) - val = Qnil; + val = Qraw_text; else { args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2); args2[0] = Qcall_process_region; for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; coding_systems = Ffind_operation_coding_system (nargs + 1, args2); - if (CONSP (coding_systems)) - val = XCDR (coding_systems); - else if (CONSP (Vdefault_process_coding_system)) - val = XCDR (Vdefault_process_coding_system); - else - val = Qnil; + val = CONSP (coding_systems) ? XCDR (coding_systems) : Qnil; } + val = complement_process_encoding_system (val); { int count1 = SPECPDL_INDEX (); @@ -999,7 +953,9 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r RETURN_UNGCPRO (unbind_to (count, Fcall_process (nargs, args))); } -static int relocate_fd (); +#ifndef WINDOWSNT +static int relocate_fd (int fd, int minfd); +#endif static char ** add_env (char **env, char **new_env, char *string) @@ -1054,11 +1010,7 @@ add_env (char **env, char **new_env, char *string) executable directory by the parent. */ int -child_setup (in, out, err, new_argv, set_pgrp, current_dir) - int in, out, err; - register char **new_argv; - int set_pgrp; - Lisp_Object current_dir; +child_setup (int in, int out, int err, register char **new_argv, int set_pgrp, Lisp_Object current_dir) { char **env; char *pwd_var; @@ -1069,19 +1021,9 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir) int pid = getpid (); -#ifdef SET_EMACS_PRIORITY - { - extern EMACS_INT emacs_priority; - - if (emacs_priority < 0) - nice (- emacs_priority); - } -#endif - -#ifdef subprocesses /* Close Emacs's descriptors that this process should not have. */ close_process_descs (); -#endif + /* DOS_NT isn't in a vfork, so if we are in the middle of load-file, we will lose if we call close_load_descs here. */ #ifndef DOS_NT @@ -1108,8 +1050,8 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir) pwd_var = (char *) alloca (i + 6); #endif temp = pwd_var + 4; - bcopy ("PWD=", pwd_var, 4); - bcopy (SDATA (current_dir), temp, i); + memcpy (pwd_var, "PWD=", 4); + memcpy (temp, SDATA (current_dir), i); if (!IS_DIRECTORY_SEP (temp[i - 1])) temp[i++] = DIRECTORY_SEP; temp[i] = 0; @@ -1142,7 +1084,7 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir) char **p, **q; register int new_length; Lisp_Object display = Qnil; - + new_length = 0; for (tem = Vprocess_environment; @@ -1178,7 +1120,7 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir) but with corrected value. */ if (egetenv ("PWD")) *new_env++ = pwd_var; - + if (STRINGP (display)) { int vlen = strlen ("DISPLAY=") + strlen (SDATA (display)) + 1; @@ -1208,10 +1150,18 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir) } } - + #ifdef WINDOWSNT prepare_standard_handles (in, out, err, handles); set_process_dir (SDATA (current_dir)); + /* Spawn the child. (See ntproc.c:Spawnve). */ + cpid = spawnve (_P_NOWAIT, new_argv[0], new_argv, env); + reset_standard_handles (in, out, err, handles); + if (cpid == -1) + /* An error occurred while trying to spawn the process. */ + report_file_error ("Spawning child process", Qnil); + return cpid; + #else /* not WINDOWSNT */ /* Make sure that in, out, and err are not actually already in descriptors zero, one, or two; this could happen if Emacs is @@ -1246,38 +1196,22 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir) dup2 (out, 1); dup2 (err, 2); emacs_close (in); - emacs_close (out); - emacs_close (err); -#endif /* not MSDOS */ -#endif /* not WINDOWSNT */ + if (out != in) + emacs_close (out); + if (err != in && err != out) + emacs_close (err); -#if defined(USG) && !defined(BSD_PGRPS) +#if defined(USG) #ifndef SETPGRP_RELEASES_CTTY setpgrp (); /* No arguments but equivalent in this case */ #endif -#else +#else /* not USG */ setpgrp (pid, pid); -#endif /* USG */ +#endif /* not USG */ + /* setpgrp_of_tty is incorrect here; it uses input_fd. */ - EMACS_SET_TTY_PGRP (0, &pid); + tcsetpgrp (0, pid); -#ifdef MSDOS - pid = run_msdos_command (new_argv, pwd_var + 4, in, out, err, env); - xfree (pwd_var); - if (pid == -1) - /* An error occurred while trying to run the subprocess. */ - report_file_error ("Spawning child process", Qnil); - return pid; -#else /* not MSDOS */ -#ifdef WINDOWSNT - /* Spawn the child. (See ntproc.c:Spawnve). */ - cpid = spawnve (_P_NOWAIT, new_argv[0], new_argv, env); - reset_standard_handles (in, out, err, handles); - if (cpid == -1) - /* An error occurred while trying to spawn the process. */ - report_file_error ("Spawning child process", Qnil); - return cpid; -#else /* not WINDOWSNT */ /* execvp does not accept an environment arg so the only way to pass this environment is to set environ. Our caller is responsible for restoring the ambient value of environ. */ @@ -1288,46 +1222,57 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir) emacs_write (1, new_argv[0], strlen (new_argv[0])); emacs_write (1, "\n", 1); _exit (1); -#endif /* not WINDOWSNT */ -#endif /* not MSDOS */ + +#else /* MSDOS */ + pid = run_msdos_command (new_argv, pwd_var + 4, in, out, err, env); + xfree (pwd_var); + if (pid == -1) + /* An error occurred while trying to run the subprocess. */ + report_file_error ("Spawning child process", Qnil); + return pid; +#endif /* MSDOS */ +#endif /* not WINDOWSNT */ } +#ifndef WINDOWSNT /* Move the file descriptor FD so that its number is not less than MINFD. If the file descriptor is moved at all, the original is freed. */ static int -relocate_fd (fd, minfd) - int fd, minfd; +relocate_fd (int fd, int minfd) { if (fd >= minfd) return fd; else { - int new = dup (fd); + int new; +#ifdef F_DUPFD + new = fcntl (fd, F_DUPFD, minfd); +#else + new = dup (fd); + if (new != -1) + /* Note that we hold the original FD open while we recurse, + to guarantee we'll get a new FD if we need it. */ + new = relocate_fd (new, minfd); +#endif if (new == -1) { - char *message1 = "Error while setting up child: "; - char *errmessage = strerror (errno); - char *message2 = "\n"; + const char *message1 = "Error while setting up child: "; + const char *errmessage = strerror (errno); + const char *message2 = "\n"; emacs_write (2, message1, strlen (message1)); emacs_write (2, errmessage, strlen (errmessage)); emacs_write (2, message2, strlen (message2)); _exit (1); } - /* Note that we hold the original FD open while we recurse, - to guarantee we'll get a new FD if we need it. */ - new = relocate_fd (new, minfd); emacs_close (fd); return new; } } +#endif /* not WINDOWSNT */ static int -getenv_internal_1 (var, varlen, value, valuelen, env) - char *var; - int varlen; - char **value; - int *valuelen; - Lisp_Object env; +getenv_internal_1 (const char *var, int varlen, char **value, int *valuelen, + Lisp_Object env) { for (; CONSP (env); env = XCDR (env)) { @@ -1338,7 +1283,7 @@ getenv_internal_1 (var, varlen, value, valuelen, env) /* NT environment variables are case insensitive. */ && ! strnicmp (SDATA (entry), var, varlen) #else /* not WINDOWSNT */ - && ! bcmp (SDATA (entry), var, varlen) + && ! memcmp (SDATA (entry), var, varlen) #endif /* not WINDOWSNT */ ) { @@ -1361,12 +1306,8 @@ getenv_internal_1 (var, varlen, value, valuelen, env) } static int -getenv_internal (var, varlen, value, valuelen, frame) - char *var; - int varlen; - char **value; - int *valuelen; - Lisp_Object frame; +getenv_internal (const char *var, int varlen, char **value, int *valuelen, + Lisp_Object frame) { /* Try to find VAR in Vprocess_environment first. */ if (getenv_internal_1 (var, varlen, value, valuelen, @@ -1403,8 +1344,7 @@ This function searches `process-environment' for VARIABLE. If optional parameter ENV is a list, then search this list instead of `process-environment', and return t when encountering a negative entry \(an entry for a variable with no value). */) - (variable, env) - Lisp_Object variable, env; + (Lisp_Object variable, Lisp_Object env) { char *value; int valuelen; @@ -1428,8 +1368,7 @@ If optional parameter ENV is a list, then search this list instead of /* A version of getenv that consults the Lisp environment lists, easily callable from C. */ char * -egetenv (var) - char *var; +egetenv (const char *var) { char *value; int valuelen; @@ -1444,7 +1383,7 @@ egetenv (var) /* This is run before init_cmdargs. */ void -init_callproc_1 () +init_callproc_1 (void) { char *data_dir = egetenv ("EMACSDATA"); char *doc_dir = egetenv ("EMACSDOC"); @@ -1466,7 +1405,7 @@ init_callproc_1 () /* This is run after init_cmdargs, when Vinstallation_directory is valid. */ void -init_callproc () +init_callproc (void) { char *data_dir = egetenv ("EMACSDATA"); @@ -1555,16 +1494,15 @@ init_callproc () } void -set_initial_environment () +set_initial_environment (void) { register char **envp; -#ifndef CANNOT_DUMP - if (initialized) - { +#ifdef CANNOT_DUMP + Vprocess_environment = Qnil; #else - { - Vprocess_environment = Qnil; + if (initialized) #endif + { for (envp = environ; *envp; envp++) Vprocess_environment = Fcons (build_string (*envp), Vprocess_environment); @@ -1575,10 +1513,10 @@ set_initial_environment () } void -syms_of_callproc () +syms_of_callproc (void) { #ifdef DOS_NT - Qbuffer_file_type = intern ("buffer-file-type"); + Qbuffer_file_type = intern_c_string ("buffer-file-type"); staticpro (&Qbuffer_file_type); #endif /* DOS_NT */ @@ -1668,5 +1606,3 @@ See `setenv' and `getenv'. */); defsubr (&Scall_process_region); } -/* arch-tag: 769b8045-1df7-4d2b-8968-e3fb49017f95 - (do not change this comment) */