X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/236f657b6dab66f31f4902cecfc03b4673f5bb98..7cf5c72a6d353ed5a7e340562c11e54c21c85e5e:/sys/t/mdup-test.c diff --git a/sys/t/mdup-test.c b/sys/t/mdup-test.c new file mode 100644 index 0000000..d2a198a --- /dev/null +++ b/sys/t/mdup-test.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "mdup.h" + +#define MAXFD 256 + +static void fail(const char *what) { perror(what); exit(1); } + +int main(int argc, char *argv[]) +{ + int i, n; + int fd, fd2; + struct stat st; + int ino[MAXFD]; + int flag[MAXFD]; + mdup_fd fds[MAXFD]; + int win = 1; + + for (i = 0; i < argc - 1; i++) { + if (i >= MAXFD) { + fprintf(stderr, "too many\n"); + exit(1); + } + if (sscanf(argv[i + 1], "%d:%d", &fds[i].cur, &fds[i].want) < 2 || + fds[i].cur >= MAXFD) { + fprintf(stderr, "bad syntax\n"); + exit(1); + } + } + n = argc - 1; + for (i = 0; i < MAXFD; i++) flag[i] = -1; + for (i = 0; i < n; i++) { + fd = fds[i].cur; + if (flag[fd] >= 0) + ino[i] = ino[flag[fd]]; + else { + flag[fd] = i; + if ((fd2 = open(",delete-me", + O_WRONLY | O_CREAT | O_EXCL, + 0700)) < 0) + fail("creat"); + 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; + } + } + + if (mdup(fds, n)) fail("mdup"); + + for (i = 0; i < n; i++) { + fd = fds[i].cur; + if (fds[i].want != -1 && fds[i].want != fd) { + printf("fd %d[%d] != %d\n", fd, i, fds[i].want); + win = 0; + } 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]) { + printf("ino %d[%d] wrong\n", fd, i); + win = 0; + } + } + + return (!win); +}