13 /* For some reason, Cygwin has started leaving cruft in the top bits of inode
14 * numbers, which breaks this test. Mask them off.
16 #if defined(__CYGWIN__) && defined(__amd64__)
17 # define HACK_INODE(ino) ((ino)&0xffffffffffff)
19 # define HACK_INODE(ino) (ino)
22 static void fail(const char *what
) { perror(what
); exit(1); }
24 int main(int argc
, char *argv
[])
35 for (i
= 1, j
= 0; i
< argc
; i
++) {
36 if (strcmp(argv
[i
], "-v") == 0) { verbose
++; continue; }
37 if (j
>= MAXFD
) { fprintf(stderr
, "too many\n"); exit(1); }
38 if (sscanf(argv
[i
], "%d:%d", &fds
[j
].cur
, &fds
[j
].want
) < 2 ||
40 { fprintf(stderr
, "bad syntax\n"); exit(1); }
44 for (i
= 0; i
< MAXFD
; i
++) flag
[i
] = -1;
45 for (i
= 0; i
< n
; i
++) {
48 ino
[i
] = ino
[flag
[fd
]];
50 printf("exist fd %d[%d] = ino %lu\n", fd
, i
, (unsigned long)ino
[i
]);
53 if ((fd2
= open(",delete-me",
54 O_WRONLY
| O_CREAT
| O_EXCL
,
58 if (fd2
!= fd
) { if (dup2(fd2
, fd
) < 0) fail("dup2"); close(fd2
); }
59 if (fstat(fd
, &st
)) fail("fstat");
60 ino
[i
] = HACK_INODE(st
.st_ino
);
62 printf("open fd %d[%d] = ino %lu\n", fd
, i
, (unsigned long)ino
[i
]);
66 if (mdup(fds
, n
)) fail("mdup");
68 for (i
= 0; i
< n
; i
++) {
70 if (fds
[i
].want
!= -1 && fds
[i
].want
!= fd
) {
71 printf("fd %d[%d] != %d\n", fd
, i
, fds
[i
].want
);
73 } else if (fstat(fd
, &st
)) {
74 printf("fstat %d[%d] failed: %s\n", fd
, i
, strerror(errno
));
76 } else if (HACK_INODE(st
.st_ino
) != ino
[i
]) {
77 if (!verbose
) printf("ino %d[%d] wrong\n", fd
, i
);
78 else printf("ino %d[%d] = %lu != %lu\n", fd
, i
,
79 (unsigned long)HACK_INODE(st
.st_ino
),
80 (unsigned long)ino
[i
]);