# HG changeset patch # User Eli Zaretskii # Date 1247327076 0 # Node ID fe78cff95301d3278ee84c36486e0462aeecb94d # Parent e94bd524533d1e4b237b782c511b2a69b97e9b38 (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'. diff -r e94bd524533d -r fe78cff95301 src/w32.c --- a/src/w32.c Sat Jul 11 10:40:30 2009 +0000 +++ b/src/w32.c Sat Jul 11 15:44:36 2009 +0000 @@ -2555,12 +2555,23 @@ char share[MAX_PATH]; int i, n_slashes; char drive[4]; - - sprintf (drive, "%c:\\", path[0]); + UINT drvtype; + + if (IS_DIRECTORY_SEP (path[0]) && IS_DIRECTORY_SEP (path[1])) + drvtype = DRIVE_REMOTE; + else if (path[0] == '\0' || path[1] != ':') + drvtype = GetDriveType (NULL); + else + { + drive[0] = path[0]; + drive[1] = ':'; + drive[2] = '\\'; + drive[3] = '\0'; + drvtype = GetDriveType (drive); + } /* Only logon to networked drives. */ - if ((!IS_DIRECTORY_SEP (path[0]) || !IS_DIRECTORY_SEP (path[1])) - && GetDriveType (drive) != DRIVE_REMOTE) + if (drvtype != DRIVE_REMOTE) return; n_slashes = 2; @@ -3234,6 +3245,28 @@ } } +/* Return non-zero if NAME is a potentially slow filesystem. */ +int +is_slow_fs (const char *name) +{ + char drive_root[4]; + UINT devtype; + + if (IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1])) + devtype = DRIVE_REMOTE; /* assume UNC name is remote */ + else if (!(strlen (name) >= 2 && IS_DEVICE_SEP (name[1]))) + devtype = GetDriveType (NULL); /* use root of current drive */ + else + { + /* GetDriveType needs the root directory of the drive. */ + strncpy (drive_root, name, 2); + drive_root[2] = '\\'; + drive_root[3] = '\0'; + devtype = GetDriveType (drive_root); + } + return !(devtype == DRIVE_FIXED || devtype == DRIVE_RAMDISK); +} + /* MSVC stat function can't cope with UNC names and has other bugs, so replace it with our own. This also allows us to calculate consistent inode values without hacks in the main Emacs code. */ @@ -3347,21 +3380,8 @@ } } - if (IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1])) - devtype = DRIVE_REMOTE; /* assume UNC name is remote */ - else if (!(strlen (name) >= 2 && IS_DEVICE_SEP (name[1]))) - devtype = GetDriveType (NULL); /* use root of current drive */ - else - { - /* GetDriveType needs the root directory of NAME's drive. */ - strncpy (drive_root, name, 3); - drive_root[3] = '\0'; - devtype = GetDriveType (drive_root); - } - if (!(NILP (Vw32_get_true_file_attributes) - || (EQ (Vw32_get_true_file_attributes, Qlocal) - && devtype != DRIVE_FIXED && devtype != DRIVE_RAMDISK)) + || (EQ (Vw32_get_true_file_attributes, Qlocal) && !is_slow_fs (name))) /* No access rights required to get info. */ && (fh = CreateFile (name, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL))