#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;
}