brintos

brintos / linux-shallow public Read only

0
0
Text · 998 B · 46dae6a Raw
58 lines · c
1// SPDX-License-Identifier: GPL-2.02#define _GNU_SOURCE3#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}58