Mail Archives: cygwin-developers/1999/01/29/15:23:16
I actually submitted a patch like this a couple of times before
I started with Cygnus. It was never incorporated, I think because
that it doesn't work correctly with SMB directories.
Is there any way to check if the directory is located on a remote
share?
-chris
On Fri, Jan 29, 1999 at 11:46:28AM +0100, Corinna Vinschen wrote:
>The following patch has two advantages:
>
>With WinNT, directories are using the same fhandler_disk_file::fstat()
>call as regular files.
>
>It handles now i-node numbers, which are returned by
>GetFileInformationByHandle() so, that the i-node numbers
>of two links to the same file are the same. I have checked
>this out on two file systems with more than 100000 files:
>The or'd High and Low part of the nFileIndex seems to be
>unique.
>Together with the above mentioned directory patch, e.g.
> ls -i .
>and
> ls -i `pwd`
>return the same i-node number in WinNT. Unfortunately, this
>patch is useless with Win9X.
>
>Regards,
>Corinna
>
>ChangeLog:
>==========
>
> * fhandler.cc (fhandler_disk_file::fstat): Handles directories,
> returns unique i-node number.
>
> * syscalls.cc (stat_worker): On WinNT, stat_worker calls
> fhandler_disk_file::fstat for directories, too.
>
>Index: fhandler.cc
>===================================================================
>RCS file: /src/cvsroot/winsup-990126/fhandler.cc,v
>retrieving revision 1.1
>retrieving revision 1.2
>diff -u -p -1 -r1.1 -r1.2
>--- fhandler.cc 1999/01/29 09:33:41 1.1
>+++ fhandler.cc 1999/01/29 09:49:20 1.2
>@@ -804,3 +804,3 @@ fhandler_disk_file::fstat (struct stat *
> buf->st_size = local.nFileSizeLow;
>- buf->st_ino = local.nFileIndexLow ^ get_namehash ();
>+ buf->st_ino = local.nFileIndexHigh | local.nFileIndexLow;
> buf->st_blksize = S_BLKSIZE;
>@@ -814,2 +814,4 @@ fhandler_disk_file::fstat (struct stat *
> buf->st_mode |= S_IFLNK;
>+ else if (local.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
>+ buf->st_mode |= S_IFDIR;
> else
>@@ -836,3 +838,6 @@ fhandler_disk_file::fstat (struct stat *
> case FILE_TYPE_DISK:
>- buf->st_mode |= S_IFREG;
>+ if (local.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
>+ buf->st_mode |= S_IFDIR;
>+ else
>+ buf->st_mode |= S_IFREG;
> if (get_execable_p ())
>Index: syscalls.cc
>===================================================================
>RCS file: /src/cvsroot/winsup-990126/syscalls.cc,v
>retrieving revision 1.1
>retrieving revision 1.2
>diff -u -p -1 -r1.1 -r1.2
>--- syscalls.cc 1999/01/29 09:33:44 1.1
>+++ syscalls.cc 1999/01/29 09:49:19 1.2
>@@ -1209,3 +1209,16 @@ stat_worker (const char *caller, const c
> debug_printf ("%d = GetFileAttributesA (%s)", atts, win32_name);
>- if (atts == -1 || !(atts & FILE_ATTRIBUTE_DIRECTORY))
>+ if (os_being_run == winNT)
>+ {
>+ fhandler_disk_file fh (NULL);
>+
>+ if (fh.open (real_path, O_RDONLY | O_BINARY | O_DIROPEN |
>+ (nofollow ? O_NOSYMLINK : 0), 0))
>+ {
>+ res = fh.fstat (buf);
>+ fh.close ();
>+ if (atts != -1 && (atts & FILE_ATTRIBUTE_DIRECTORY))
>+ buf->st_nlink = num_entries (win32_name);
>+ }
>+ }
>+ else if (atts == -1 || !(atts & FILE_ATTRIBUTE_DIRECTORY))
> {
>
>
--
cgf AT cygnus DOT com
http://www.cygnus.com/
- Raw text -