From 765fc9dc33a85a3903e91f3008104f834a60f918 Mon Sep 17 00:00:00 2001 Message-Id: <765fc9dc33a85a3903e91f3008104f834a60f918.1714668216.git.mdw@distorted.org.uk> From: Mark Wooding Date: Fri, 16 Nov 2018 18:09:19 +0000 Subject: [PATCH] sys/t/mdup-test.c: Cope with Cygwin setting top inode-number bits. Organization: Straylight/Edgeware From: Mark Wooding 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 | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sys/t/mdup-test.c b/sys/t/mdup-test.c index 08ba0ad..43aa45d 100644 --- a/sys/t/mdup-test.c +++ b/sys/t/mdup-test.c @@ -10,6 +10,15 @@ #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; } } -- [mdw]