#include #include #include #include #include #include #include #include #include void exit_error(char *str) { fputs(str, stderr); fputc('\n', stderr); exit(1); } void exit_perror(char *str) { perror(str); exit(1); } int main(int argc, char **argv) { int in_fd, out_fd; struct stat info; void *base_addr; char buf[600]; struct iovec iov[2]; int mode = 0; if (argc < 3) exit_error("Usage: writev-test copy infile outfile\n" " writev-test drop infile\n"); if (!strcmp(argv[1], "copy")) { if (argc < 4) exit_error("Missing outfile argument\n"); mode = 1; } else if (!strcmp(argv[1], "drop")) mode = 0; else exit_error("Unknown mode\n"); in_fd = open(argv[2], O_RDONLY); if (in_fd < 0) exit_perror("open input"); if (fstat(in_fd, &info) < 0) exit_perror("fstat"); if (mode == 1) { base_addr = mmap(0, info.st_size, PROT_READ, MAP_SHARED, in_fd, 0); if (base_addr == MAP_FAILED) perror("mmap"); if (read(in_fd, buf, 600) < 600) exit_perror("read"); out_fd = open(argv[3], O_WRONLY|O_TRUNC|O_CREAT, 0666); if (out_fd < 0) exit_perror("open output"); iov[0].iov_base = buf; iov[0].iov_len = 600; iov[1].iov_base = base_addr + 600; iov[1].iov_len = info.st_size - 600; if (writev(out_fd, iov, 2) < info.st_size) exit_perror("writev"); } else { if (fsync(in_fd) < 0) perror("fsync"); if (posix_fadvise(in_fd, 0, info.st_size, POSIX_FADV_DONTNEED) != 0) perror("posix_fadvise"); } return 0; }