summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build/has/tcsetwinsize.c9
-rw-r--r--build/header.mk1
-rw-r--r--src/bfstd.c8
-rw-r--r--src/bfstd.h5
4 files changed, 23 insertions, 0 deletions
diff --git a/build/has/tcsetwinsize.c b/build/has/tcsetwinsize.c
new file mode 100644
index 0000000..6717415
--- /dev/null
+++ b/build/has/tcsetwinsize.c
@@ -0,0 +1,9 @@
+// Copyright © Tavian Barnes <tavianator@tavianator.com>
+// SPDX-License-Identifier: 0BSD
+
+#include <termios.h>
+
+int main(void) {
+ const struct winsize ws = {0};
+ return tcsetwinsize(0, &ws);
+}
diff --git a/build/header.mk b/build/header.mk
index 0e3af14..13672ba 100644
--- a/build/header.mk
+++ b/build/header.mk
@@ -56,6 +56,7 @@ HEADERS := \
gen/has/string-to-flags.h \
gen/has/strtofflags.h \
gen/has/tcgetwinsize.h \
+ gen/has/tcsetwinsize.h \
gen/has/timegm.h \
gen/has/timer-create.h \
gen/has/tm-gmtoff.h \
diff --git a/src/bfstd.c b/src/bfstd.c
index 64cc605..4269d55 100644
--- a/src/bfstd.c
+++ b/src/bfstd.c
@@ -568,6 +568,14 @@ int xtcgetwinsize(int fd, struct winsize *ws) {
#endif
}
+int xtcsetwinsize(int fd, const struct winsize *ws) {
+#if BFS_HAS_TCSETWINSIZE
+ return tcsetwinsize(fd, ws);
+#else
+ return ioctl(fd, TIOCSWINSZ, ws);
+#endif
+}
+
int dup_cloexec(int fd) {
#ifdef F_DUPFD_CLOEXEC
return fcntl(fd, F_DUPFD_CLOEXEC, 0);
diff --git a/src/bfstd.h b/src/bfstd.h
index a17ce95..51920c9 100644
--- a/src/bfstd.h
+++ b/src/bfstd.h
@@ -350,6 +350,11 @@ int open_cterm(int flags);
*/
int xtcgetwinsize(int fd, struct winsize *ws);
+/**
+ * tcsetwinsize()/ioctl(TIOCSWINSZ) wrapper.
+ */
+int xtcsetwinsize(int fd, const struct winsize *ws);
+
// #include <unistd.h>
/**