cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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}