#define _GNU_SOURCE #include #include #include #include #include #include int main(int argc, char *argv[]) { ++argv, --argc; do { const char *filename = ""; if (argc > 0) { close(STDIN_FILENO); if (open(filename = *argv, O_RDWR) != STDIN_FILENO) error(EX_NOINPUT, errno, "%s", filename); } for (off_t consumed = 0;;) { ssize_t n = splice(STDIN_FILENO, NULL, STDOUT_FILENO, NULL, SIZE_MAX, 0); if (n <= 0) { if (n < 0) error(EX_IOERR, errno, "%s: splice", filename); break; } if (fallocate(STDIN_FILENO, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, consumed += n) < 0) error(EX_OSERR, errno, "%s: fallocate", filename); } if (argc > 0 && unlink(filename) < 0) error(EX_OSERR, errno, "%s: unlink", filename); } while (++argv, --argc > 0); return EX_OK; }