summaryrefslogtreecommitdiff
path: root/src/sys
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys')
-rw-r--r--src/sys/con_tty.c7
-rw-r--r--src/sys/sys_main.c1
-rw-r--r--src/sys/sys_unix.c40
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" ) ) );
}
/*