delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin-developers/1999/01/29/15:23:16

From: cgf AT cygnus DOT com (Christopher Faylor)
Subject: Re: Patch to 990126: Handling of directories and i-node-numbers
29 Jan 1999 15:23:16 -0800 :
Message-ID: <19990129181100.A9167.cygnus.cygwin32.developers@cygnus.com>
References: <36B19184 DOT F89F7FD5 AT cityweb DOT de>
Mime-Version: 1.0
To: Corinna Vinschen <corinna DOT vinschen AT cityweb DOT de>,
cygwin32-developers AT cygnus DOT com

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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019