delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin-developers/1999/06/12/19:38:20

Mailing-List: contact cygwin-developers-help AT sourceware DOT cygnus DOT com; run by ezmlm
Sender: cygwin-developers-owner AT sourceware DOT cygnus DOT com
Delivered-To: mailing list cygwin-developers AT sourceware DOT cygnus DOT com
Sender: fujieda AT elbereth DOT jaist DOT ac DOT jp
To: cygwin-developers AT sourceware DOT cygnus DOT com
Subject: Repost: different files have the same i-node number.
Mime-Version: 1.0 (generated by tm-edit 7.106)
From: Kazuhiro Fujieda <fujieda AT jaist DOT ac DOT jp>
Date: 13 Jun 1999 08:37:21 +0900
Message-ID: <s1sd7z1t2ha.fsf@jaist.ac.jp>
Lines: 82
X-Mailer: Gnus v5.3/Emacs 19.34

In recent snapshots, different files sometime have the same i-node
number on Win9x. This is caused by the following code in fhandler.cc.

882:  buf->st_ino     = local.nFileIndexHigh | local.nFileIndexLow;

This value isn't quiet unique on Win9x, so i-node should be based on
a hash number like the past snapshots on Win9x.

--- fhandler.cc-	Thu Mar 25 12:22:46 1999
+++ fhandler.cc	Wed May 19 17:28:14 1999
@@ -879,7 +879,11 @@ fhandler_disk_file::fstat (struct stat *
   buf->st_nlink   = local.nNumberOfLinks;
   buf->st_dev     = local.dwVolumeSerialNumber;
   buf->st_size    = local.nFileSizeLow;
-  buf->st_ino     = local.nFileIndexHigh | local.nFileIndexLow;
+  if (os_being_run == winNT)
+    /* This is not unique on Win9x */
+    buf->st_ino     = local.nFileIndexHigh | local.nFileIndexLow;
+  else
+    buf->st_ino     = local.nFileIndexLow ^ get_namehash ();
   buf->st_blksize = S_BLKSIZE;
   buf->st_blocks  = (buf->st_size + S_BLKSIZE-1) / S_BLKSIZE;
   buf->st_uid     = get_file_owner (get_win32_name ());

By the way, conditional branches about file types in stat_worker()
are a little tedious and not intuitive. They can be more simple.

--- syscalls.cc-	Wed Mar 10 07:30:18 1999
+++ syscalls.cc	Wed May 19 17:34:08 1999
@@ -1215,24 +1215,7 @@ stat_worker (const char *caller, const c
   drive[0] = win32_name[0];
   UINT dtype;
 
-  if (os_being_run == winNT
-      && (!(atts & FILE_ATTRIBUTE_DIRECTORY)
-          || ((dtype = GetDriveType (drive)) != DRIVE_NO_ROOT_DIR
-             && dtype != DRIVE_REMOTE
-             && dtype != DRIVE_UNKNOWN)))
-    {
-      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))
+  if (atts == -1 || !(atts & FILE_ATTRIBUTE_DIRECTORY))
     {
       fhandler_disk_file fh (NULL);
 
@@ -1242,6 +1225,21 @@ stat_worker (const char *caller, const c
 	  res = fh.fstat (buf);
 	  fh.close ();
 	}
+    }
+  else if (os_being_run == winNT
+	   && ((dtype = GetDriveType (drive)) != DRIVE_NO_ROOT_DIR
+	       && dtype != DRIVE_REMOTE
+	       && dtype != DRIVE_UNKNOWN))
+    {
+      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 ();
+	  buf->st_nlink = num_entries (win32_name);
+        }
     }
   else
     {

____
  | AIST      Kazuhiro Fujieda <fujieda AT jaist DOT ac DOT jp>
  | HOKURIKU  School of Information Science
o_/ 1990      Japan Advanced Institute of Science and Technology

- Raw text -


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