CCCPaste

df7508f3ba1cf

#define _GNU_SOURCE

#include 
#include 
#include 
#include 

#define pexit(msg) { perror(msg); return 1; }

int main(int argc, char *argv[])
{
	int in, out, pipefd[2], pid, r;
	ssize_t copied;

	in = open(argv[1], O_RDONLY);
	if (in < 0)
		pexit("open");

	out = open(argv[2], O_WRONLY | O_CREAT, 0644);
	if (out < 0)
		pexit("open");

	r = pipe(pipefd);
	if (r < 0)
		pexit("pipe");

	pid = fork();
	if (pid < 0)
		pexit("fork()");

	if (!pid) {
		r = dup2(pipefd[0], 0);
		if (r < 0)
			pexit("dup");

		r = dup2(out, 1);
		if (r < 0)
			pexit("dup");

		execvp("cat", (char*[]){"cat"});
		pexit("exec");
	}

	do {
		copied = splice(in, NULL, pipefd[1], NULL, 1024 * 1024, 0);
		if (copied < 0)
			pexit("splice");
	} while (copied);

	return 0;
}