/* * Splice argument file to stdout */ #include #include #include #include #include #include #if defined(__i386__) #define __NR_splice 294 #elif defined(__x86_64__) #define __NR_splice 256 #elif defined(__powerpc__) || defined(__powerpc64__) #define __NR_splice 278 #else #error unsupported arch #endif static inline int splice(int fdin, int fdout, size_t len, unsigned long flags) { return syscall(__NR_splice, fdin, fdout, len, flags); } int main(int argc, char *argv[]) { struct stat sb; int fd; if (argc < 2) { printf("%s: infile\n", argv[0]); return 1; } fd = open(argv[1], O_RDONLY); if (fd < 0) { perror("open"); return 1; } if (fstat(fd, &sb) < 0) { perror("stat"); return 1; } do { int ret = splice(fd, STDOUT_FILENO, sb.st_size, 0); if (ret < 0) { perror("splice"); break; } else if (!ret) break; sb.st_size -= ret; } while (1); close(fd); return 0; }