From 1020548ece5e1e7edd4e5e23cb05ef81499a991a Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Sun, 28 Jul 2019 15:45:35 -0400 Subject: Rename ptee stream --- .gitignore | 2 +- Makefile | 2 +- ptee.c | 99 -------------------------------------------------------------- stream.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 101 deletions(-) delete mode 100644 ptee.c create mode 100644 stream.c diff --git a/.gitignore b/.gitignore index f5ed2af..cc74683 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ chroot.tar config.mk -ptee root +stream tags diff --git a/Makefile b/Makefile index ece7cca..c27b886 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ LDLIBS = -lutil -include config.mk -BINS = ptee +BINS = stream all: tags ${BINS} diff --git a/ptee.c b/ptee.c deleted file mode 100644 index e760eb3..0000000 --- a/ptee.c +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (C) 2019 C. 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 -#include -#include - -#if defined __FreeBSD__ -#include -#elif defined __linux__ -#include -#else -#include -#endif - -typedef unsigned char byte; - -static struct termios saveTerm; -static void restoreTerm(void) { - tcsetattr(STDIN_FILENO, TCSADRAIN, &saveTerm); -} - -int main(int argc, char *argv[]) { - if (argc < 2) return EX_USAGE; - if (isatty(STDOUT_FILENO)) errx(EX_USAGE, "stdout is not redirected"); - - int error = tcgetattr(STDIN_FILENO, &saveTerm); - if (error) err(EX_IOERR, "tcgetattr"); - atexit(restoreTerm); - - struct termios raw = saveTerm; - cfmakeraw(&raw); - error = tcsetattr(STDIN_FILENO, TCSADRAIN, &raw); - if (error) err(EX_IOERR, "tcsetattr"); - - struct winsize window; - error = ioctl(STDIN_FILENO, TIOCGWINSZ, &window); - if (error) err(EX_IOERR, "ioctl"); - - int pty; - pid_t pid = forkpty(&pty, NULL, NULL, &window); - if (pid < 0) err(EX_OSERR, "forkpty"); - - if (!pid) { - execvp(argv[1], &argv[1]); - err(EX_NOINPUT, "%s", argv[1]); - } - - byte buf[4096]; - struct pollfd fds[2] = { - { .events = POLLIN, .fd = STDIN_FILENO }, - { .events = POLLIN, .fd = pty }, - }; - while (0 < poll(fds, 2, -1)) { - if (fds[0].revents & POLLIN) { - ssize_t rlen = read(STDIN_FILENO, buf, sizeof(buf)); - if (rlen < 0) err(EX_IOERR, "read"); - - ssize_t wlen = write(pty, buf, rlen); - if (wlen < 0) err(EX_IOERR, "write"); - } - - if (fds[1].revents & POLLIN) { - ssize_t rlen = read(pty, buf, sizeof(buf)); - if (rlen < 0) err(EX_IOERR, "read"); - - ssize_t wlen = write(STDIN_FILENO, buf, rlen); - if (wlen < 0) err(EX_IOERR, "write"); - - wlen = write(STDOUT_FILENO, buf, rlen); - if (wlen < 0) err(EX_IOERR, "write"); - } - - int status; - pid_t dead = waitpid(pid, &status, WNOHANG); - if (dead < 0) err(EX_OSERR, "waitpid"); - if (dead) return WIFEXITED(status) ? WEXITSTATUS(status) : EX_SOFTWARE; - } - err(EX_IOERR, "poll"); -} diff --git a/stream.c b/stream.c new file mode 100644 index 0000000..e760eb3 --- /dev/null +++ b/stream.c @@ -0,0 +1,99 @@ +/* Copyright (C) 2019 C. 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 +#include +#include + +#if defined __FreeBSD__ +#include +#elif defined __linux__ +#include +#else +#include +#endif + +typedef unsigned char byte; + +static struct termios saveTerm; +static void restoreTerm(void) { + tcsetattr(STDIN_FILENO, TCSADRAIN, &saveTerm); +} + +int main(int argc, char *argv[]) { + if (argc < 2) return EX_USAGE; + if (isatty(STDOUT_FILENO)) errx(EX_USAGE, "stdout is not redirected"); + + int error = tcgetattr(STDIN_FILENO, &saveTerm); + if (error) err(EX_IOERR, "tcgetattr"); + atexit(restoreTerm); + + struct termios raw = saveTerm; + cfmakeraw(&raw); + error = tcsetattr(STDIN_FILENO, TCSADRAIN, &raw); + if (error) err(EX_IOERR, "tcsetattr"); + + struct winsize window; + error = ioctl(STDIN_FILENO, TIOCGWINSZ, &window); + if (error) err(EX_IOERR, "ioctl"); + + int pty; + pid_t pid = forkpty(&pty, NULL, NULL, &window); + if (pid < 0) err(EX_OSERR, "forkpty"); + + if (!pid) { + execvp(argv[1], &argv[1]); + err(EX_NOINPUT, "%s", argv[1]); + } + + byte buf[4096]; + struct pollfd fds[2] = { + { .events = POLLIN, .fd = STDIN_FILENO }, + { .events = POLLIN, .fd = pty }, + }; + while (0 < poll(fds, 2, -1)) { + if (fds[0].revents & POLLIN) { + ssize_t rlen = read(STDIN_FILENO, buf, sizeof(buf)); + if (rlen < 0) err(EX_IOERR, "read"); + + ssize_t wlen = write(pty, buf, rlen); + if (wlen < 0) err(EX_IOERR, "write"); + } + + if (fds[1].revents & POLLIN) { + ssize_t rlen = read(pty, buf, sizeof(buf)); + if (rlen < 0) err(EX_IOERR, "read"); + + ssize_t wlen = write(STDIN_FILENO, buf, rlen); + if (wlen < 0) err(EX_IOERR, "write"); + + wlen = write(STDOUT_FILENO, buf, rlen); + if (wlen < 0) err(EX_IOERR, "write"); + } + + int status; + pid_t dead = waitpid(pid, &status, WNOHANG); + if (dead < 0) err(EX_OSERR, "waitpid"); + if (dead) return WIFEXITED(status) ? WEXITSTATUS(status) : EX_SOFTWARE; + } + err(EX_IOERR, "poll"); +} -- cgit 1.4.1