diff options
author | June McEnroe <programble@gmail.com> | 2018-02-25 19:16:56 -0500 |
---|---|---|
committer | June McEnroe <programble@gmail.com> | 2018-02-25 19:16:56 -0500 |
commit | a2e0b6901cb4eef7ad1d78bee0d70c577c61e0f5 (patch) | |
tree | a7fe735a4b2b509d89eb8d4c4ff6f492df1439a5 /winch.c | |
parent | Hardcode path lengths in setup (diff) | |
download | stream-a2e0b6901cb4eef7ad1d78bee0d70c577c61e0f5.tar.gz stream-a2e0b6901cb4eef7ad1d78bee0d70c577c61e0f5.zip |
Rewrite everything
Diffstat (limited to 'winch.c')
-rw-r--r-- | winch.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/winch.c b/winch.c new file mode 100644 index 0000000..be63c52 --- /dev/null +++ b/winch.c @@ -0,0 +1,57 @@ +/* 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 <signal.h> +#include <sys/ioctl.h> +#include <sysexits.h> +#include <unistd.h> + +static struct { + int read; + int write; +} fd; + +static void sigwinch() { + struct winsize window; + int error = ioctl(STDERR_FILENO, TIOCGWINSZ, &window); + if (error) err(EX_IOERR, "TIOCGWINSZ"); + + ssize_t size = write(fd.write, &window, sizeof(window)); + if (size < 0) err(EX_IOERR, "write(%d)", fd.write); + if ((size_t)size < sizeof(window)) errx(EX_IOERR, "short write(%d)", fd.write); +} + +int winch(void) { + int error = pipe((int *)&fd); + if (error) err(EX_OSERR, "pipe"); + + error = fcntl(fd.read, F_SETFD, FD_CLOEXEC); + if (error) err(EX_IOERR, "fcntl"); + + error = fcntl(fd.write, F_SETFD, FD_CLOEXEC); + if (error) err(EX_IOERR, "fcntl"); + + struct sigaction action = { + .sa_handler = sigwinch, + .sa_flags = SA_RESTART, + }; + error = sigaction(SIGWINCH, &action, NULL); + if (error) err(EX_OSERR, "sigaction"); + + return fd.read; +} |