14 /* For some reason, Cygwin has started leaving cruft in the top bits of inode
15 * numbers, which breaks this test. Mask them off.
17 #if defined(__CYGWIN__) && defined(__amd64__)
18 # define HACK_INODE(ino) ((ino)&0xffffffffffff)
20 # define HACK_INODE(ino) (ino)
23 static void fail(const char *what) { perror(what); exit(1); }
25 int main(int argc, char *argv[])
36 for (i = 1, j = 0; i < argc; i++) {
37 if (STRCMP(argv[i], ==, "-v")) { verbose++; continue; }
38 if (j >= MAXFD) { fprintf(stderr, "too many\n"); exit(1); }
39 if (sscanf(argv[i], "%d:%d", &fds[j].cur, &fds[j].want) < 2 ||
41 { fprintf(stderr, "bad syntax\n"); exit(1); }
45 for (i = 0; i < MAXFD; i++) flag[i] = -1;
46 for (i = 0; i < n; i++) {
49 ino[i] = ino[flag[fd]];
51 printf("exist fd %d[%d] = ino %lu\n", fd, i, (unsigned long)ino[i]);
54 if ((fd2 = open(",delete-me",
55 O_WRONLY | O_CREAT | O_EXCL,
59 if (fd2 != fd) { if (dup2(fd2, fd) < 0) fail("dup2"); close(fd2); }
60 if (fstat(fd, &st)) fail("fstat");
61 ino[i] = HACK_INODE(st.st_ino);
63 printf("open fd %d[%d] = ino %lu\n", fd, i, (unsigned long)ino[i]);
67 if (mdup(fds, n)) fail("mdup");
69 for (i = 0; i < n; i++) {
71 if (fds[i].want != -1 && fds[i].want != fd) {
72 printf("fd %d[%d] != %d\n", fd, i, fds[i].want);
74 } else if (fstat(fd, &st)) {
75 printf("fstat %d[%d] failed: %s\n", fd, i, strerror(errno));
77 } else if (HACK_INODE(st.st_ino) != ino[i]) {
78 if (!verbose) printf("ino %d[%d] wrong\n", fd, i);
79 else printf("ino %d[%d] = %lu != %lu\n", fd, i,
80 (unsigned long)HACK_INODE(st.st_ino),
81 (unsigned long)ino[i]);