diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2024-07-28 11:01:58 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2024-07-28 11:01:58 -0400 |
commit | 7780379b27b868fe240d7ec1ceb6902280029731 (patch) | |
tree | 3ea332341aaa9756162688a0faafe96bbfedc9fa | |
parent | 26f3c379c1603ebdc35d1653b677b9e22685fd81 (diff) | |
download | bfs-7780379b27b868fe240d7ec1ceb6902280029731.tar.xz |
bar: Use tcgetwinsize() from POSIX 2024 if available
-rw-r--r-- | build/has/tcgetwinsize.c | 9 | ||||
-rw-r--r-- | build/header.mk | 1 | ||||
-rw-r--r-- | src/bar.c | 13 |
3 files changed, 20 insertions, 3 deletions
diff --git a/build/has/tcgetwinsize.c b/build/has/tcgetwinsize.c new file mode 100644 index 0000000..d25d12b --- /dev/null +++ b/build/has/tcgetwinsize.c @@ -0,0 +1,9 @@ +// Copyright © Tavian Barnes <tavianator@tavianator.com> +// SPDX-License-Identifier: 0BSD + +#include <termios.h> + +int main(void) { + struct winsize ws; + return tcgetwinsize(0, &ws); +} diff --git a/build/header.mk b/build/header.mk index a4f392e..8dc7a56 100644 --- a/build/header.mk +++ b/build/header.mk @@ -51,6 +51,7 @@ HEADERS := \ gen/has/strerror-r-posix.h \ gen/has/string-to-flags.h \ gen/has/strtofflags.h \ + gen/has/tcgetwinsize.h \ gen/has/timegm.h \ gen/has/tm-gmtoff.h \ gen/has/uselocale.h @@ -16,6 +16,7 @@ #include <stdio.h> #include <string.h> #include <sys/ioctl.h> +#include <termios.h> struct bfs_bar { int fd; @@ -28,10 +29,16 @@ struct bfs_bar { /** Get the terminal size, if possible. */ static int bfs_bar_getsize(struct bfs_bar *bar) { -#ifdef TIOCGWINSZ +#if BFS_HAS_TCGETWINSIZE || defined(TIOCGWINSZ) struct winsize ws; - if (ioctl(bar->fd, TIOCGWINSZ, &ws) != 0) { - return -1; + +# if BFS_HAS_TCGETWINSIZE + int ret = tcgetwinsize(bar->fd, &ws); +# else + int ret = ioctl(bar->fd, TIOCGWINSZ, &ws); +# endif + if (ret != 0) { + return ret; } store(&bar->width, ws.ws_col, relaxed); |