summaryrefslogtreecommitdiff
path: root/source/sys_unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/sys_unix.c')
-rw-r--r--source/sys_unix.c702
1 files changed, 351 insertions, 351 deletions
diff --git a/source/sys_unix.c b/source/sys_unix.c
index 05b665a..ea46b53 100644
--- a/source/sys_unix.c
+++ b/source/sys_unix.c
@@ -54,16 +54,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#endif
#include "sys_public.h"
-cvar_t *sys_basedir;
+cvar_t *sys_basedir;
cvar_t *sys_libdir;
cvar_t *sys_homedir;
-cvar_t *sys_stdio;
cvar_t *sys_parachute;
-static qboolean tty_enabled;
-static struct termios tty_orig;
-static commandPrompt_t tty_prompt;
-static int tty_hidden;
/*
===============================================================================
@@ -73,60 +68,51 @@ TERMINAL SUPPORT
===============================================================================
*/
-static void Sys_ConsoleWrite( char *data, int count ) {
- int ret;
+#if USE_SYSCON
- while( count ) {
- ret = write( 1, data, count );
- if( ret <= 0 ) {
- //Com_Error( ERR_FATAL, "%s: %d bytes written: %s",
- // __func__, ret, strerror( errno ) );
- break;
- }
- count -= ret;
- data += ret;
- }
-}
+cvar_t *sys_console;
-static void Sys_HideInput( void ) {
- int i;
+static qboolean tty_enabled;
+static struct termios tty_orig;
+static commandPrompt_t tty_prompt;
+static int tty_hidden;
- if( !tty_enabled ) {
- return;
- }
+static void tty_hide_input( void ) {
+ int i;
- if( !tty_hidden ) {
- for( i = 0; i <= tty_prompt.inputLine.cursorPos; i++ ) {
- Sys_ConsoleWrite( "\b \b", 3 );
- }
- }
- tty_hidden++;
+ if( !tty_hidden ) {
+ for( i = 0; i <= tty_prompt.inputLine.cursorPos; i++ ) {
+ write( 1, "\b \b", 3 );
+ }
+ }
+ tty_hidden++;
}
-static void Sys_ShowInput( void ) {
- if( !tty_enabled ) {
+static void tty_show_input( void ) {
+ if( !tty_hidden ) {
return;
}
- if( !tty_hidden ) {
- Com_EPrintf( "Sys_ShowInput: not hidden\n" );
- return;
- }
-
- tty_hidden--;
- if( !tty_hidden ) {
- Sys_ConsoleWrite( "]", 1 );
- Sys_ConsoleWrite( tty_prompt.inputLine.text,
+ tty_hidden--;
+ if( !tty_hidden ) {
+ write( 1, "]", 1 );
+ write( 1, tty_prompt.inputLine.text,
tty_prompt.inputLine.cursorPos );
- }
+ }
}
-static void Sys_InitTTY( void ) {
+static void tty_init_input( void ) {
struct termios tty;
#ifdef TIOCGWINSZ
struct winsize ws;
#endif
int width;
+
+ if( !isatty( 0 ) || !isatty( 1 ) ) {
+ Com_Printf( "stdin/stdout don't both refer to a TTY\n" );
+ Cvar_Set( "sys_console", "1" );
+ return;
+ }
tcgetattr( 0, &tty_orig );
tty = tty_orig;
@@ -155,62 +141,29 @@ static void Sys_InitTTY( void ) {
}
IF_Init( &tty_prompt.inputLine, width, width );
- Sys_ConsoleWrite( " ", 1 );
+ // display command prompt
+ write( 1, "]", 1 );
}
-static void Sys_ShutdownTTY( void ) {
+static void tty_shutdown_input( void ) {
if( tty_enabled ) {
- Sys_HideInput();
- Sys_RunConsole();
+ tty_hide_input();
tcsetattr( 0, TCSADRAIN, &tty_orig );
}
}
+static const char color_to_ansi[8] = {
+ '0', '1', '2', '3', '4', '6', '5', '7' };
-static const char color_to_ansi[8] = { '0', '1', '2', '3', '4', '6', '5', '7' };
-
-/*
-=================
-Sys_ConsoleOutput
-=================
-*/
-void Sys_ConsoleOutput( const char *string ) {
- char buffer[MAXPRINTMSG*2];
- char *m, *p;
+static void tty_write_output( const char *text ) {
+ char buffer[MAXPRINTMSG];
+ char *p = buffer, *m = buffer + sizeof( buffer );
int c, color = 0;
- p = buffer;
- m = buffer + sizeof( buffer );
-
- if( !tty_enabled ) {
- while( *string ) {
- if( Q_IsColorString( string ) ) {
- string += 2;
- continue;
- }
- if( p + 1 > m ) {
- break;
- }
- c = *string++;
- if( c & 128 ) {
- c &= 127;
- if( c < 32 ) {
- continue;
- }
- }
- *p++ = c;
- }
-
- Sys_ConsoleWrite( buffer, p - buffer );
- return;
- }
-
- Sys_HideInput();
-
- while( *string ) {
- if( Q_IsColorString( string ) ) {
- color = string[1];
- string += 2;
+ while( *text ) {
+ if( Q_IsColorString( text ) ) {
+ color = text[1];
+ text += 2;
if( p + 5 > m ) {
break;
}
@@ -236,7 +189,7 @@ void Sys_ConsoleOutput( const char *string ) {
if( p + 1 > m ) {
break;
}
- c = *string++;
+ c = *text++;
if( c & 128 ) {
c &= 127;
if( c < 32 ) {
@@ -257,54 +210,93 @@ void Sys_ConsoleOutput( const char *string ) {
p += 4;
}
- Sys_ConsoleWrite( buffer, p - buffer );
-
- Sys_ShowInput();
+ write( 1, buffer, p - buffer );
+}
+
+static void simple_write_output( const char *text ) {
+ char buffer[MAXPRINTMSG];
+ char *p = buffer, *m = buffer + sizeof( buffer );
+ int c;
+
+ while( *text ) {
+ if( Q_IsColorString( text ) ) {
+ text += 2;
+ continue;
+ }
+ if( p + 1 > m ) {
+ break;
+ }
+ c = *text++;
+ if( c & 128 ) {
+ c &= 127;
+ if( c < 32 ) {
+ continue;
+ }
+ }
+ *p++ = c;
+ }
+
+ write( 1, buffer, p - buffer );
+}
+
+/*
+=================
+Sys_ConsoleOutput
+=================
+*/
+void Sys_ConsoleOutput( const char *text ) {
+ if( !sys_console || !sys_console->integer ) {
+ return;
+ }
+
+ if( !tty_enabled ) {
+ simple_write_output( text );
+ return;
+ }
+
+ tty_hide_input();
+ tty_write_output( text );
+ tty_show_input();
}
void Sys_SetConsoleTitle( const char *title ) {
char buffer[MAX_STRING_CHARS];
size_t len;
- if( !tty_enabled ) {
+ if( !tty_enabled ) {
return;
}
len = Q_snprintf( buffer, sizeof( buffer ), "\033]0;%s\007", title );
if( len < sizeof( buffer ) ) {
- Sys_ConsoleWrite( buffer, len );
+ write( 1, buffer, len );
}
}
/*
=================
-Sys_ParseInput
+tty_parse_input
=================
*/
-static void Sys_ParseInput( const char *text ) {
- inputField_t *f;
- char *s;
+static void tty_parse_input( const char *text ) {
+ inputField_t *f;
+ char *s;
int i, key;
- if( !tty_enabled ) {
- Cbuf_AddText( text );
- return;
- }
-
- f = &tty_prompt.inputLine;
+ f = &tty_prompt.inputLine;
while( *text ) {
key = *text++;
if( key == tty_orig.c_cc[VERASE] || key == 127 || key == 8 ) {
if( f->cursorPos ) {
f->text[--f->cursorPos] = 0;
- Sys_ConsoleWrite( "\b \b", 3 );
+ write( 1, "\b \b", 3 );
}
continue;
}
if( key == tty_orig.c_cc[VKILL] ) {
for( i = 0; i < f->cursorPos; i++ ) {
- Sys_ConsoleWrite( "\b \b", 3 );
+ write( 1, "\b \b", 3 );
}
f->cursorPos = 0;
continue;
@@ -312,11 +304,11 @@ static void Sys_ParseInput( const char *text ) {
if( key >= 32 ) {
if( f->cursorPos == f->maxChars - 1 ) {
- Sys_ConsoleWrite( va( "\b \b%c", key ), 4 );
+ write( 1, va( "\b \b%c", key ), 4 );
f->text[f->cursorPos+0] = key;
f->text[f->cursorPos+1] = 0;
} else {
- Sys_ConsoleWrite( va( "%c", key ), 1 );
+ write( 1, va( "%c", key ), 1 );
f->text[f->cursorPos+0] = key;
f->text[f->cursorPos+1] = 0;
f->cursorPos++;
@@ -325,7 +317,7 @@ static void Sys_ParseInput( const char *text ) {
}
if( key == '\n' ) {
- Sys_HideInput();
+ tty_hide_input();
s = Prompt_Action( &tty_prompt );
if( s ) {
if( *s == '\\' || *s == '/' ) {
@@ -334,18 +326,18 @@ static void Sys_ParseInput( const char *text ) {
Sys_Printf( "]%s\n", s );
Cbuf_AddText( s );
} else {
- Sys_ConsoleWrite( "]\n", 2 );
+ write( 1, "]\n", 2 );
}
- Sys_ShowInput();
+ tty_show_input();
continue;
}
if( key == '\t' ) {
//Con_Print(va("before=%d (%s)\n",tty_prompt.inputLine.cursorPos,tty_prompt.inputLine.text) );
- Sys_HideInput();
+ tty_hide_input();
Prompt_CompleteCommand( &tty_prompt, qfalse );
f->cursorPos = strlen( f->text ); // FIXME
- Sys_ShowInput();
+ tty_show_input();
//Con_Print(va("after=%d (%s)\n",tty_prompt.inputLine.cursorPos,tty_prompt.inputLine.text) );
continue;
}
@@ -358,14 +350,14 @@ static void Sys_ParseInput( const char *text ) {
key = *text++;
switch( key ) {
case 'A':
- Sys_HideInput();
+ tty_hide_input();
Prompt_HistoryUp( &tty_prompt );
- Sys_ShowInput();
+ tty_show_input();
break;
case 'B':
- Sys_HideInput();
+ tty_hide_input();
Prompt_HistoryDown( &tty_prompt );
- Sys_ShowInput();
+ tty_show_input();
break;
#if 0
case 'C':
@@ -389,12 +381,12 @@ static void Sys_ParseInput( const char *text ) {
}
void Sys_RunConsole( void ) {
- fd_set fd;
+ fd_set fd;
struct timeval tv;
char text[MAX_STRING_CHARS];
int ret;
- if( !sys_stdio->integer ) {
+ if( !sys_console || !sys_console->integer ) {
return;
}
@@ -414,8 +406,8 @@ void Sys_RunConsole( void ) {
ret = read( 0, text, sizeof( text ) - 1 );
if( !ret ) {
Com_DPrintf( "Read EOF from stdin.\n" );
- Sys_ShutdownTTY();
- Cvar_Set( "sys_stdio", "0" );
+ tty_shutdown_input();
+ Cvar_Set( "sys_console", "0" );
return;
}
if( ret < 0 ) {
@@ -427,9 +419,16 @@ void Sys_RunConsole( void ) {
}
text[ret] = 0;
- Sys_ParseInput( text );
+ if( !tty_enabled ) {
+ Cbuf_AddText( text );
+ return;
+ }
+
+ tty_parse_input( text );
}
+#endif // USE_SYSCON
+
/*
===============================================================================
@@ -441,13 +440,13 @@ HUNK
void Hunk_Begin( mempool_t *pool, size_t maxsize ) {
void *buf;
- // reserve a huge chunk of memory, but don't commit any yet
- pool->maxsize = ( maxsize + 4095 ) & ~4095;
- pool->cursize = 0;
+ // reserve a huge chunk of memory, but don't commit any yet
+ pool->maxsize = ( maxsize + 4095 ) & ~4095;
+ pool->cursize = 0;
buf = mmap( NULL, pool->maxsize, PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANON, -1, 0 );
- if( buf == NULL || buf == ( void * )-1 ) {
- Com_Error( ERR_FATAL, "%s: unable to reserve %"PRIz" bytes: %s",
+ MAP_PRIVATE|MAP_ANON, -1, 0 );
+ if( buf == NULL || buf == ( void * )-1 ) {
+ Com_Error( ERR_FATAL, "%s: unable to reserve %"PRIz" bytes: %s",
__func__, pool->maxsize, strerror( errno ) );
}
pool->base = buf;
@@ -455,49 +454,49 @@ void Hunk_Begin( mempool_t *pool, size_t maxsize ) {
}
void *Hunk_Alloc( mempool_t *pool, size_t size ) {
- void *buf;
+ void *buf;
- // round to cacheline
- size = ( size + 31 ) & ~31;
- if( pool->cursize + size > pool->maxsize ) {
- Com_Error( ERR_FATAL, "%s: unable to allocate %"PRIz" bytes out of %"PRIz,
+ // round to cacheline
+ size = ( size + 31 ) & ~31;
+ if( pool->cursize + size > pool->maxsize ) {
+ Com_Error( ERR_FATAL, "%s: unable to allocate %"PRIz" bytes out of %"PRIz,
__func__, size, pool->maxsize );
}
- buf = ( byte * )pool->base + pool->cursize;
- pool->cursize += size;
- return buf;
+ buf = ( byte * )pool->base + pool->cursize;
+ pool->cursize += size;
+ return buf;
}
void Hunk_End( mempool_t *pool ) {
- size_t newsize = ( pool->cursize + 4095 ) & ~4095;
+ size_t newsize = ( pool->cursize + 4095 ) & ~4095;
- if( newsize > pool->maxsize ) {
- Com_Error( ERR_FATAL, "%s: newsize > maxsize", __func__ );
+ if( newsize > pool->maxsize ) {
+ Com_Error( ERR_FATAL, "%s: newsize > maxsize", __func__ );
}
- if( newsize < pool->maxsize ) {
+ if( newsize < pool->maxsize ) {
#ifdef _GNU_SOURCE
- void *buf = mremap( pool->base, pool->maxsize, newsize, 0 );
+ void *buf = mremap( pool->base, pool->maxsize, newsize, 0 );
#else
- void *unmap_base = ( byte * )pool->base + newsize;
- size_t unmap_len = pool->maxsize - newsize;
- void *buf = munmap( unmap_base, unmap_len ) + pool->base;
+ void *unmap_base = ( byte * )pool->base + newsize;
+ size_t unmap_len = pool->maxsize - newsize;
+ void *buf = munmap( unmap_base, unmap_len ) + pool->base;
#endif
if( buf != pool->base ) {
Com_Error( ERR_FATAL, "%s: could not remap virtual block: %s",
__func__, strerror( errno ) );
}
- }
+ }
pool->mapped = newsize;
}
void Hunk_Free( mempool_t *pool ) {
- if( pool->base ) {
- if( munmap( pool->base, pool->mapped ) ) {
- Com_Error( ERR_FATAL, "%s: munmap failed: %s",
+ if( pool->base ) {
+ if( munmap( pool->base, pool->mapped ) ) {
+ Com_Error( ERR_FATAL, "%s: munmap failed: %s",
__func__, strerror( errno ) );
}
- }
+ }
memset( pool, 0, sizeof( *pool ) );
}
@@ -514,12 +513,12 @@ void Sys_DebugBreak( void ) {
}
unsigned Sys_Milliseconds( void ) {
- struct timeval tp;
+ struct timeval tp;
unsigned time;
- gettimeofday( &tp, NULL );
- time = tp.tv_sec * 1000 + tp.tv_usec / 1000;
- return time;
+ gettimeofday( &tp, NULL );
+ time = tp.tv_sec * 1000 + tp.tv_usec / 1000;
+ return time;
}
/*
@@ -528,43 +527,43 @@ Sys_GetPathInfo
================
*/
qboolean Sys_GetPathInfo( const char *path, fsFileInfo_t *info ) {
- struct stat st;
+ struct stat st;
- if( stat( path, &st ) == -1 ) {
- return qfalse;
- }
+ if( stat( path, &st ) == -1 ) {
+ return qfalse;
+ }
if( !S_ISREG( st.st_mode ) ) {
return qfalse;
}
- if( info ) {
- info->size = st.st_size;
- info->ctime = st.st_ctime;
- info->mtime = st.st_mtime;
- }
+ if( info ) {
+ info->size = st.st_size;
+ info->ctime = st.st_ctime;
+ info->mtime = st.st_mtime;
+ }
- return qtrue;
+ return qtrue;
}
qboolean Sys_GetFileInfo( FILE *fp, fsFileInfo_t *info ) {
- struct stat st;
+ struct stat st;
- if( fstat( fileno( fp ), &st ) == -1 ) {
- return qfalse;
- }
+ if( fstat( fileno( fp ), &st ) == -1 ) {
+ return qfalse;
+ }
if( !S_ISREG( st.st_mode ) ) {
return qfalse;
}
- if( info ) {
- info->size = st.st_size;
- info->ctime = st.st_ctime;
- info->mtime = st.st_mtime;
- }
+ if( info ) {
+ info->size = st.st_size;
+ info->ctime = st.st_ctime;
+ info->mtime = st.st_mtime;
+ }
- return qtrue;
+ return qtrue;
}
/*
@@ -573,8 +572,10 @@ Sys_Quit
=================
*/
void Sys_Quit( void ) {
- Sys_ShutdownTTY();
- exit( 0 );
+#if USE_SYSCON
+ tty_shutdown_input();
+#endif
+ exit( 0 );
}
/*
@@ -583,11 +584,11 @@ Sys_GetCurrentDirectory
=================
*/
char *Sys_GetCurrentDirectory( void ) {
- static char curpath[MAX_OSPATH];
+ static char curpath[MAX_OSPATH];
- getcwd( curpath, sizeof( curpath ) );
+ getcwd( curpath, sizeof( curpath ) );
- return curpath;
+ return curpath;
}
void Sys_AddDefaultConfig( void ) {
@@ -635,11 +636,11 @@ void Sys_FixFPCW( void ) {
Com_DPrintf( "FPU control word: %x\n", cw );
if( cw & 0x300 ) {
- Com_Printf( "Setting FPU to single precision mode\n" );
+ Com_DPrintf( "Setting FPU to single precision mode\n" );
cw &= ~0x300;
}
if( cw & 0xC00 ) {
- Com_Printf( "Setting FPU to round to nearest mode\n" );
+ Com_DPrintf( "Setting FPU to round to nearest mode\n" );
cw &= ~0xC00;
}
@@ -647,36 +648,28 @@ void Sys_FixFPCW( void ) {
#endif
}
-/*
-=================
-Sys_Term
-=================
-*/
-static void Sys_Term( int signum ) {
+static void term_handler( int signum ) {
#ifdef _GNU_SOURCE
- Com_Printf( "%s\n", strsignal( signum ) );
+ Com_Printf( "%s\n", strsignal( signum ) );
#else
- Com_Printf( "Received signal %d, exiting\n", signum );
+ Com_Printf( "Received signal %d, exiting\n", signum );
#endif
- Com_Quit( NULL );
+ Com_Quit( NULL );
}
-/*
-=================
-Sys_Kill
-=================
-*/
-static void Sys_Kill( int signum ) {
- Sys_ShutdownTTY();
+static void kill_handler( int signum ) {
+#if USE_SYSCON
+ tty_shutdown_input();
+#endif
#if USE_CLIENT && USE_REF
VID_FatalShutdown();
#endif
#ifdef _GNU_SOURCE
- fprintf( stderr, "%s\n", strsignal( signum ) );
+ fprintf( stderr, "%s\n", strsignal( signum ) );
#else
- fprintf( stderr, "Received signal %d, aborting\n", signum );
+ fprintf( stderr, "Received signal %d, aborting\n", signum );
#endif
exit( 1 );
@@ -690,17 +683,17 @@ Sys_Init
void Sys_Init( void ) {
char *homedir;
- signal( SIGTERM, Sys_Term );
- signal( SIGINT, Sys_Term );
- signal( SIGTTIN, SIG_IGN );
- signal( SIGTTOU, SIG_IGN );
+ signal( SIGTERM, term_handler );
+ signal( SIGINT, term_handler );
+ signal( SIGTTIN, SIG_IGN );
+ signal( SIGTTOU, SIG_IGN );
- // basedir <path>
- // allows the game to run from outside the data tree
- sys_basedir = Cvar_Get( "basedir", DATADIR, CVAR_NOSET );
+ // basedir <path>
+ // allows the game to run from outside the data tree
+ sys_basedir = Cvar_Get( "basedir", DATADIR, CVAR_NOSET );
- // homedir <path>
- // specifies per-user writable directory for demos, screenshots, etc
+ // homedir <path>
+ // specifies per-user writable directory for demos, screenshots, etc
if( HOMEDIR[0] == '~' ) {
char *s = getenv( "HOME" );
if( s && *s ) {
@@ -711,57 +704,62 @@ void Sys_Init( void ) {
} else {
homedir = HOMEDIR;
}
- sys_homedir = Cvar_Get( "homedir", homedir, CVAR_NOSET );
- sys_libdir = Cvar_Get( "libdir", LIBDIR, CVAR_NOSET );
+ sys_homedir = Cvar_Get( "homedir", homedir, CVAR_NOSET );
+ sys_libdir = Cvar_Get( "libdir", LIBDIR, CVAR_NOSET );
- sys_stdio = Cvar_Get( "sys_stdio", "2", CVAR_NOSET );
- sys_parachute = Cvar_Get( "sys_parachute", "1", CVAR_NOSET );
+#if USE_SYSCON
+ // we want TTY support enabled if started from terminal,
+ // but don't want any output by default if launched without one
+ // (from X session for example)
+ sys_console = Cvar_Get( "sys_console", isatty( 0 ) &&
+ isatty( 1 ) ? "2" : "0", CVAR_NOSET );
- if( sys_stdio->integer > 0 ) {
+ if( sys_console->integer > 0 ) {
// change stdin to non-blocking and stdout to blocking
fcntl( 0, F_SETFL, fcntl( 0, F_GETFL, 0 ) | FNDELAY );
fcntl( 1, F_SETFL, fcntl( 1, F_GETFL, 0 ) & ~FNDELAY );
- // init TTY support
- if( sys_stdio->integer > 1 ) {
- if( isatty( 0 ) == 1 ) {
- Sys_InitTTY();
- } else {
- Com_DPrintf( "stdin in not a tty, tty input disabled.\n" );
- Cvar_Set( "sys_stdio", "1" );
- }
+ // init optional TTY support
+ if( sys_console->integer > 1 ) {
+ tty_init_input();
}
- signal( SIGHUP, Sys_Term );
- } else {
- signal( SIGHUP, SIG_IGN );
+ signal( SIGHUP, term_handler );
+ } else
+#endif
+ {
+ signal( SIGHUP, SIG_IGN );
}
+ sys_parachute = Cvar_Get( "sys_parachute", "1", CVAR_NOSET );
+
if( sys_parachute->integer ) {
// perform some cleanup when crashing
- signal( SIGSEGV, Sys_Kill );
- signal( SIGILL, Sys_Kill );
- signal( SIGFPE, Sys_Kill );
- signal( SIGTRAP, Sys_Kill );
+ signal( SIGSEGV, kill_handler );
+ signal( SIGILL, kill_handler );
+ signal( SIGFPE, kill_handler );
+ signal( SIGTRAP, kill_handler );
}
Sys_FixFPCW();
}
+#if USE_SYSCON
/*
================
Sys_Printf
================
*/
void Sys_Printf( const char *fmt, ... ) {
- va_list argptr;
- char msg[MAXPRINTMSG];
+ va_list argptr;
+ char msg[MAXPRINTMSG];
- va_start( argptr, fmt );
- Q_vsnprintf( msg, sizeof( msg ), fmt, argptr );
- va_end( argptr );
+ va_start( argptr, fmt );
+ Q_vsnprintf( msg, sizeof( msg ), fmt, argptr );
+ va_end( argptr );
Sys_ConsoleOutput( msg );
}
+#endif
/*
=================
@@ -772,7 +770,9 @@ void Sys_Error( const char *error, ... ) {
va_list argptr;
char text[MAXPRINTMSG];
- Sys_ShutdownTTY();
+#if USE_SYSCON
+ tty_shutdown_input();
+#endif
#if USE_CLIENT && USE_REF
VID_FatalShutdown();
@@ -813,32 +813,32 @@ Sys_LoadLibrary
=================
*/
void *Sys_LoadLibrary( const char *path, const char *sym, void **handle ) {
- void *module, *entry;
+ void *module, *entry;
- *handle = NULL;
+ *handle = NULL;
- module = dlopen( path, RTLD_NOW );
- if( !module ) {
- Com_DPrintf( "%s failed: %s\n", __func__, dlerror() );
- return NULL;
- }
+ module = dlopen( path, RTLD_LAZY );
+ if( !module ) {
+ Com_DPrintf( "%s failed: %s\n", __func__, dlerror() );
+ return NULL;
+ }
- entry = dlsym( module, sym );
- if( !entry ) {
- Com_DPrintf( "%s failed: %s\n", __func__, dlerror() );
- dlclose( module );
- return NULL;
- }
+ entry = dlsym( module, sym );
+ if( !entry ) {
+ Com_DPrintf( "%s failed: %s\n", __func__, dlerror() );
+ dlclose( module );
+ return NULL;
+ }
- Com_DPrintf( "%s succeeded: %s\n", __func__, path );
+ Com_DPrintf( "%s succeeded: %s\n", __func__, path );
- *handle = module;
+ *handle = module;
- return entry;
+ return entry;
}
void *Sys_GetProcAddress( void *handle, const char *sym ) {
- return dlsym( handle, sym );
+ return dlsym( handle, sym );
}
/*
@@ -862,20 +862,20 @@ static void Sys_ListFilteredFiles( void **listedFiles,
size_t baselen,
int depth )
{
- struct dirent *findInfo;
- DIR *findHandle;
+ struct dirent *findInfo;
+ DIR *findHandle;
struct stat st;
- char findPath[MAX_OSPATH];
- char *name;
+ char findPath[MAX_OSPATH];
+ char *name;
size_t len;
if( depth >= 32 ) {
return;
}
- if( *count >= MAX_LISTED_FILES ) {
- return;
- }
+ if( *count >= MAX_LISTED_FILES ) {
+ return;
+ }
if( ( findHandle = opendir( path ) ) == NULL ) {
return;
@@ -898,43 +898,43 @@ static void Sys_ListFilteredFiles( void **listedFiles,
continue;
}
- if( st.st_mode & S_IFDIR ) {
- Sys_ListFilteredFiles( listedFiles, count, findPath,
+ if( st.st_mode & S_IFDIR ) {
+ Sys_ListFilteredFiles( listedFiles, count, findPath,
filter, flags, baselen, depth + 1 );
- }
-
- if( ( flags & FS_SEARCHDIRS_MASK ) == FS_SEARCHDIRS_ONLY ) {
- if( !( st.st_mode & S_IFDIR ) ) {
- continue;
- }
- } else if( ( flags & FS_SEARCHDIRS_MASK ) == FS_SEARCHDIRS_NO ) {
- if( st.st_mode & S_IFDIR ) {
- continue;
- }
- }
-
- if( !FS_WildCmp( filter, findPath + baselen ) ) {
- continue;
- }
+ }
+
+ if( ( flags & FS_SEARCHDIRS_MASK ) == FS_SEARCHDIRS_ONLY ) {
+ if( !( st.st_mode & S_IFDIR ) ) {
+ continue;
+ }
+ } else if( ( flags & FS_SEARCHDIRS_MASK ) == FS_SEARCHDIRS_NO ) {
+ if( st.st_mode & S_IFDIR ) {
+ continue;
+ }
+ }
+
+ if( !FS_WildCmp( filter, findPath + baselen ) ) {
+ continue;
+ }
if( flags & FS_SEARCH_SAVEPATH ) {
- name = findPath + baselen;
+ name = findPath + baselen;
} else {
name = findInfo->d_name;
}
- if( flags & FS_SEARCH_EXTRAINFO ) {
- listedFiles[( *count )++] = FS_CopyInfo( name,
+ if( flags & FS_SEARCH_EXTRAINFO ) {
+ listedFiles[( *count )++] = FS_CopyInfo( name,
st.st_size, st.st_ctime, st.st_mtime );
- } else {
- listedFiles[( *count )++] = FS_CopyString( name );
- }
+ } else {
+ listedFiles[( *count )++] = FS_CopyString( name );
+ }
if( *count >= MAX_LISTED_FILES ) {
break;
}
- }
+ }
- closedir( findHandle );
+ closedir( findHandle );
}
@@ -949,87 +949,87 @@ void **Sys_ListFiles( const char *path,
size_t baselen,
int *numFiles )
{
- struct dirent *findInfo;
- DIR *findHandle;
- struct stat st;
- char findPath[MAX_OSPATH];
- void *listedFiles[MAX_LISTED_FILES];
- int count = 0;
+ struct dirent *findInfo;
+ DIR *findHandle;
+ struct stat st;
+ char findPath[MAX_OSPATH];
+ void *listedFiles[MAX_LISTED_FILES];
+ int count = 0;
char *s;
size_t len;
- if( numFiles ) {
- *numFiles = 0;
- }
+ if( numFiles ) {
+ *numFiles = 0;
+ }
- if( flags & FS_SEARCH_BYFILTER ) {
- Sys_ListFilteredFiles( listedFiles, &count, path,
+ if( flags & FS_SEARCH_BYFILTER ) {
+ Sys_ListFilteredFiles( listedFiles, &count, path,
extension, flags, baselen, 0 );
- } else {
- if( ( findHandle = opendir( path ) ) == NULL ) {
- return NULL;
- }
-
- while( ( findInfo = readdir( findHandle ) ) != NULL ) {
- if( !strcmp( findInfo->d_name, "." ) ) {
- continue;
- }
- if( !strcmp( findInfo->d_name, ".." ) ) {
- continue;
- }
-
- len = Q_concat( findPath, sizeof( findPath ),
+ } else {
+ if( ( findHandle = opendir( path ) ) == NULL ) {
+ return NULL;
+ }
+
+ while( ( findInfo = readdir( findHandle ) ) != NULL ) {
+ if( !strcmp( findInfo->d_name, "." ) ) {
+ continue;
+ }
+ if( !strcmp( findInfo->d_name, ".." ) ) {
+ continue;
+ }
+
+ len = Q_concat( findPath, sizeof( findPath ),
path, "/", findInfo->d_name, NULL );
if( len >= sizeof( findPath ) ) {
continue;
}
- if( stat( findPath, &st ) == -1 ) {
- continue;
- }
- if( ( flags & FS_SEARCHDIRS_MASK ) == FS_SEARCHDIRS_ONLY ) {
- if( !( st.st_mode & S_IFDIR ) ) {
- continue;
- }
- } else if( ( flags & FS_SEARCHDIRS_MASK ) == FS_SEARCHDIRS_NO ) {
- if( st.st_mode & S_IFDIR ) {
- continue;
- }
- }
-
- if( extension && !FS_ExtCmp( extension, findInfo->d_name ) ) {
- continue;
- }
+ if( stat( findPath, &st ) == -1 ) {
+ continue;
+ }
+ if( ( flags & FS_SEARCHDIRS_MASK ) == FS_SEARCHDIRS_ONLY ) {
+ if( !( st.st_mode & S_IFDIR ) ) {
+ continue;
+ }
+ } else if( ( flags & FS_SEARCHDIRS_MASK ) == FS_SEARCHDIRS_NO ) {
+ if( st.st_mode & S_IFDIR ) {
+ continue;
+ }
+ }
+
+ if( extension && !FS_ExtCmp( extension, findInfo->d_name ) ) {
+ continue;
+ }
- if( flags & FS_SEARCH_SAVEPATH ) {
- s = findPath + baselen;
- } else {
- s = findInfo->d_name;
- }
- if( flags & FS_SEARCH_EXTRAINFO ) {
- listedFiles[count++] = FS_CopyInfo( s, st.st_size,
+ if( flags & FS_SEARCH_SAVEPATH ) {
+ s = findPath + baselen;
+ } else {
+ s = findInfo->d_name;
+ }
+ if( flags & FS_SEARCH_EXTRAINFO ) {
+ listedFiles[count++] = FS_CopyInfo( s, st.st_size,
st.st_ctime, st.st_mtime );
- } else {
- listedFiles[count++] = FS_CopyString( s );
- }
+ } else {
+ listedFiles[count++] = FS_CopyString( s );
+ }
- if( count >= MAX_LISTED_FILES ) {
- break;
- }
- }
+ if( count >= MAX_LISTED_FILES ) {
+ break;
+ }
+ }
- closedir( findHandle );
- }
+ closedir( findHandle );
+ }
- if( !count ) {
- return NULL;
- }
+ if( !count ) {
+ return NULL;
+ }
- if( numFiles ) {
- *numFiles = count;
- }
+ if( numFiles ) {
+ *numFiles = count;
+ }
- return FS_CopyList( listedFiles, count );
+ return FS_CopyList( listedFiles, count );
}
/*
@@ -1050,12 +1050,12 @@ int main( int argc, char **argv ) {
}
}
- if( !getuid() || !geteuid() ) {
- printf( "You can not run " APPLICATION " as superuser "
+ if( !getuid() || !geteuid() ) {
+ printf( "You can not run " APPLICATION " as superuser "
"for security reasons!" );
return 1;
- }
-
+ }
+
Qcommon_Init( argc, argv );
while( 1 ) {
Qcommon_Frame();