diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | ingest.c | 64 |
3 files changed, 66 insertions, 1 deletions
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 <programble@gmail.com> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#include <err.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/ioctl.h> +#include <sysexits.h> +#include <unistd.h> + +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; + } + } +} |