From 3cbf2fe6e6f9afdf580b1cf6522a950ef898e459 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Sat, 27 Jul 2019 15:39:35 -0400 Subject: initial commit --- .gitignore | 2 ++ Makefile | 6 ++++++ pp.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 pp.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c0d72fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +pp +*.o diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2c04586 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +.POSIX: + +pp: pp.c + +clean: + rm pp *.o diff --git a/pp.c b/pp.c new file mode 100644 index 0000000..4e29183 --- /dev/null +++ b/pp.c @@ -0,0 +1,58 @@ +#define _XOPEN_SOURCE 700 + +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "Usage: %s source destinations\n", argv[0]); + return 1; + } + + int source = open(argv[1], O_RDONLY); + if (source == -1) { + fprintf(stderr, "%s:%s\n", argv[1], strerror(errno)); + return 1; + } + + int dest = open(argv[2], O_WRONLY | O_CREAT, 0644); + if (dest == -1) { + fprintf(stderr, "%s:%s\n", argv[2], strerror(errno)); + return 1; + } + + struct stat st; + if (fstat(source, &st) == -1) { + perror("stat"); + return 1; + } + + setvbuf(stdout, NULL, _IONBF, 0); + unsigned long long i = 0; + do { + char buf[BUFSIZ]; + + ssize_t n = read(source, buf, sizeof(buf)); + if (n < 0) { + perror("read"); + return 1; + } + + if (write(dest, buf, n) < n) { + perror("write"); + return 1; + } + + + i += n; + printf("\r%llu/%llu bytes (%llu%%)", i, (unsigned long long)st.st_size, i * 100 / (unsigned long long)st.st_size); + } while (i < (unsigned long long)st.st_size); + + printf("\n"); + return 0; +} -- cgit v1.2.1