POSIX & SIGWINCH

Submitted by Rich Felker on Aug. 19, 2020, 11:09 p.m.

Details

Message ID 20200819230956.GA32728@brightrain.aerifal.cx
State New
Series "POSIX & SIGWINCH"
Headers show

Commit Message

Rich Felker Aug. 19, 2020, 11:09 p.m.
On Fri, Jul 24, 2020 at 01:51:14PM -0400, Rich Felker wrote:
> Somehow I missed that POSIX has adopted (for future issue) SIGWINCH and
> struct winsize and added functions (instead of raw ioctl) to get/set
> window size:
> 
> https://www.austingroupbugs.net/view.php?id=1151#c3856
> 
> These should be added to musl. I'll aim to do this along with other
> proposed additions shortly after release.

Proposed patch attached. We should examine whether moving struct
winsize out of ioctl.h will break anything; if so ioctl.h could
include termios.h or we could put the struct in the shared alltypes.

Rich

Patch hide | download patch | download mbox

diff --git a/include/sys/ioctl.h b/include/sys/ioctl.h
index c2ce3b48..d6a7d474 100644
--- a/include/sys/ioctl.h
+++ b/include/sys/ioctl.h
@@ -47,13 +47,6 @@  extern "C" {
 
 #define TIOCSER_TEMT 1
 
-struct winsize {
-	unsigned short ws_row;
-	unsigned short ws_col;
-	unsigned short ws_xpixel;
-	unsigned short ws_ypixel;
-};
-
 #define SIOCADDRT          0x890B
 #define SIOCDELRT          0x890C
 #define SIOCRTMSG          0x890D
diff --git a/include/termios.h b/include/termios.h
index d73c780d..793cfc94 100644
--- a/include/termios.h
+++ b/include/termios.h
@@ -15,6 +15,13 @@  typedef unsigned char cc_t;
 typedef unsigned int speed_t;
 typedef unsigned int tcflag_t;
 
+struct winsize {
+	unsigned short ws_row;
+	unsigned short ws_col;
+	unsigned short ws_xpixel;
+	unsigned short ws_ypixel;
+};
+
 #define NCCS 32
 
 #include <bits/termios.h>
@@ -27,6 +34,9 @@  int cfsetispeed (struct termios *, speed_t);
 int tcgetattr (int, struct termios *);
 int tcsetattr (int, int, const struct termios *);
 
+int tcgetwinsize (int, struct winsize *);
+int tcsetwinsize (int, const struct winsize *);
+
 int tcsendbreak (int, int);
 int tcdrain (int);
 int tcflush (int, int);
diff --git a/src/termios/tcgetwinsize.c b/src/termios/tcgetwinsize.c
new file mode 100644
index 00000000..9b3a65a4
--- /dev/null
+++ b/src/termios/tcgetwinsize.c
@@ -0,0 +1,8 @@ 
+#include <termios.h>
+#include <sys/ioctl.h>
+#include "syscall.h"
+
+int tcgetwinsize(int fd, struct winsize *wsz)
+{
+	return syscall(SYS_ioctl, fd, TIOCGWINSZ, wsz);
+}
diff --git a/src/termios/tcsetwinsize.c b/src/termios/tcsetwinsize.c
new file mode 100644
index 00000000..e01d0e25
--- /dev/null
+++ b/src/termios/tcsetwinsize.c
@@ -0,0 +1,8 @@ 
+#include <termios.h>
+#include <sys/ioctl.h>
+#include "syscall.h"
+
+int tcsetwinsize(int fd, const struct winsize *wsz)
+{
+	return syscall(SYS_ioctl, fd, TIOCSWINSZ, wsz);
+}