13 static void fail(const char *what
) { perror(what
); exit(1); }
15 int main(int argc
, char *argv
[])
25 for (i
= 0; i
< argc
- 1; i
++) {
26 if (i
>= MAXFD
) { fprintf(stderr
, "too many\n"); exit(1); }
27 if (sscanf(argv
[i
+ 1], "%d:%d", &fds
[i
].cur
, &fds
[i
].want
) < 2 ||
29 { fprintf(stderr
, "bad syntax\n"); exit(1); }
32 for (i
= 0; i
< MAXFD
; i
++) flag
[i
] = -1;
33 for (i
= 0; i
< n
; i
++) {
36 ino
[i
] = ino
[flag
[fd
]];
39 if ((fd2
= open(",delete-me",
40 O_WRONLY
| O_CREAT
| O_EXCL
,
44 if (fd2
!= fd
) { if (dup2(fd2
, fd
) < 0) fail("dup2"); close(fd2
); }
45 if (fstat(fd
, &st
)) fail("fstat");
50 if (mdup(fds
, n
)) fail("mdup");
52 for (i
= 0; i
< n
; i
++) {
54 if (fds
[i
].want
!= -1 && fds
[i
].want
!= fd
) {
55 printf("fd %d[%d] != %d\n", fd
, i
, fds
[i
].want
);
57 } else if (fstat(fd
, &st
)) {
58 printf("fstat %d[%d] failed: %s\n", fd
, i
, strerror(errno
));
60 } else if (st
.st_ino
!= ino
[i
]) {
61 printf("ino %d[%d] wrong\n", fd
, i
);