+2009-07-11 Eli Zaretskii <eliz@gnu.org>
+
+ * dired.c (directory_files_internal_w32_unwind) [WINDOWSNT]: New
+ function.
+ (directory_files_internal) [WINDOWSNT]: Bind
+ w32-get-true-file-attributes to either t or nil, depending whether
+ the filesystem of the directory is fast or slow.
+
+ * w32.c (logon_network_drive): Don't assume PATH is an absolute
+ file name.
+ (is_slow_fs): New function.
+ (stat): Use it to determine whether to issue more system calls to
+ get accurate file attributes, when w32-get-true-file-attributes is
+ `local'.
+
2009-07-10 Jan Djärv <jan.h.d@swipnet.se>
* xfns.c (Fx_select_font): Remember last font selected in
extern int completion_ignore_case;
extern Lisp_Object Qcompletion_ignore_case;
extern Lisp_Object Vcompletion_regexp_list;
+extern Lisp_Object Vw32_get_true_file_attributes;
Lisp_Object Vcompletion_ignored_extensions;
Lisp_Object Qdirectory_files;
static int scmp P_ ((unsigned char *, unsigned char *, int));
\f
+#ifdef WINDOWSNT
+Lisp_Object
+directory_files_internal_w32_unwind (Lisp_Object arg)
+{
+ Vw32_get_true_file_attributes = arg;
+ return Qnil;
+}
+#endif
Lisp_Object
directory_files_internal_unwind (dh)
int count = SPECPDL_INDEX ();
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
DIRENTRY *dp;
+#ifdef WINDOWSNT
+ Lisp_Object w32_save = Qnil;
+#endif
/* Because of file name handlers, these functions might call
Ffuncall, and cause a GC. */
record_unwind_protect (directory_files_internal_unwind,
make_save_value (d, 0));
+#ifdef WINDOWSNT
+ if (attrs)
+ {
+ extern Lisp_Object Qlocal;
+ extern int is_slow_fs (const char *);
+
+ /* Do this only once to avoid doing it (in w32.c:stat) for each
+ file in the directory, when we call Ffile_attributes below. */
+ record_unwind_protect (directory_files_internal_w32_unwind,
+ Vw32_get_true_file_attributes);
+ w32_save = Vw32_get_true_file_attributes;
+ if (EQ (Vw32_get_true_file_attributes, Qlocal))
+ {
+ char *dirnm = SDATA (dirfilename);
+ char *fn = alloca (SBYTES (dirfilename) + 1);
+
+ strncpy (fn, SDATA (dirfilename), SBYTES (dirfilename));
+ fn[SBYTES (dirfilename)] = '\0';
+ /* w32.c:stat will notice these bindings and avoid calling
+ GetDriveType for each file. */
+ if (is_slow_fs (fn))
+ Vw32_get_true_file_attributes = Qnil;
+ else
+ Vw32_get_true_file_attributes = Qt;
+ }
+ }
+#endif
+
directory_nbytes = SBYTES (directory);
re_match_object = Qt;
BLOCK_INPUT;
closedir (d);
UNBLOCK_INPUT;
+#ifdef WINDOWSNT
+ if (attrs)
+ Vw32_get_true_file_attributes = w32_save;
+#endif
/* Discard the unwind protect. */
specpdl_ptr = specpdl + count;