Hi Zachary, thanks for the report. I pushed a patch. This will show up in the next Cygwin release 3.6.5.
https://sourceware.org/cgit/newlib-cygwin/commit/?id=73600d68227e Thanks, Corinna On Jul 18 00:02, Zachary Santer via Cygwin wrote: > Was "MacOS Homebrew bash '5.3.0(1)-release' breaks 'wait' (?)" on > bug-bash@gnu.org. > > On Thu, Jul 17, 2025 at 12:05 PM Chet Ramey <chet.ra...@case.edu> wrote: > > > > On 7/17/25 8:51 AM, Sam James wrote: > > > Zachary Santer <zsan...@gmail.com> writes: > > > > > >> I've applied your patch, but gcc 15.1.0 has decided that a 'struct > > >> winsize *' not being a 'struct winsize *' is an error now. > > >> > > >> Configuration Information [Automatically generated, do not change]: > > >> Machine: x86_64 > > >> OS: cygwin > > >> Compiler: gcc > > >> Compilation CFLAGS: -Wno-error=incompatible-pointer-types > > >> uname output: MSYS_NT-10.0-26100 Zack2021HPPavilion > > >> 3.6.3-ab81aae6.x86_64 2025-07-01 18:20 UTC x86_64 Msys > > >> Machine Type: x86_64-pc-cygwin > > >> > > >> Bash Version: 5.3 > > >> Patch Level: 0 > > >> Release Status: maint > > >> > > >> Would be nice if bashbug were generated even if bash itself failed to > > >> build. > > >> > > >> From before I changed CFLAGS, obviously: > > >> > > >> winsize.c: In function 'get_new_window_size': > > >> winsize.c:98:39: error: passing argument 2 of 'tcgetwinsize' from > > >> incompatible pointer type [-Wincompatible-pointer-types] > > >> 98 | if (tty >= 0 && (tcgetwinsize (tty, &win) == 0) && > > >> win.ws_row > 0 && win.ws_col > 0) > > >> | ^~~~ > > >> | | > > >> | struct winsize * > > >> In file included from /usr/include/sys/ioctl.h:15, > > >> from winsize.c:31: > > >> /usr/include/sys/termios.h:304:42: note: expected 'struct winsize *' > > >> but argument is of type 'struct winsize *' > > >> 304 | int tcgetwinsize(int fd, struct winsize *winsz); > > > > > > This is probably a visibility of the type issue: > > > https://gcc.gnu.org/PR117866. > > > > OK. Where is `struct winsize' declared if not in termios.h or ioctl.h > > (or the nest of includes for old systems)? > > > > https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcgetwinsize.html#tag_17_609 > > > > says that if libc has tcgetwinsize(), you only need <termios.h> to get > > its declaration. > > I've attached the /usr/include/sys/termios.h file included in my MSYS2 > installation. As you can see, struct winsize is defined after it is > referenced in the function declarations of tcgetwinsize() and > tcsetwinsize() in that file. > > I moved the definition of struct winsize to above the function > declarations, and bash built without issue. > > This is a Cygwin bug, so I've included their email list on the To: > line. The MSYS2 people don't use an email list anymore, so if I need > to get in touch with them, I'll have to file an issue on their Github. > > --- orig/termios.h 2025-07-17 23:26:00.518408600 -0400 > +++ fixed/termios.h 2025-07-17 23:28:00.517939200 -0400 > @@ -284,6 +284,13 @@ > > #define termio termios > > +/* Extra stuff to make porting stuff easier. */ > +struct winsize > +{ > + unsigned short ws_row, ws_col; > + unsigned short ws_xpixel, ws_ypixel; > +}; > + > #ifdef __cplusplus > extern "C" { > #endif > @@ -313,13 +320,6 @@ > #define cfgetospeed(tp) ((tp)->c_ospeed) > #endif > > -/* Extra stuff to make porting stuff easier. */ > -struct winsize > -{ > - unsigned short ws_row, ws_col; > - unsigned short ws_xpixel, ws_ypixel; > -}; > - > #define TIOCGWINSZ (('T' << 8) | 1) > #define TIOCSWINSZ (('T' << 8) | 2) > #define TIOCLINUX (('T' << 8) | 3) > /* sys/termios.h > > This file is part of Cygwin. > > This software is a copyrighted work licensed under the terms of the > Cygwin license. Please consult the file "CYGWIN_LICENSE" for > details. */ > > /* sys/termios.h */ > > #ifndef _SYS_TERMIOS_H > #define _SYS_TERMIOS_H > > #include <sys/types.h> > > #define TIOCMGET 0x5415 > #define TIOCMBIS 0x5416 > #define TIOCMBIC 0x5417 > #define TIOCMSET 0x5418 > #define TIOCINQ 0x541B > #define TIOCSCTTY 0x540E > > /* TIOCINQ is utilized instead of FIONREAD which has been > accupied for other purposes under CYGWIN. > Other UNIX ioctl requests has been omited because > effects of their work one can achive by standard > POSIX commands */ > > #define TIOCSBRK 0x5427 > #define TIOCCBRK 0x5428 > > #define TIOCM_DTR 0x002 > #define TIOCM_RTS 0x004 > #define TIOCM_CTS 0x020 > #define TIOCM_CAR 0x040 > #define TIOCM_RNG 0x080 > #define TIOCM_DSR 0x100 > #define TIOCM_CD TIOCM_CAR > #define TIOCM_RI TIOCM_RNG > > #define TCOOFF 0 > #define TCOON 1 > #define TCIOFF 2 > #define TCION 3 > > #define TCGETA 5 > #define TCSETA 6 > #define TCSETAW 7 > #define TCSETAF 8 > > #define TCIFLUSH 0 > #define TCOFLUSH 1 > #define TCIOFLUSH 2 > #define TCFLSH 3 > > #define TCSAFLUSH 1 > #define TCSANOW 2 > #define TCSADRAIN 3 > #define TCSADFLUSH 4 > > #define TIOCPKT 6 > > #define TIOCPKT_DATA 0 > #define TIOCPKT_FLUSHREAD 1 > #define TIOCPKT_FLUSHWRITE 2 > #define TIOCPKT_STOP 4 > #define TIOCPKT_START 8 > #define TIOCPKT_NOSTOP 16 > #define TIOCPKT_DOSTOP 32 > > /* Compatible with asm/socket.h */ > #define FIONBIO 0x8004667e /* set/clear non-blocking i/o > */ > > #define CTRL(ch) ((ch)&0x1F) > > #define CNUL 0 > #define CDEL 0x0007f > #define CESC '\\' > #define CINTR CTRL('C') > #define CQUIT 0x0001c > #define CERASE CDEL > #define CKILL CTRL('U') > #define CEOT CTRL('D') > #define CEOL 0 > #define CEOL2 0 > #define CBRK CEOL > #define CEOF CTRL('D') > #define CSTART CTRL('Q') > #define CSTOP CTRL('S') > #define CSWTCH 0x0001a > #define NSWTCH 0 > #define CSUSP CTRL('Z') > #define CDSUSP CTRL('Y') > #define CRPRNT CTRL('R') > #define CREPRINT CRPRNT > #define CFLUSH CTRL('O') > #define CDISCARD CFLUSH > #define CWERASE CTRL('W') > #define CLNEXT CTRL('V') > #define CMIN 1 > #define CTIME 0 > > /* iflag bits */ > #define IGNBRK 0x00001 > #define BRKINT 0x00002 > #define IGNPAR 0x00004 > #define IMAXBEL 0x00008 > #define INPCK 0x00010 > #define ISTRIP 0x00020 > #define INLCR 0x00040 > #define IGNCR 0x00080 > #define ICRNL 0x00100 > #define IXON 0x00400 > #define IXOFF 0x01000 > #define IUCLC 0x04000 > #define IXANY 0x08000 > #define PARMRK 0x10000 > #define IUTF8 0x20000 > > /* oflag bits */ > > #define OPOST 0x00001 > #define OLCUC 0x00002 > #define OCRNL 0x00004 > #define ONLCR 0x00008 > #define ONOCR 0x00010 > #define ONLRET 0x00020 > #define OFILL 0x00040 > #define CRDLY 0x00180 > #define CR0 0x00000 > #define CR1 0x00080 > #define CR2 0x00100 > #define CR3 0x00180 > #define NLDLY 0x00200 > #define NL0 0x00000 > #define NL1 0x00200 > #define BSDLY 0x00400 > #define BS0 0x00000 > #define BS1 0x00400 > #define TABDLY 0x01800 > #define TAB0 0x00000 > #define TAB1 0x00800 > #define TAB2 0x01000 > #define TAB3 0x01800 > #define XTABS 0x01800 > #define VTDLY 0x02000 > #define VT0 0x00000 > #define VT1 0x02000 > #define FFDLY 0x04000 > #define FF0 0x00000 > #define FF1 0x04000 > #define OFDEL 0x08000 > > /* cflag bits */ > > /* Baud rate values. These must fit in speed_t, which is unsigned > char. See also the extended baud rates below. These baud rates > set an additional bit. */ > #define CBAUD 0x0100f > #define B0 0x00000 > #define B50 0x00001 > #define B75 0x00002 > #define B110 0x00003 > #define B134 0x00004 > #define B150 0x00005 > #define B200 0x00006 > #define B300 0x00007 > #define B600 0x00008 > #define B1200 0x00009 > #define B1800 0x0000a > #define B2400 0x0000b > #define B4800 0x0000c > #define B9600 0x0000d > #define B19200 0x0000e > #define B38400 0x0000f > > #define CSIZE 0x00030 > #define CS5 0x00000 > #define CS6 0x00010 > #define CS7 0x00020 > #define CS8 0x00030 > #define CSTOPB 0x00040 > #define CREAD 0x00080 > #define PARENB 0x00100 > #define PARODD 0x00200 > #define HUPCL 0x00400 > #define CLOCAL 0x00800 > > /* Extended baud rates above 37K. */ > #define CBAUDEX 0x0100f > #define B57600 0x01001 > #define B115200 0x01002 > #define B128000 0x01003 > #define B230400 0x01004 > #define B256000 0x01005 > #define B460800 0x01006 > #define B500000 0x01007 > #define B576000 0x01008 > #define B921600 0x01009 > #define B1000000 0x0100a > #define B1152000 0x0100b > #define B1500000 0x0100c > #define B2000000 0x0100d > #define B2500000 0x0100e > #define B3000000 0x0100f > > #define CRTSXOFF 0x04000 > #define CRTSCTS 0x08000 > #define CMSPAR 0x40000000 /* Mark or space (stick) parity. */ > > /* lflag bits */ > #define ISIG 0x0001 > #define ICANON 0x0002 > #define ECHO 0x0004 > #define ECHOE 0x0008 > #define ECHOK 0x0010 > #define ECHONL 0x0020 > #define NOFLSH 0x0040 > #define TOSTOP 0x0080 > #define IEXTEN 0x0100 > #define FLUSHO 0x0200 > #define ECHOKE 0x0400 > #define ECHOCTL 0x0800 > > #define VDISCARD 1 > #define VEOL 2 > #define VEOL2 3 > #define VEOF 4 > #define VERASE 5 > #define VINTR 6 > #define VKILL 7 > #define VLNEXT 8 > #define VMIN 9 > #define VQUIT 10 > #define VREPRINT 11 > #define VSTART 12 > #define VSTOP 13 > #define VSUSP 14 > #define VSWTC 15 > #define VTIME 16 > #define VWERASE 17 > > #define NCCS 18 > > /* Compare a character C to a value VAL from the `c_cc' array in a > `struct termios'. If VAL is _POSIX_VDISABLE, no character can match it. > */ > #define CCEQ(val, c) ((c) == (val) && (val) != _POSIX_VDISABLE) > > #define TTYDEF_IFLAG (BRKINT | ICRNL | IMAXBEL | IXON | IXANY) > #define TTYDEF_OFLAG (OPOST | ONLCR) > #define TTYDEF_LFLAG (ICANON | ISIG | IEXTEN | ECHO | ECHOE | ECHOKE | > ECHOCTL) > #define TTYDEF_CFLAG (CREAD | CS8 | HUPCL) > #define TTYDEF_SPEED (B9600) > > typedef unsigned char cc_t; > typedef unsigned int tcflag_t; > typedef unsigned int speed_t; > typedef unsigned short otcflag_t; > typedef unsigned char ospeed_t; > > struct __oldtermios > { > otcflag_t c_iflag; > otcflag_t c_oflag; > otcflag_t c_cflag; > otcflag_t c_lflag; > char c_line; > cc_t c_cc[NCCS]; > ospeed_t c_ispeed; > ospeed_t c_ospeed; > }; > > struct termios > { > tcflag_t c_iflag; > tcflag_t c_oflag; > tcflag_t c_cflag; > tcflag_t c_lflag; > char c_line; > cc_t c_cc[NCCS]; > speed_t c_ispeed; > speed_t c_ospeed; > }; > > #define termio termios > > #ifdef __cplusplus > extern "C" { > #endif > > int tcgetattr (int, struct termios *); > int tcsetattr (int, int, const struct termios *); > int tcsendbreak (int, int); > int tcdrain (int); > int tcflush (int, int); > int tcflow (int, int); > pid_t tcgetsid (int); > void cfmakeraw (struct termios *); > speed_t cfgetispeed(const struct termios *); > speed_t cfgetospeed(const struct termios *); > int cfsetispeed (struct termios *, speed_t); > int cfsetospeed (struct termios *, speed_t); > int cfsetspeed (struct termios *, speed_t); > int tcgetwinsize(int fd, struct winsize *winsz); > int tcsetwinsize(int fd, const struct winsize *winsz); > > #ifdef __cplusplus > } > #endif > > #ifndef __cplusplus > #define cfgetispeed(tp) ((tp)->c_ispeed) > #define cfgetospeed(tp) ((tp)->c_ospeed) > #endif > > /* Extra stuff to make porting stuff easier. */ > struct winsize > { > unsigned short ws_row, ws_col; > unsigned short ws_xpixel, ws_ypixel; > }; > > #define TIOCGWINSZ (('T' << 8) | 1) > #define TIOCSWINSZ (('T' << 8) | 2) > #define TIOCLINUX (('T' << 8) | 3) > #define TIOCGPGRP (('T' << 8) | 0xf) > #define TIOCSPGRP (('T' << 8) | 0x10) > > #endif /* _SYS_TERMIOS_H */ > > -- > Problem reports: https://cygwin.com/problems.html > FAQ: https://cygwin.com/faq/ > Documentation: https://cygwin.com/docs.html > Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple