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


Reply via email to