Mercurial > emacs
changeset 44927:1f6fdc21ea67
(stat, fstat): Use file index information to generate
inodes for directories where available.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Sun, 28 Apr 2002 18:52:26 +0000 |
parents | 69639ae98236 |
children | c887ee4e08f3 |
files | src/w32.c |
diffstat | 1 files changed, 33 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- a/src/w32.c Sun Apr 28 18:15:26 2002 +0000 +++ b/src/w32.c Sun Apr 28 18:52:26 2002 +0000 @@ -2153,16 +2153,11 @@ } } - if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - buf->st_mode = _S_IFDIR; - buf->st_nlink = 2; /* doesn't really matter */ - fake_inode = 0; /* this doesn't either I think */ - } - else if (!NILP (Vw32_get_true_file_attributes) - /* No access rights required to get info. */ - && (fh = CreateFile (name, 0, 0, NULL, OPEN_EXISTING, 0, NULL)) - != INVALID_HANDLE_VALUE) + if (!NILP (Vw32_get_true_file_attributes) + /* No access rights required to get info. */ + && (fh = CreateFile (name, 0, 0, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL)) + != INVALID_HANDLE_VALUE) { /* This is more accurate in terms of gettting the correct number of links, but is quite slow (it is noticable when Emacs is @@ -2185,25 +2180,33 @@ fake_inode = 0; } - switch (GetFileType (fh)) + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + buf->st_mode = _S_IFDIR; + } + else { - case FILE_TYPE_DISK: - buf->st_mode = _S_IFREG; - break; - case FILE_TYPE_PIPE: - buf->st_mode = _S_IFIFO; - break; - case FILE_TYPE_CHAR: - case FILE_TYPE_UNKNOWN: - default: - buf->st_mode = _S_IFCHR; + switch (GetFileType (fh)) + { + case FILE_TYPE_DISK: + buf->st_mode = _S_IFREG; + break; + case FILE_TYPE_PIPE: + buf->st_mode = _S_IFIFO; + break; + case FILE_TYPE_CHAR: + case FILE_TYPE_UNKNOWN: + default: + buf->st_mode = _S_IFCHR; + } } CloseHandle (fh); } else { /* Don't bother to make this information more accurate. */ - buf->st_mode = _S_IFREG; + buf->st_mode = (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? + _S_IFREG : _S_IFDIR; buf->st_nlink = 1; fake_inode = 0; } @@ -2296,21 +2299,15 @@ } if (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { buf->st_mode = _S_IFDIR; - buf->st_nlink = 2; /* doesn't really matter */ - fake_inode = 0; /* this doesn't either I think */ - } - else - { - buf->st_nlink = info.nNumberOfLinks; - /* Might as well use file index to fake inode values, but this - is not guaranteed to be unique unless we keep a handle open - all the time (even then there are situations where it is - not unique). Reputedly, there are at most 48 bits of info - (on NTFS, presumably less on FAT). */ - fake_inode = info.nFileIndexLow ^ info.nFileIndexHigh; - } + + buf->st_nlink = info.nNumberOfLinks; + /* Might as well use file index to fake inode values, but this + is not guaranteed to be unique unless we keep a handle open + all the time (even then there are situations where it is + not unique). Reputedly, there are at most 48 bits of info + (on NTFS, presumably less on FAT). */ + fake_inode = info.nFileIndexLow ^ info.nFileIndexHigh; /* MSVC defines _ino_t to be short; other libc's might not. */ if (sizeof (buf->st_ino) == 2)