/* Synchronous subprocess invocation for GNU Emacs.
-Copyright (C) 1985-1988, 1993-1995, 1999-2014 Free Software Foundation,
+Copyright (C) 1985-1988, 1993-1995, 1999-2016 Free Software Foundation,
Inc.
This file is part of GNU Emacs.
GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
#endif /* MSDOS */
#include "commands.h"
-#include "character.h"
#include "buffer.h"
-#include "ccl.h"
#include "coding.h"
-#include "composite.h"
#include <epaths.h>
#include "process.h"
#include "syssignal.h"
-#include "systty.h"
#include "syswait.h"
#include "blockinput.h"
#include "frame.h"
-#include "termhooks.h"
#ifdef MSDOS
#include "msdos.h"
encode_current_directory (void)
{
Lisp_Object dir;
- struct gcpro gcpro1;
dir = BVAR (current_buffer, directory);
- GCPRO1 (dir);
dir = Funhandled_file_name_directory (dir);
report_file_error ("Setting current directory",
BVAR (current_buffer, directory));
- /* Remove "/:" from dir. */
- if (! NILP (Fstring_match (build_string ("^/:"), dir, Qnil)))
- dir = Fsubstring (dir, make_number (2), Qnil);
+ /* Remove "/:" from DIR and encode it. */
+ dir = ENCODE_FILE (remove_slash_colon (dir));
- if (STRING_MULTIBYTE (dir))
- dir = ENCODE_FILE (dir);
if (! file_accessible_directory_p (dir))
report_file_error ("Setting current directory",
BVAR (current_buffer, directory));
- RETURN_UNGCPRO (dir);
+ return dir;
}
/* If P is reapable, record it as a deleted process and kill it.
Insert output in DESTINATION before point; t means current buffer; nil for DESTINATION
means discard it; 0 means discard and don't wait; and `(:file FILE)', where
FILE is a file name string, means that it should be written to that file
- \(if the file already exists it is overwritten).
+ (if the file already exists it is overwritten).
DESTINATION can also have the form (REAL-BUFFER STDERR-FILE); in that case,
REAL-BUFFER says what to do with standard output, as above,
while STDERR-FILE says what to do with standard error in the child.
{
Lisp_Object infile, encoded_infile;
int filefd;
- struct gcpro gcpro1;
ptrdiff_t count = SPECPDL_INDEX ();
if (nargs >= 2 && ! NILP (args[1]))
else
infile = build_string (NULL_DEVICE);
- GCPRO1 (infile);
- encoded_infile = STRING_MULTIBYTE (infile) ? ENCODE_FILE (infile) : infile;
+ encoded_infile = ENCODE_FILE (infile);
filefd = emacs_open (SSDATA (encoded_infile), O_RDONLY, 0);
if (filefd < 0)
report_file_error ("Opening process input file", infile);
record_unwind_protect_int (close_file_unwind, filefd);
- UNGCPRO;
return unbind_to (count, call_process (nargs, args, filefd, -1));
}
/* Make sure that the child will be able to chdir to the current
buffer's current directory, or its unhandled equivalent. We
can't just have the child check for an error when it does the
- chdir, since it's in a vfork.
+ chdir, since it's in a vfork. */
+ current_dir = encode_current_directory ();
- We have to GCPRO around this because Fexpand_file_name,
- Funhandled_file_name_directory, and Ffile_accessible_directory_p
- might call a file name handling function. The argument list is
- protected by the caller, so all we really have to worry about is
- buffer. */
- {
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
-
- current_dir = encode_current_directory ();
-
- GCPRO4 (buffer, current_dir, error_file, output_file);
-
- if (STRINGP (error_file) && STRING_MULTIBYTE (error_file))
- error_file = ENCODE_FILE (error_file);
- if (STRINGP (output_file) && STRING_MULTIBYTE (output_file))
- output_file = ENCODE_FILE (output_file);
- UNGCPRO;
- }
+ if (STRINGP (error_file))
+ error_file = ENCODE_FILE (error_file);
+ if (STRINGP (output_file))
+ output_file = ENCODE_FILE (output_file);
display_p = INTERACTIVE && nargs >= 4 && !NILP (args[3]);
/* Search for program; barf if not found. */
{
- struct gcpro gcpro1, gcpro2, gcpro3;
int ok;
- GCPRO3 (buffer, current_dir, error_file);
ok = openp (Vexec_path, args[0], Vexec_suffixes, &path,
make_number (X_OK), false);
- UNGCPRO;
if (ok < 0)
report_file_error ("Searching for program", args[0]);
}
- /* If program file name starts with /: for quoting a magic name,
- discard that. */
- if (SBYTES (path) > 2 && SREF (path, 0) == '/'
- && SREF (path, 1) == ':')
- path = Fsubstring (path, make_number (2), Qnil);
+ /* Remove "/:" from PATH. */
+ path = remove_slash_colon (path);
SAFE_NALLOCA (new_argv, 1, nargs < 4 ? 2 : nargs - 2);
- {
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
-
- GCPRO4 (buffer, current_dir, path, error_file);
- if (nargs > 4)
- {
- ptrdiff_t i;
+ 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] = SSDATA (args[i]);
- new_argv[i - 3] = 0;
- }
- else
- new_argv[1] = 0;
- if (STRING_MULTIBYTE (path))
- path = ENCODE_FILE (path);
- new_argv[0] = SSDATA (path);
- UNGCPRO;
- }
+ 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] = SSDATA (args[i]);
+ new_argv[i - 3] = 0;
+ }
+ else
+ new_argv[1] = 0;
+ path = ENCODE_FILE (path);
+ new_argv[0] = SSDATA (path);
discard_output = INTEGERP (buffer) || (NILP (buffer) && NILP (output_file));
Lisp_Object *filename_string_ptr)
{
int fd;
- struct gcpro gcpro1;
Lisp_Object filename_string;
Lisp_Object val, start, end;
Lisp_Object tmpdir;
#endif
filename_string = Fcopy_sequence (ENCODE_FILE (pattern));
- GCPRO1 (filename_string);
tempfile = SSDATA (filename_string);
count = SPECPDL_INDEX ();
specbind (intern ("coding-system-for-write"), val);
/* POSIX lets mk[s]temp use "."; don't invoke jka-compr if we
happen to get a ".Z" suffix. */
- specbind (intern ("file-name-handler-alist"), Qnil);
+ specbind (Qfile_name_handler_alist, Qnil);
write_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil, fd);
unbind_to (count1, Qnil);
coding-system-for-read. */
*filename_string_ptr = filename_string;
- UNGCPRO;
return fd;
}
usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &rest ARGS) */)
(ptrdiff_t nargs, Lisp_Object *args)
{
- struct gcpro gcpro1;
Lisp_Object infile, val;
ptrdiff_t count = SPECPDL_INDEX ();
Lisp_Object start = args[0];
record_unwind_protect_int (close_file_unwind, fd);
}
- GCPRO1 (infile);
-
if (nargs > 3 && !NILP (args[3]))
Fdelete_region (start, end);
args[1] = infile;
val = call_process (nargs, args, fd, empty_input ? -1 : count);
- RETURN_UNGCPRO (unbind_to (count, val));
+ return unbind_to (count, val);
}
\f
#ifndef WINDOWSNT
#ifdef HAVE_NS
const char *path_exec = ns_exec_path ();
#endif
+ /* Running uninstalled, so default to tem rather than PATH_EXEC. */
Vexec_path = decode_env_path ("EMACSPATH",
#ifdef HAVE_NS
path_exec ? path_exec :
#endif
- PATH_EXEC, 0);
- Vexec_path = Fcons (tem, Vexec_path);
+ SSDATA (tem), 0);
Vexec_path = nconc2 (decode_env_path ("PATH", "", 0), Vexec_path);
}
DEFVAR_LISP ("shell-file-name", Vshell_file_name,
doc: /* File name to load inferior shells from.
Initialized from the SHELL environment variable, or to a system-dependent
-default if SHELL is not set. */);
+default if SHELL is unset. See Info node `(elisp)Security Considerations'. */);
DEFVAR_LISP ("exec-path", Vexec_path,
doc: /* List of directories to search programs to run in subprocesses.
By default the last element of this list is `exec-directory'. The
last element is not always used, for example in shell completion
-(`shell-dynamic-complete-command'). */);
+\(`shell-dynamic-complete-command'). */);
DEFVAR_LISP ("exec-suffixes", Vexec_suffixes,
doc: /* List of suffixes to try to find executable file names.