#include #include #include #include #ifndef O_DIRECT #define O_DIRECT 040000 #endif #define READ_SIZE (65536) #define ALIGN(buf) (char *) (((unsigned long) (buf) + 4095) & ~(4095)) int main(int argc, char *argv[]) { char *buffer, *ptr; int fd_in, fd_out, ret; if (argc < 3) { printf("%s: \n", argv[0]); return 1; } printf("%s: infile: %s -> outfile %s\n", argv[0],argv[1],argv[2]); fd_in = open(argv[1], O_RDONLY | O_DIRECT); if (fd_in == -1) { perror("open infile"); return 2; } fd_out = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd_out == -1) { perror("open outfile"); return 3; } ptr = malloc(READ_SIZE + 4095); buffer = ALIGN(ptr); do { ret = read(fd_in, buffer, READ_SIZE); if (!ret) break; else if (ret < 0) { perror("read infile"); break; } write(fd_out, buffer, ret); } while (1); free(ptr); close(fd_in); close(fd_out); return 0; }