Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Date: Mon, 15 Nov 2004 15:11:37 +0200 Message-Id: <200411151311.iAFDBbnD009986@beta.mvs.co.il> From: "Ehud Karni" To: cygwin AT cygwin DOT com Subject: Re: [ANNOUNCEMENT] Updated: cygwin-1.5.12-1 In-reply-to: (message from Igor Pechtchanski on Thu, 11 Nov 2004 15:59:35 -0500 (EST)) Organization: Mivtach-Simon Insurance agencies Reply-to: ehud AT unix DOT mvs DOT co DOT il References: <200411111553 DOT iABFrHe20886 AT esds DOT vss DOT fsi DOT com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-8-i Content-Transfer-Encoding: 7bit X-IsSubscribed: yes On Thu, 11 Nov 2004, Christopher Faylor wrote: > I've made a new version of the Cygwin DLL and associated utilities > available for download. As usual, a list of what has changed is below. [snip] > - Use proper wait value for tty reads. (Mark Paulus) Thanks VERY, VERY MUCH. I've waited for this fix for 2 years now (see my post "Possible bug in non blocking read from /dev/tty" from 2002-11-20: http://sources.redhat.com/ml/cygwin/2002-11/msg01106.html ). Today, after upgrading to cygwin-1.5.12-1 I checked this again and it WORKED ! Thank you Mark Paulus ! Bellow is a program that use this feature to execute a command every seconds and exist after ANY keyboard input. Ehud. /* cmd_loop: execute command in loop, stop on any input RCS: $Id: cmd_loop.c,v 1.101 1998/03/17 17:06:09 ehud Exp $ $Log: cmd_loop.c,v $ Revision 1.101 1998/03/17 17:06:09 ehud Allow \xFD (replace by space) in command name Revision 1.100 1997/12/16 18:20:36 ehud Initial RCS version - Tested command call: cmd_loop [] default sleep time is 15 seconds. the program stops on any input. Ehud Karni 16/12/97 */ #include /* standard I/O library */ #include /* standard lib - ttyname */ #include /* standard UNIX operations */ #include /* for reading long lines */ static const char *RCS_WHAT = "<@(#) $Id: cmd_loop.c,v 1.101 1998/03/17 17:06:09 ehud Exp $ >" ; /* RCS identification for what */ static FILE *devtty = NULL ; /* stream for terminal I/O - read only */ char *TTY = "/dev/tty" ; /* terminal device path */ int slp = 15 ; /* sleep seconds (default set) */ int vtime_val = 10 ; /* time to wait when there is no input (in 1/10 sec) */ char rdbuf [ 10 ] = "\xFE\xFE\xFE\xFE" ; /* tty check buffer */ /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ void ttyread ( char *lni, int length ) ; /* This sub reads 1 line */ /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ int main ( int argc, char *argv[] ) { int i , tslp , dif = 3 ; if ( argc > 2 ) /* is there 2nd arg ? */ { i = atoi ( argv [ 2 ] ) % 2000 ; /* sleep time (mod 2000) */ if ( i > 0 ) slp = i ; /* set sleep seconds */ if ( i > 499 ) dif = 5 ; /* allow 1/2 second diff for long waits */ } tslp = slp * 10 ; /* use the read for wait (in 1/10 seconds) */ slp = tslp / 251 ; /* sleep counter ( - 1 ) */ do { slp ++ ; /* sleep counter */ i = tslp / slp ; /* vtime value (1/10 seconds) */ } while ( ( tslp - i * slp ) > dif ) ;/* diff must be less then 1/2 second */ vtime_val = i ; /* set vtime in tty.io */ if ( ( devtty = fopen ( TTY , "r+" ) ) == NULL ) /* open (terminal ?) for read */ devtty = stdin ; /* failed ? ==> use stdin instead */ i = 0 ; /* i is loop checker */ while ( rdbuf [0] == '\xFE' ) /* exit on char read */ { if ( i == 0 ) { system ( argv [ 1 ] ) ; /* execute command - 1st arg */ i = slp ; /* each read takes 1/2 sec */ } i-- ; /* execute counter */ ttyread ( rdbuf , 2 ) ; /* read max of 2 chars / wait up to vtime_val / 10 seconds */ } return ( 0 ) ; /* return with exit code 0 (OK) */ } /*=========================================================================*/ void ttyread ( char *lni, int length ) /* This sub reads 1 line until new-line or EOF */ { struct termios ttyarg, intrm ; /* arguments for ioctl / termios */ int ftty, n ; /* devtty file number, temp n */ fflush ( devtty ) ; /* must flush before read */ ftty = fileno ( devtty ) ; /* file number of devtty */ tcgetattr( ftty , &intrm ) ; /* get stdin arguments (SAVE) */ ttyarg = intrm ; /* saved original configuration */ ttyarg.c_cc [VMIN] = 0 ; /* min of 0 chars */ ttyarg.c_cc [VTIME] = vtime_val ; /* wait max vtime_val/10 sec (def 15/10) */ ttyarg.c_iflag = IGNBRK | IGNPAR | ICRNL | IMAXBEL ; /* set these modes only on input */ ttyarg.c_lflag = 0 ; /* clear lflag of all processing */ n = tcsetattr( ftty , TCSANOW , &ttyarg ) ; /* set changed tty arguments */ lni [ length ] = 0 ; /* last pos must be Z byte */ n = read ( ftty , lni , length ) ; /* read devtty, max n chars, up to vtime_val / 10 sec wait */ tcsetattr( ftty , TCSANOW , & intrm ) ; /* reset devtty to saved value */ if ( n < 0 ) /* error ? */ perror ( "error in read tty " ) ; /* message to stderr */ } /*=========================================================================*/ -- Ehud Karni Tel: +972-3-7966-561 /"\ Mivtach - Simon Fax: +972-3-7966-667 \ / ASCII Ribbon Campaign Insurance agencies (USA) voice mail and X Against HTML Mail http://www.mvs.co.il FAX: 1-815-5509341 / \ GnuPG: 98EA398D Better Safe Than Sorry -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/