splice_read.c (998B)
1// SPDX-License-Identifier: GPL-2.0 2#define _GNU_SOURCE 3#include <errno.h> 4#include <fcntl.h> 5#include <limits.h> 6#include <stdio.h> 7#include <stdlib.h> 8#include <unistd.h> 9#include <sys/types.h> 10#include <sys/stat.h> 11 12int main(int argc, char *argv[]) 13{ 14 int fd; 15 size_t size; 16 ssize_t spliced; 17 18 if (argc < 2) { 19 fprintf(stderr, "Usage: %s INPUT [BYTES]\n", argv[0]); 20 return EXIT_FAILURE; 21 } 22 23 fd = open(argv[1], O_RDONLY); 24 if (fd < 0) { 25 perror(argv[1]); 26 return EXIT_FAILURE; 27 } 28 29 if (argc == 3) 30 size = atol(argv[2]); 31 else { 32 struct stat statbuf; 33 34 if (fstat(fd, &statbuf) < 0) { 35 perror(argv[1]); 36 return EXIT_FAILURE; 37 } 38 39 if (statbuf.st_size > INT_MAX) { 40 fprintf(stderr, "%s: Too big\n", argv[1]); 41 return EXIT_FAILURE; 42 } 43 44 size = statbuf.st_size; 45 } 46 47 /* splice(2) file to stdout. */ 48 spliced = splice(fd, NULL, STDOUT_FILENO, NULL, 49 size, SPLICE_F_MOVE); 50 if (spliced < 0) { 51 perror("splice"); 52 return EXIT_FAILURE; 53 } 54 55 close(fd); 56 return EXIT_SUCCESS; 57}