From: "Mark E." To: djgpp-workers AT delorie DOT com Date: Wed, 8 Aug 2001 09:42:22 -0400 MIME-Version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7BIT Subject: Re: TIOCGWINSZ Message-ID: <3B71097E.12277.2BD5C6@localhost> References: <3B701C66 DOT 28168 DOT 7C3116 AT localhost> In-reply-to: X-mailer: Pegasus Mail for Win32 (v3.12c) Reply-To: djgpp-workers AT delorie DOT com Hi, This version does away with the Unix constants in sys/ioctl.h not needed to implement TIOCGWINSZ. Does this go too far or should the other stuff be kept but still disabled? *** /cvs/djgpp/include/sys/ioctl.h Mon Aug 12 20:13:04 1996 --- include/sys/ioctl.h Wed Aug 8 09:25:00 2001 *************** of the xfer buffer in CX. Aaaaargh *** 76,97 **** #define DOS_QGIOCTLCAPD (DOS_PLAIN_QGIOCTLCAPD| DOS_RETAX) #define __IS_UNIX_IOCTL(a) ((a) & 0xd0000000U) - #if 0 - /* - ** UNIX stuff - ** - ** This is subject to major changes in the near future. - ** Do not use it yet. - */ /* - ** __WARNING__ : - ** This ifdef works for DJGPP, because its io.h - ** defines __djgpp_include_io_h_ - */ - #ifndef _IO - /* * Ioctl's have the command encoded in the lower word, * and the size of any in or out parameters in the upper * word. The high 2 bits of the upper word are used --- 76,86 ---- #define DOS_QGIOCTLCAPD (DOS_PLAIN_QGIOCTLCAPD| DOS_RETAX) + /* UNIX stuff */ + #define __IS_UNIX_IOCTL(a) ((a) & 0xd0000000U) /* * Ioctl's have the command encoded in the lower word, * and the size of any in or out parameters in the upper * word. The high 2 bits of the upper word are used *************** of the xfer buffer in CX. Aaaaargh *** 109,138 **** #define _IOW(x,y,t) (IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y) /* this should be _IORW, but stdio got there first */ #define _IOWR(x,y,t) (IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y) - #endif /* _IO */ - /* Common ioctl's for all disciplines which are handled in ttiocom */ - enum tty_ioctl { - TXISATTY = ('X'<<8), /* quick path for isatty */ - TXTTYNAME, /* quick path for ttyname */ - TXGETLD, /* get line discipline */ - TXSETLD, /* set line discipline */ - TXGETCD, /* get control disciplines */ - TXADDCD, /* add control discipline */ - TXDELCD, /* delete control discipline */ - TXSBAUD, /* set integer baud rate */ - TXGBAUD, /* get integer baud rate */ - TXSETIHOG, /* set the input buffer limit */ - TXSETOHOG, /* set the output buffer limit */ - TXGPGRP, /* get p grp with posix security */ - TXSPGRP /* set p grp with posix security */ - }; - - #define TTNAMEMAX 32 /* used with TXGETLD, et al */ - - union txname { /* used with TXGETCD */ - int tx_which; /* which name to get -- inbound */ - char tx_name[TTNAMEMAX];/* the name -- outbound */ - }; /* * window size structure used with TXSETWIN and TXGETWIN. This is --- 98,103 ---- *************** struct winsize { *** 147,346 **** unsigned short ws_ypixel; /* vertical size, pixels */ }; - struct tchars { - char t_intrc; /* interrupt */ - char t_quitc; /* quit */ - char t_startc; /* start output */ - char t_stopc; /* stop output */ - char t_eofc; /* end-of-file */ - char t_brkc; /* input delimiter (like nl) */ - }; - struct ltchars { - char t_suspc; /* stop process signal */ - char t_dsuspc; /* delayed stop process signal */ - char t_rprntc; /* reprint line */ - char t_flushc; /* flush output (toggles) */ - char t_werasc; /* word erase */ - char t_lnextc; /* literal next character */ - }; - - /* - * Structure for TIOCGETP and TIOCSETP ioctls. - */ - - struct sgttyb { - char sg_ispeed; /* input speed */ - char sg_ospeed; /* output speed */ - char sg_erase; /* erase character */ - char sg_kill; /* kill character */ - short sg_flags; /* mode flags */ - }; - - /* - * Pun for SUN. - */ - struct ttysize { - unsigned short ts_lines; - unsigned short ts_cols; - unsigned short ts_xxx; - unsigned short ts_yyy; - }; - #define TIOCGSIZE TIOCGWINSZ - #define TIOCSSIZE TIOCSWINSZ - - - - - - #define TIOCGETD _IOR('t', 0, int) /* get line discipline */ - #define TIOCSETD _IOW('t', 1, int) /* set line discipline */ - #define TIOCHPCL _IO('t', 2) /* hang up on last close */ - #define TIOCMODG _IOR('t', 3, int) /* get modem control state */ - #define TIOCMODS _IOW('t', 4, int) /* set modem control state */ - #define TIOCM_LE 0001 /* line enable */ - #define TIOCM_DTR 0002 /* data terminal ready */ - #define TIOCM_RTS 0004 /* request to send */ - #define TIOCM_ST 0010 /* secondary transmit */ - #define TIOCM_SR 0020 /* secondary receive */ - #define TIOCM_CTS 0040 /* clear to send */ - #define TIOCM_CAR 0100 /* carrier detect */ - #define TIOCM_CD TIOCM_CAR - #define TIOCM_RNG 0200 /* ring */ - #define TIOCM_RI TIOCM_RNG - #define TIOCM_DSR 0400 /* data set ready */ - #define TIOCGETP _IOR('t', 8,struct sgttyb) /* get parameters -- gtty */ - #define TIOCSETP _IOW('t', 9,struct sgttyb) /* set parameters -- stty */ - #define TIOCSETN _IOW('t',10,struct sgttyb) /* as above, but no flushtty */ - #define TIOCEXCL _IO('t', 13) /* set exclusive use of tty */ - #define TIOCNXCL _IO('t', 14) /* reset exclusive use of tty */ - #define TIOCFLUSH _IOW('t', 16, int) /* flush buffers */ - #define TIOCSETC _IOW('t',17,struct tchars) /* set special characters */ - #define TIOCGETC _IOR('t',18,struct tchars) /* get special characters */ - #define TANDEM 0x00000001 /* send stopc on out q full */ - #define CBREAK 0x00000002 /* half-cooked mode */ - #define LCASE 0x00000004 /* simulate lower case */ - #define ECHO 0x00000008 /* echo input */ - #define CRMOD 0x00000010 /* map \r to \r\n on output */ - #define RAW 0x00000020 /* no i/o processing */ - #define ODDP 0x00000040 /* get/send odd parity */ - #define EVENP 0x00000080 /* get/send even parity */ - #define ANYP 0x000000c0 /* get any parity/send none */ - #define CRDELAY 0x00000300 /* \r delay */ - #define CR0 0x00000000 - #define CR1 0x00000100 /* tn 300 */ - #define CR2 0x00000200 /* tty 37 */ - #define CR3 0x00000300 /* concept 100 */ - #define TBDELAY 0x00000c00 /* horizontal tab delay */ - #define TAB0 0x00000000 - #define TAB1 0x00000400 /* tty 37 */ - #define TAB2 0x00000800 - #define XTABS 0x00000c00 /* expand tabs on output */ - #define BSDELAY 0x00001000 /* \b delay */ - #define BS0 0x00000000 - #define BS1 0x00001000 - #define VTDELAY 0x00002000 /* vertical tab delay */ - #define FF0 0x00000000 - #define FF1 0x00002000 /* tty 37 */ - #define NLDELAY 0x0000c000 /* \n delay */ - #define NL0 0x00000000 - #define NL1 0x00004000 /* tty 37 */ - #define NL2 0x00008000 /* vt05 */ - #define NL3 0x0000c000 - #define ALLDELAY (NLDELAY|TBDELAY|CRDELAY|VTDELAY|BSDELAY) - #define TOSTOP 0x00010000 /* SIGSTOP on bckgnd output */ - #define PRTERA 0x00020000 /* \ ... / erase */ - #define CRTERA 0x00040000 /* " \b " to wipe out char */ - #define TILDE 0x00080000 /* hazeltine tilde kludge */ - #define FLUSHO 0x00100000 /* flush output to terminal */ - #define LITOUT 0x00200000 /* literal output */ - #define CRTBS 0x00400000 /* do backspacing for crt */ - #define MDMBUF 0x00800000 /* dtr pacing */ - #define NOHANG 0x01000000 /* no SIGHUP on carrier drop */ - #define L001000 0x02000000 - #define CRTKIL 0x04000000 /* kill line with " \b " */ - #define PASS8 0x08000000 - #define CTLECH 0x10000000 /* echo control chars as ^X */ - #define PENDIN 0x20000000 /* tp->t_rawq needs reread */ - #define DECCTQ 0x40000000 /* only ^Q starts after ^S */ - #define NOFLUSH 0x80000000 /* no output flush on signal */ - #define TIOCCONS _IOW('t', 98, int) /* become virtual console */ - #ifdef _BSD_INCLUDES - /* - * Added for 4.3 BSD. - */ - #define NOFLSH NOFLUSH /* no output flush on signal */ - #endif /* _BSD_INCLUDES */ - - /* locals, from 127 down */ - #define TIOCLBIS _IOW('t', 127, int) /* bis local mode bits */ - #define TIOCLBIC _IOW('t', 126, int) /* bic local mode bits */ - #define TIOCLSET _IOW('t', 125, int) /* set entire mode word */ - #define TIOCLGET _IOR('t', 124, int) /* get local modes */ - #define LCRTBS (CRTBS>>16) - #define LPRTERA (PRTERA>>16) - #define LCRTERA (CRTERA>>16) - #define LTILDE (TILDE>>16) - #define LMDMBUF (MDMBUF>>16) - #define LLITOUT (LITOUT>>16) - #define LTOSTOP (TOSTOP>>16) - #define LFLUSHO (FLUSHO>>16) - #define LNOHANG (NOHANG>>16) - #define LCRTKIL (CRTKIL>>16) - #define LPASS8 (PASS8>>16) - #define LCTLECH (CTLECH>>16) - #define LPENDIN (PENDIN>>16) - #define LDECCTQ (DECCTQ>>16) - #define LNOFLSH (NOFLUSH>>16) - #define TIOCSBRK _IO('t', 123) /* set break bit */ - #define TIOCCBRK _IO('t', 122) /* clear break bit */ - #define TIOCSDTR _IO('t', 121) /* set data terminal ready */ - #define TIOCCDTR _IO('t', 120) /* clear data terminal ready */ - #define TIOCGPGRP _IOR('t', 119, int) /* get process group */ - #define TIOCSPGRP _IOW('t', 118, int) /* set process gorup */ - #define TIOCSLTC _IOW('t',117,struct ltchars) /* set local special chars */ - #define TIOCGLTC _IOR('t',116,struct ltchars) /* get local special chars */ - #define TIOCOUTQ _IOR('t', 115, int) /* output queue size */ - #define TIOCSTI _IOW('t', 114, char) /* simulate terminal input */ - #define TIOCNOTTY _IO('t', 113) /* void tty association */ - #define TIOCPKT _IOW('t', 112, int) /* pty: set/clear packet mode */ - #define TIOCPKT_DATA 0x00 /* data packet */ - #define TIOCPKT_FLUSHREAD 0x01 /* flush packet */ - #define TIOCPKT_FLUSHWRITE 0x02 /* flush packet */ - #define TIOCPKT_STOP 0x04 /* stop output */ - #define TIOCPKT_START 0x08 /* start output */ - #define TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ - #define TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ - #define TIOCSTOP _IO('t', 111) /* stop output, like ^S */ - #define TIOCSTART _IO('t', 110) /* start output, like ^Q */ - #define TIOCMSET _IOW('t', 109, int) /* set all modem bits */ - #define TIOCMBIS _IOW('t', 108, int) /* bis modem bits */ - #define TIOCMBIC _IOW('t', 107, int) /* bic modem bits */ - #define TIOCMGET _IOR('t', 106, int) /* get all modem bits */ - #define TIOCREMOTE _IOW('t', 105, int) /* remote input editing */ #define TIOCGWINSZ _IOR('t', 104, struct winsize) /* get window size */ #define TIOCSWINSZ _IOW('t', 103, struct winsize) /* set window size */ ! #define TIOCUCNTL _IOW('t', 102, int) /* pty: set/clr usr cntl mode */ ! #define UIOCCMD(n) _IO('u', n) /* usr cntl op "n" */ ! ! #define OTTYDISC 0 /* old, v7 std tty driver */ ! #define NETLDISC 1 /* line discip for berk net */ ! #define NTTYDISC 2 /* new tty discipline */ ! #define TABLDISC 3 /* tablet discipline */ ! #define SLIPDISC 4 /* serial IP discipline */ ! ! #define FIOCLEX _IO('f', 1) /* set exclusive use on fd */ ! #define FIONCLEX _IO('f', 2) /* remove exclusive use */ ! /* another local */ ! ! #define FIONREAD _IOR('f', 127, int) /* get # bytes to read */ ! #define FIONBIO _IOW('f', 126, int) /* set/clear non-blocking i/o */ ! #define FIOASYNC _IOW('f', 125, int) /* set/clear async i/o */ ! ! #define FIOSETOWN _IOW('f', 124, int) /* set owner */ ! #define FIOGETOWN _IOR('f', 123, int) /* get owner */ ! ! ! #endif /* 0 */ int ioctl( int fd, int cmd, ...); --- 112,121 ---- unsigned short ws_ypixel; /* vertical size, pixels */ }; #define TIOCGWINSZ _IOR('t', 104, struct winsize) /* get window size */ + #if 0 #define TIOCSWINSZ _IOW('t', 103, struct winsize) /* set window size */ ! #endif int ioctl( int fd, int cmd, ...); *** /cvs/djgpp/src/libc/compat/ioctl/ioctl.c Sat Jun 23 16:43:08 2001 --- projects/ioctl/ioctl.c Wed Aug 8 09:36:02 2001 *************** import djgpp 2.02 *** 107,115 **** #include #include #include - /****************************************************************************/ /****************************************************************************/ /* S T A R T O F I M P L E M E N T A T I O N ***************************/ --- 107,115 ---- #include #include #include + #include /****************************************************************************/ /****************************************************************************/ /* S T A R T O F I M P L E M E N T A T I O N ***************************/ *************** static int _dos_ioctl(int fd, int cmd, i *** 251,272 **** } ! static int _unix_ioctl(int fd,int cmd, int arg){ ! /* ! ** What to do _HERE_ ? ! */ ! __FSEXT_Function *func = __FSEXT_get_function(fd); ! if(func){ ! int rv; ! if(func(__FSEXT_ioctl,&rv, &fd)) ! return rv; } ! /* ! ** All else fails so far. ! */ ! errno = ENOTTY; ! return -1; } /* --- 251,286 ---- } ! static int _unix_ioctl(int fd, int cmd, va_list args) ! { ! __FSEXT_Function *func = __FSEXT_get_function(fd); ! if(func) ! { ! int rv; ! if (func(__FSEXT_ioctl,&rv, &fd)) ! return rv; ! } ! ! switch (cmd) ! { ! case TIOCGWINSZ: ! { ! struct winsize *win; ! ! win = va_arg(args, struct winsize *); ! ! _farsetsel(_dos_ds); ! win->ws_row = _farnspeekb(0x0484) + 1; ! win->ws_col = _farnspeekw(0x044a); ! win->ws_xpixel = 1; ! win->ws_ypixel = 1; ! return 0; } + } ! /* All else fails. */ ! errno = ENOSYS; ! return -1; } /* *************** static int _unix_ioctl(int fd,int cmd, i *** 274,285 **** ** The user callable entry point. ** */ ! int ioctl(int fd, int cmd, ...){ ! va_list args; int argcx,argdx,argsi,argdi; int narg,xarg; __FSEXT_Function *func = __FSEXT_get_function(fd); int rv; /** ** see if this is a file system extension file --- 288,300 ---- ** The user callable entry point. ** */ ! int ioctl(int fd, int cmd, ...) ! { int argcx,argdx,argsi,argdi; int narg,xarg; __FSEXT_Function *func = __FSEXT_get_function(fd); int rv; + va_list args; /** ** see if this is a file system extension file *************** int ioctl(int fd, int cmd, ...){ *** 288,298 **** if (func && func(__FSEXT_ioctl, &rv, &fd)) return rv; ! va_start(args,cmd); ! ! if(__IS_UNIX_IOCTL(cmd)){ ! int arg = va_arg(args, int); ! va_end(args); #ifdef TEST { int inflg = (cmd & IOC_IN) == IOC_IN; --- 303,312 ---- if (func && func(__FSEXT_ioctl, &rv, &fd)) return rv; ! va_start(args, cmd); ! ! if(__IS_UNIX_IOCTL(cmd)) ! { #ifdef TEST { int inflg = (cmd & IOC_IN) == IOC_IN; *************** int ioctl(int fd, int cmd, ...){ *** 309,315 **** inflg,outflg,voidflg,size); } #endif ! return _unix_ioctl(fd,cmd,arg); } /* Handle a DOS request */ /* extract arguments */ --- 323,329 ---- inflg,outflg,voidflg,size); } #endif ! return _unix_ioctl(fd, cmd, args); } /* Handle a DOS request */ /* extract arguments */ *************** int ioctl(int fd, int cmd, ...){ *** 335,341 **** #include #include ! int main (int argc, char **argv){ int fd; int res; short *s; --- 349,356 ---- #include #include ! int main (int argc, char **argv) ! { int fd; int res; short *s;