chiark / gitweb /
sys/t/mdup-test.c: Cope with Cygwin setting top inode-number bits.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 16 Nov 2018 18:09:19 +0000 (18:09 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Wed, 12 Dec 2018 21:53:57 +0000 (21:53 +0000)
Maybe it's because the files have been deleted, but in any event it's
rather annoying: Cygwin seems to set high-numbered bits in the result
inode numbers, which causes spurious test failures.  Compensate by
masking the numbers.

sys/t/mdup-test.c

index 08ba0adaa8d600637f5735140508da4516af10d2..43aa45d8d05584f8cba09283b4bf08aa437b3788 100644 (file)
 
 #define MAXFD 256
 
+/* For some reason, Cygwin has started leaving cruft in the top bits of inode
+ * numbers, which breaks this test.  Mask them off.
+ */
+#if defined(__CYGWIN__) && defined(__amd64__)
+#  define HACK_INODE(ino) ((ino)&0xffffffffffff)
+#else
+#  define HACK_INODE(ino) (ino)
+#endif
+
 static void fail(const char *what) { perror(what); exit(1); }
 
 int main(int argc, char *argv[])
@@ -48,7 +57,7 @@ int main(int argc, char *argv[])
       unlink(",delete-me");
       if (fd2 != fd) { if (dup2(fd2, fd) < 0) fail("dup2"); close(fd2); }
       if (fstat(fd, &st)) fail("fstat");
-      ino[i] = st.st_ino;
+      ino[i] = HACK_INODE(st.st_ino);
       if (verbose)
        printf("open fd %d[%d] = ino %lu\n", fd, i, (unsigned long)ino[i]);
     }
@@ -64,10 +73,11 @@ int main(int argc, char *argv[])
     } else if (fstat(fd, &st)) {
       printf("fstat %d[%d] failed: %s\n", fd, i, strerror(errno));
       win = 0;
-    } else if (st.st_ino != ino[i]) {
+    } else if (HACK_INODE(st.st_ino) != ino[i]) {
       if (!verbose) printf("ino %d[%d] wrong\n", fd, i);
       else printf("ino %d[%d] = %lu != %lu\n", fd, i,
-                 (unsigned long)(st.st_ino), (unsigned long)ino[i]);
+                 (unsigned long)HACK_INODE(st.st_ino),
+                 (unsigned long)ino[i]);
       win = 0;
     }
   }