diff options
Diffstat (limited to 'src/sys')
-rw-r--r-- | src/sys/con_tty.c | 7 | ||||
-rw-r--r-- | src/sys/sys_main.c | 1 | ||||
-rw-r--r-- | src/sys/sys_unix.c | 40 |
3 files changed, 33 insertions, 15 deletions
diff --git a/src/sys/con_tty.c b/src/sys/con_tty.c index 547521c7..e4b2ad5c 100644 --- a/src/sys/con_tty.c +++ b/src/sys/con_tty.c @@ -42,6 +42,7 @@ called before and after a stdout or stderr output ============================================================= */ +extern qboolean stdinIsATTY; static qboolean stdin_active; // general flag to tell about tty console mode static qboolean ttycon_on = qfalse; @@ -270,21 +271,19 @@ Initialize the console input (tty mode if possible) void CON_Init( void ) { struct termios tc; - const char* term = getenv("TERM"); // If the process is backgrounded (running non interactively) // then SIGTTIN or SIGTOU is emitted, if not caught, turns into a SIGSTP signal(SIGTTIN, SIG_IGN); signal(SIGTTOU, SIG_IGN); - + // If SIGCONT is received, reinitialize console signal(SIGCONT, CON_SigCont); // Make stdin reads non-blocking fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK ); - if (isatty(STDIN_FILENO) != 1 - || (term && (!strcmp(term, "raw") || !strcmp(term, "dumb")))) + if (!stdinIsATTY) { Com_Printf("tty console mode disabled\n"); ttycon_on = qfalse; diff --git a/src/sys/sys_main.c b/src/sys/sys_main.c index 9fadfa06..f76cb014 100644 --- a/src/sys/sys_main.c +++ b/src/sys/sys_main.c @@ -558,6 +558,7 @@ int main( int argc, char **argv ) signal( SIGFPE, Sys_SigHandler ); signal( SIGSEGV, Sys_SigHandler ); signal( SIGTERM, Sys_SigHandler ); + signal( SIGINT, Sys_SigHandler ); while( 1 ) { diff --git a/src/sys/sys_unix.c b/src/sys/sys_unix.c index 7863c082..ccff6312 100644 --- a/src/sys/sys_unix.c +++ b/src/sys/sys_unix.c @@ -38,6 +38,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include <libgen.h> #include <fcntl.h> +qboolean stdinIsATTY; + // Used to determine where to store user-specific files static char homePath[ MAX_OSPATH ] = { 0 }; @@ -355,7 +357,7 @@ char **Sys_ListFiles( const char *directory, const char *extension, char *filter } extLen = strlen( extension ); - + // search nfiles = 0; @@ -465,24 +467,35 @@ Block execution for msec or until input is recieved. */ void Sys_Sleep( int msec ) { - fd_set fdset; - if( msec == 0 ) return; - FD_ZERO(&fdset); - FD_SET(fileno(stdin), &fdset); - if( msec < 0 ) + if( stdinIsATTY ) { - select((fileno(stdin) + 1), &fdset, NULL, NULL, NULL); + fd_set fdset; + + FD_ZERO(&fdset); + FD_SET(STDIN_FILENO, &fdset); + if( msec < 0 ) + { + select(STDIN_FILENO + 1, &fdset, NULL, NULL, NULL); + } + else + { + struct timeval timeout; + + timeout.tv_sec = msec/1000; + timeout.tv_usec = (msec%1000)*1000; + select(STDIN_FILENO + 1, &fdset, NULL, NULL, &timeout); + } } else { - struct timeval timeout; + // With nothing to select() on, we can't wait indefinitely + if( msec < 0 ) + msec = 10; - timeout.tv_sec = msec/1000; - timeout.tv_usec = (msec%1000)*1000; - select((fileno(stdin) + 1), &fdset, NULL, NULL, &timeout); + usleep( msec * 1000 ); } } @@ -572,11 +585,16 @@ Unix specific initialisation */ void Sys_PlatformInit( void ) { + const char* term = getenv( "TERM" ); + signal( SIGHUP, Sys_SigHandler ); signal( SIGQUIT, Sys_SigHandler ); signal( SIGTRAP, Sys_SigHandler ); signal( SIGIOT, Sys_SigHandler ); signal( SIGBUS, Sys_SigHandler ); + + stdinIsATTY = isatty( STDIN_FILENO ) && + !( term && ( !strcmp( term, "raw" ) || !strcmp( term, "dumb" ) ) ); } /* |