Those of you who follow source-changes will see that the implementation of this has just been committed (the details differ slightly from last discussed, but the result is better, with less changes required.)
No new header file was needed. All of this has been tested with the (near meaningless) trivial test program (appended below), compiled with many different combinations of the #ifdef symbols used in the program, plus _POSIX_SOURCE _NETBSD_SOURCE and _XOPEN_SOURCE, and in all cases, it has behaved like I would expect it to behave (including when it generates compilation errors or warnings, depending on which -D command line args were given to cc). There are two ways to include <termios.h> not because including it twice is interesting (though I tested that as well) but because it can (and did in some implementation variations tested) make a difference which of <termios.h> and <sys/ioctl.h> is included first. It shouldn't (and doesn't in the version committed.) All test compiles used -Wall. Tested with gcc only (the gcc in -current today.) Help improving the wording of the man page ( tcsetwinsize(3) - its source can be found in src/lib/libc/termios/tcgetwinsize.3 ) would be much appreciated. Let me know of any problems encountered due to this (there should be few, it is a very small change really) and/or (perhaps better) file a PR. kre #include <stdlib.h> #include <stdio.h> #include <string.h> #ifdef INCL_TERMIOS_1 #include <termios.h> #endif #ifdef INCL_IOCTL #include <sys/ioctl.h> #endif #ifdef INCL_TERMIOS_2 #include <termios.h> #endif int main(int argc, char **argv) { struct winsize w; memset(&w, 0, sizeof w); #ifdef _NETBSD_SOURCE printf("_NETBSD_SOURCE is defined (%ld)\n", (long)_NETBSD_SOURCE); #endif #ifdef _POSIX_SOURCE printf("_POSIX_SOURCE is defined (%ld)\n", (long)_POSIX_SOURCE); #endif #if USE_TERMIOS if (tcgetwinsize(0, &w) == -1) perror("tcgetwinsize"), exit(1); #endif #ifdef USE_IOCTL if (ioctl(0, TIOCGWINSZ, &w) == -1) perror("ioctl(TIOCGWINSZ)"), exit(1); #endif printf("R %u C %u\n", w.ws_row, w.ws_col); if (argc >= 3) { w.ws_row = atoi(argv[1]); w.ws_col = atoi(argv[2]); #if USE_TERMIOS if (tcsetwinsize(0, &w) == -1) perror("tcsetwinsize"), exit(1); #endif #ifdef USE_IOCTL if (ioctl(0, TIOCSWINSZ, &w) == -1) perror("ioctl(TIOCSWINSZ)"), exit(1); #endif #if USE_TERMIOS if (tcgetwinsize(0, &w) == -1) perror("tcgetwinsize 2"), exit(1); #endif #ifdef USE_IOCTL if (ioctl(0, TIOCGWINSZ, &w) == -1) perror("ioctl(TIOCGWINSZ)2"), exit(1); #endif printf("Set: R %u C %u\n", w.ws_row, w.ws_col); } exit(0); }