diff options
Diffstat (limited to 'source/sys_unix.c')
-rw-r--r-- | source/sys_unix.c | 702 |
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(); |