static void hb_gt_std_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_FHANDLE hFilenoStderr ) { PHB_GTSTD pGTSTD; HB_TRACE(HB_TR_DEBUG, ("hb_gt_std_Init(%p,%p,%p,%p)", pGT, ( void * ) ( HB_PTRDIFF ) hFilenoStdin, ( void * ) ( HB_PTRDIFF ) hFilenoStdout, ( void * ) ( HB_PTRDIFF ) hFilenoStderr)); pGTSTD = ( PHB_GTSTD ) hb_xgrab( sizeof( HB_GTSTD ) ); memset( pGTSTD, 0, sizeof( HB_GTSTD ) ); HB_GTLOCAL( pGT ) = pGTSTD; pGTSTD->hStdin = hFilenoStdin; pGTSTD->hStdout = hFilenoStdout; pGTSTD->hStderr = hFilenoStderr; pGTSTD->fStdinConsole = hb_fsIsDevice( pGTSTD->hStdin ); pGTSTD->fStdoutConsole = hb_fsIsDevice( pGTSTD->hStdout ); pGTSTD->fStderrConsole = hb_fsIsDevice( pGTSTD->hStderr ); hb_gt_std_setKeyTrans( pGTSTD, NULL, NULL ); pGTSTD->szCrLf = hb_strdup( hb_conNewLine() ); pGTSTD->ulCrLf = strlen( pGTSTD->szCrLf ); hb_fsSetDevMode( pGTSTD->hStdout, FD_BINARY ); HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); /* SA_NOCLDSTOP in #if is a hack to detect POSIX compatible environment */ #if ( defined( HB_OS_UNIX_COMPATIBLE ) || defined( __DJGPP__ ) ) && \ defined( SA_NOCLDSTOP ) if( pGTSTD->fStdinConsole ) { #if defined( SIGTTOU ) struct sigaction act, old; /* if( pGTSTD->saved_TIO.c_lflag & TOSTOP ) != 0 */ sigaction( SIGTTOU, NULL, &old ); memcpy( &act, &old, sizeof( struct sigaction ) ); act.sa_handler = sig_handler; /* do not use SA_RESTART - new Linux kernels will repeat the operation */ #if defined( SA_ONESHOT ) act.sa_flags = SA_ONESHOT; #elif defined( SA_RESETHAND ) act.sa_flags = SA_RESETHAND; #else act.sa_flags = 0; #endif sigaction( SIGTTOU, &act, 0 ); #endif s_fRestTTY = TRUE; tcgetattr( pGTSTD->hStdin, &pGTSTD->saved_TIO ); memcpy( &pGTSTD->curr_TIO, &pGTSTD->saved_TIO, sizeof( struct termios ) ); /* atexit( restore_input_mode ); */ pGTSTD->curr_TIO.c_lflag &= ~( ICANON | ECHO ); pGTSTD->curr_TIO.c_iflag &= ~ICRNL; pGTSTD->curr_TIO.c_cc[ VMIN ] = 0; pGTSTD->curr_TIO.c_cc[ VTIME ] = 0; tcsetattr( pGTSTD->hStdin, TCSAFLUSH, &pGTSTD->curr_TIO ); #if defined( SIGTTOU ) act.sa_handler = SIG_DFL; sigaction( SIGTTOU, &old, NULL ); #endif pGTSTD->fRestTTY = s_fRestTTY; } #ifdef TIOCGWINSZ if( pGTSTD->fStdoutConsole ) { struct winsize win; if( ioctl( pGTSTD->hStdout, TIOCGWINSZ, ( char * ) &win ) != -1 ) { HB_GTSELF_RESIZE( pGT, win.ws_row, win.ws_col ); } } #endif #elif defined( HB_WIN32_IO ) && ! defined( HB_WINCE ) if( pGTSTD->fStdinConsole ) { SetConsoleMode( ( HANDLE ) hb_fsGetOsHandle( pGTSTD->hStdin ), 0x0000 ); } #endif HB_GTSELF_SETFLAG( pGT, HB_GTI_STDOUTCON, pGTSTD->fStdoutConsole ); HB_GTSELF_SETFLAG( pGT, HB_GTI_STDERRCON, pGTSTD->fStderrConsole ); }
static void hb_gt_std_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_FHANDLE hFilenoStderr ) { PHB_GTSTD pGTSTD; HB_TRACE( HB_TR_DEBUG, ( "hb_gt_std_Init(%p,%p,%p,%p)", pGT, ( void * ) ( HB_PTRUINT ) hFilenoStdin, ( void * ) ( HB_PTRUINT ) hFilenoStdout, ( void * ) ( HB_PTRUINT ) hFilenoStderr ) ); HB_GTLOCAL( pGT ) = pGTSTD = ( PHB_GTSTD ) hb_xgrabz( sizeof( HB_GTSTD ) ); pGTSTD->hStdin = hFilenoStdin; pGTSTD->hStdout = hFilenoStdout; pGTSTD->hStderr = hFilenoStderr; pGTSTD->fStdinConsole = hb_fsIsDevice( pGTSTD->hStdin ); pGTSTD->fStdoutConsole = hb_fsIsDevice( pGTSTD->hStdout ); pGTSTD->fStderrConsole = hb_fsIsDevice( pGTSTD->hStderr ); pGTSTD->szCrLf = hb_strdup( hb_conNewLine() ); pGTSTD->nCrLf = strlen( pGTSTD->szCrLf ); hb_fsSetDevMode( pGTSTD->hStdout, FD_BINARY ); HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); /* SA_NOCLDSTOP in #if is a hack to detect POSIX compatible environment */ #if defined( HB_HAS_TERMIOS ) && \ defined( SA_NOCLDSTOP ) if( pGTSTD->fStdinConsole ) { #if defined( SIGTTOU ) struct sigaction act, old; /* if( pGTSTD->saved_TIO.c_lflag & TOSTOP ) != 0 */ sigaction( SIGTTOU, NULL, &old ); memcpy( &act, &old, sizeof( struct sigaction ) ); act.sa_handler = sig_handler; /* do not use SA_RESTART - new Linux kernels will repeat the operation */ #if defined( SA_ONESHOT ) act.sa_flags = SA_ONESHOT; #elif defined( SA_RESETHAND ) act.sa_flags = SA_RESETHAND; #else act.sa_flags = 0; #endif sigaction( SIGTTOU, &act, 0 ); #endif s_fRestTTY = HB_TRUE; tcgetattr( pGTSTD->hStdin, &pGTSTD->saved_TIO ); memcpy( &pGTSTD->curr_TIO, &pGTSTD->saved_TIO, sizeof( struct termios ) ); /* atexit( restore_input_mode ); */ pGTSTD->curr_TIO.c_lflag &= ~( ICANON | ECHO ); pGTSTD->curr_TIO.c_iflag &= ~ICRNL; #if 0 pGTSTD->curr_TIO.c_cc[ VMIN ] = 0; #else /* workaround for bug in some Linux kernels (i.e. 3.13.0-64-generic Ubuntu) in which select() unconditionally accepts stdin for reading if c_cc[ VMIN ] = 0 [druzus] */ pGTSTD->curr_TIO.c_cc[ VMIN ] = 1; #endif pGTSTD->curr_TIO.c_cc[ VTIME ] = 0; tcsetattr( pGTSTD->hStdin, TCSAFLUSH, &pGTSTD->curr_TIO ); #if defined( SIGTTOU ) act.sa_handler = SIG_DFL; sigaction( SIGTTOU, &old, NULL ); #endif pGTSTD->fRestTTY = s_fRestTTY; } #ifdef TIOCGWINSZ if( pGTSTD->fStdoutConsole ) { struct winsize win; if( ioctl( pGTSTD->hStdout, TIOCGWINSZ, ( char * ) &win ) != -1 ) { HB_GTSELF_RESIZE( pGT, win.ws_row, win.ws_col ); } } #endif #elif defined( HB_OS_WIN ) && ! defined( HB_OS_WIN_CE ) if( pGTSTD->fStdinConsole ) { SetConsoleMode( ( HANDLE ) hb_fsGetOsHandle( pGTSTD->hStdin ), 0x0000 ); } #endif HB_GTSELF_SETFLAG( pGT, HB_GTI_STDOUTCON, pGTSTD->fStdoutConsole ); HB_GTSELF_SETFLAG( pGT, HB_GTI_STDERRCON, pGTSTD->fStderrConsole && pGTSTD->fStdoutConsole ); }