root/tools/testing/selftests/splice/splice_read.c
// SPDX-License-Identifier: GPL-2.0
#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
        int fd;
        size_t size;
        ssize_t spliced;

        if (argc < 2) {
                fprintf(stderr, "Usage: %s INPUT [BYTES]\n", argv[0]);
                return EXIT_FAILURE;
        }

        fd = open(argv[1], O_RDONLY);
        if (fd < 0) {
                perror(argv[1]);
                return EXIT_FAILURE;
        }

        if (argc == 3)
                size = atol(argv[2]);
        else {
                struct stat statbuf;

                if (fstat(fd, &statbuf) < 0) {
                        perror(argv[1]);
                        return EXIT_FAILURE;
                }

                if (statbuf.st_size > INT_MAX) {
                        fprintf(stderr, "%s: Too big\n", argv[1]);
                        return EXIT_FAILURE;
                }

                size = statbuf.st_size;
        }

        /* splice(2) file to stdout. */
        spliced = splice(fd, NULL, STDOUT_FILENO, NULL,
                      size, SPLICE_F_MOVE);
        if (spliced < 0) {
                perror("splice");
                return EXIT_FAILURE;
        }

        close(fd);
        return EXIT_SUCCESS;
}