From: Eli Zaretskii Date: Fri, 29 Mar 2002 12:38:35 +0000 (+0000) Subject: (openp, Fload): Encode the file name before pasing it X-Git-Tag: ttn-vms-21-2-B4~15920 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=eb191db2fb9684d012542baa2c1c54a41036f38d;p=emacs.git (openp, Fload): Encode the file name before pasing it to `stat', `access', and `emacs_open'. (openp): GCPRO the encoded file name. Don't recompute Lisp strings unnecessarily. --- diff --git a/src/ChangeLog b/src/ChangeLog index 7add267368d..d69f9794eb6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2002-03-29 Eli Zaretskii + + * lread.c (openp, Fload): Encode the file name before pasing it + to `stat', `access', and `emacs_open'. + (openp): GCPRO the encoded file name. Don't recompute Lisp + strings unnecessarily. + 2002-03-29 Kim F. Storm * fns.c (Flax_plist_put): Doc fix. diff --git a/src/lread.c b/src/lread.c index 81ae1f27a55..86b79fbad30 100644 --- a/src/lread.c +++ b/src/lread.c @@ -34,6 +34,7 @@ Boston, MA 02111-1307, USA. */ #include "commands.h" #include "keyboard.h" #include "termhooks.h" +#include "coding.h" #ifdef lint #include @@ -633,7 +634,7 @@ Return t if file exists. */) int count = specpdl_ptr - specpdl; Lisp_Object temp; struct gcpro gcpro1; - Lisp_Object found; + Lisp_Object found, efound; /* 1 means we printed the ".el is newer" message. */ int newer = 0; /* 1 means we are loading a compiled file. */ @@ -770,14 +771,18 @@ Return t if file exists. */) compiled = 1; + GCPRO1 (efound); + efound = ENCODE_FILE (found); + #ifdef DOS_NT fmode = "rb"; #endif /* DOS_NT */ - stat ((char *)XSTRING (found)->data, &s1); - XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 1] = 0; - result = stat ((char *)XSTRING (found)->data, &s2); - XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 1] = 'c'; - + stat ((char *)XSTRING (efound)->data, &s1); + XSTRING (efound)->data[STRING_BYTES (XSTRING (efound)) - 1] = 0; + result = stat ((char *)XSTRING (efound)->data, &s2); + XSTRING (efound)->data[STRING_BYTES (XSTRING (efound)) - 1] = 'c'; + UNGCPRO; + if (result >= 0 && (unsigned) s1.st_mtime < (unsigned) s2.st_mtime) { /* Make the progress messages mention that source is newer. */ @@ -812,7 +817,10 @@ Return t if file exists. */) #ifdef WINDOWSNT emacs_close (fd); - stream = fopen ((char *) XSTRING (found)->data, fmode); + GCPRO1 (efound); + efound = ENCODE_FILE (found); + stream = fopen ((char *) XSTRING (efound)->data, fmode); + UNGCPRO; #else /* not WINDOWSNT */ stream = fdopen (fd, fmode); #endif /* not WINDOWSNT */ @@ -968,8 +976,8 @@ openp (path, str, suffixes, storeptr, exec_only) int want_size; Lisp_Object filename; struct stat st; - struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; - Lisp_Object string, tail; + struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6; + Lisp_Object string, tail, encoded_fn; int max_suffix_len = 0; for (tail = suffixes; CONSP (tail); tail = XCDR (tail)) @@ -980,8 +988,8 @@ openp (path, str, suffixes, storeptr, exec_only) } string = filename = Qnil; - GCPRO5 (str, string, filename, path, suffixes); - + GCPRO6 (str, string, filename, path, suffixes, encoded_fn); + if (storeptr) *storeptr = Qnil; @@ -1014,6 +1022,7 @@ openp (path, str, suffixes, storeptr, exec_only) { int lsuffix = STRING_BYTES (XSTRING (XCAR (tail))); Lisp_Object handler; + int exists; /* Concatenate path element/specified name with the suffix. If the directory starts with /:, remove that. */ @@ -1034,7 +1043,7 @@ openp (path, str, suffixes, storeptr, exec_only) if (lsuffix != 0) /* Bug happens on CCI if lsuffix is 0. */ strncat (fn, XSTRING (XCAR (tail))->data, lsuffix); - + /* Check that the file exists and is not a directory. */ /* We used to only check for handlers on non-absolute file names: if (absolute) @@ -1044,41 +1053,43 @@ openp (path, str, suffixes, storeptr, exec_only) It's not clear why that was the case and it breaks things like (load "/bar.el") where the file is actually "/bar.el.gz". */ handler = Ffind_file_name_handler (filename, Qfile_exists_p); + string = build_string (fn); if (!NILP (handler) && !exec_only) { - int exists; - - string = build_string (fn); exists = !NILP (Ffile_readable_p (string)); - if (exists && !NILP (Ffile_directory_p (build_string (fn)))) + if (exists && !NILP (Ffile_directory_p (string))) exists = 0; if (exists) { /* We succeeded; return this descriptor and filename. */ if (storeptr) - *storeptr = build_string (fn); + *storeptr = string; UNGCPRO; return -2; } } else { - int exists = (stat (fn, &st) >= 0 - && (st.st_mode & S_IFMT) != S_IFDIR); + char *pfn; + + encoded_fn = ENCODE_FILE (string); + pfn = XSTRING (encoded_fn)->data; + exists = (stat (pfn, &st) >= 0 + && (st.st_mode & S_IFMT) != S_IFDIR); if (exists) { /* Check that we can access or open it. */ if (exec_only) - fd = (access (fn, X_OK) == 0) ? 1 : -1; + fd = (access (pfn, X_OK) == 0) ? 1 : -1; else - fd = emacs_open (fn, O_RDONLY, 0); + fd = emacs_open (pfn, O_RDONLY, 0); if (fd >= 0) { /* We succeeded; return this descriptor and filename. */ if (storeptr) - *storeptr = build_string (fn); + *storeptr = string; UNGCPRO; return fd; }