From a2e0b6901cb4eef7ad1d78bee0d70c577c61e0f5 Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Sun, 25 Feb 2018 19:16:56 -0500 Subject: Rewrite everything --- winch.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 winch.c (limited to 'winch.c') 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 + * + * 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 + +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; +} -- cgit 1.4.1