From 42ec031941fa60b9b82653796b6e130e922c92bc Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Wed, 21 Feb 2018 22:18:57 -0500 Subject: Add ingest --- .gitignore | 1 + Makefile | 2 +- ingest.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 ingest.c diff --git a/.gitignore b/.gitignore index 18271b1..5493d5f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ broadcast +ingest tags view diff --git a/Makefile b/Makefile index b6c3d8d..664647c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -BINS = broadcast view +BINS = broadcast ingest view CFLAGS += -Wall -Wextra -Wpedantic LDLIBS = -lutil diff --git a/ingest.c b/ingest.c new file mode 100644 index 0000000..9fa754d --- /dev/null +++ b/ingest.c @@ -0,0 +1,64 @@ +/* Copyright (c) 2018, Curtis McEnroe + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) { + if (argc < 2) return EX_USAGE; + const char *path = argv[1]; + + int remote = STDIN_FILENO; + + int stream = open(path, O_WRONLY); + if (stream < 0) err(EX_NOINPUT, "%s", path); + + struct winsize window; + ssize_t size = read(remote, &window, sizeof(window)); + if (size < 0) err(EX_IOERR, "read(%d)", remote); + if ((size_t)size < sizeof(window)) errx(EX_IOERR, "short read(%d)", remote); + + for (;;) { + int error = ftruncate(stream, 0); + if (error) err(EX_IOERR, "%s", path); + + off_t offset = lseek(stream, 0, SEEK_SET); + if (offset < 0) err(EX_IOERR, "%s", path); + + ssize_t size = write(stream, &window, sizeof(window)); + if (size < 0) err(EX_IOERR, "write(%d)", stream); + if ((size_t)size < sizeof(window)) errx(EX_IOERR, "short write(%d)", stream); + + char buf[4096]; + ssize_t totalSize = 0; + while (totalSize < 1024 * 1024) { + ssize_t readSize = read(remote, buf, sizeof(buf)); + if (readSize < 0) err(EX_IOERR, "read(%d)", remote); + if (!readSize) return EX_OK; + + ssize_t writeSize = write(stream, buf, readSize); + if (writeSize < 0) err(EX_IOERR, "write(%d)", stream); + if (writeSize < readSize) errx(EX_IOERR, "short write(%d)", stream); + + totalSize += readSize; + } + } +} -- cgit 1.4.1