mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-10 07:12:07 +00:00
Bennene posix.c zu hunk.c um
This commit is contained in:
parent
1ad221b667
commit
9a750b4e4e
4 changed files with 345 additions and 341 deletions
12
Makefile
12
Makefile
|
@ -254,7 +254,7 @@ SERVER_OBJS = \
|
||||||
# POSIX platform objects
|
# POSIX platform objects
|
||||||
POSIX_OBJS = \
|
POSIX_OBJS = \
|
||||||
build/posix/network.o \
|
build/posix/network.o \
|
||||||
build/posix/posix.o \
|
build/posix/hunk.o \
|
||||||
build/posix/system.o \
|
build/posix/system.o \
|
||||||
build/posix/glob/glob.o \
|
build/posix/glob/glob.o \
|
||||||
build/posix/vid/menu.o \
|
build/posix/vid/menu.o \
|
||||||
|
@ -314,7 +314,7 @@ DEDICATED_SERVER_COMMON_OBJS = \
|
||||||
DEDICATED_SERVER_POSIX_OBJS = \
|
DEDICATED_SERVER_POSIX_OBJS = \
|
||||||
build/dedicated_server_posix/glob/glob.o \
|
build/dedicated_server_posix/glob/glob.o \
|
||||||
build/dedicated_server_posix/network.o \
|
build/dedicated_server_posix/network.o \
|
||||||
build/dedicated_server_posix/posix.o \
|
build/dedicated_server_posix/hunk.o \
|
||||||
build/dedicated_server_posix/system.o
|
build/dedicated_server_posix/system.o
|
||||||
|
|
||||||
# ----------
|
# ----------
|
||||||
|
@ -343,7 +343,7 @@ OPENGL_GAME_OBJS = \
|
||||||
OPENGL_POSIX_OBJS = \
|
OPENGL_POSIX_OBJS = \
|
||||||
build/ref_gl_posix/abi.o \
|
build/ref_gl_posix/abi.o \
|
||||||
build/ref_gl_posix/glob.o \
|
build/ref_gl_posix/glob.o \
|
||||||
build/ref_gl_posix/posix.o \
|
build/ref_gl_posix/hunk.o \
|
||||||
build/ref_gl_posix/qgl.o \
|
build/ref_gl_posix/qgl.o \
|
||||||
build/ref_gl_posix/refresh.o
|
build/ref_gl_posix/refresh.o
|
||||||
|
|
||||||
|
@ -620,7 +620,7 @@ build/server/sv_world.o : src/server/sv_world.c
|
||||||
build/posix/network.o : src/posix/network.c
|
build/posix/network.o : src/posix/network.c
|
||||||
$(CC) $(CFLAGS_CLIENT) -o $@ -c $<
|
$(CC) $(CFLAGS_CLIENT) -o $@ -c $<
|
||||||
|
|
||||||
build/posix/posix.o : src/posix/posix.c
|
build/posix/hunk.o : src/posix/hunk.c
|
||||||
$(CC) $(CFLAGS_CLIENT) -o $@ -c $<
|
$(CC) $(CFLAGS_CLIENT) -o $@ -c $<
|
||||||
|
|
||||||
build/posix/system.o : src/posix/system.c
|
build/posix/system.o : src/posix/system.c
|
||||||
|
@ -750,7 +750,7 @@ build/dedicated_server_posix/glob/glob.o : src/posix/glob/glob.c
|
||||||
build/dedicated_server_posix/network.o : src/posix/network.c
|
build/dedicated_server_posix/network.o : src/posix/network.c
|
||||||
$(CC) $(CFLAGS_DEDICATED_SERVER) -o $@ -c $<
|
$(CC) $(CFLAGS_DEDICATED_SERVER) -o $@ -c $<
|
||||||
|
|
||||||
build/dedicated_server_posix/posix.o : src/posix/posix.c
|
build/dedicated_server_posix/hunk.o : src/posix/hunk.c
|
||||||
$(CC) $(CFLAGS_DEDICATED_SERVER) -o $@ -c $<
|
$(CC) $(CFLAGS_DEDICATED_SERVER) -o $@ -c $<
|
||||||
|
|
||||||
build/dedicated_server_posix/system.o : src/posix/system.c
|
build/dedicated_server_posix/system.o : src/posix/system.c
|
||||||
|
@ -800,7 +800,7 @@ build/ref_gl_posix/abi.o: src/posix/refresh/abi.c
|
||||||
build/ref_gl_posix/glob.o: src/posix/glob/glob.c
|
build/ref_gl_posix/glob.o: src/posix/glob/glob.c
|
||||||
$(CC) $(CFLAGS_OPENGL) -o $@ -c $<
|
$(CC) $(CFLAGS_OPENGL) -o $@ -c $<
|
||||||
|
|
||||||
build/ref_gl_posix/posix.o: src/posix/posix.c
|
build/ref_gl_posix/hunk.o: src/posix/hunk.c
|
||||||
$(CC) $(CFLAGS_OPENGL) -o $@ -c $<
|
$(CC) $(CFLAGS_OPENGL) -o $@ -c $<
|
||||||
|
|
||||||
build/ref_gl_posix/qgl.o: src/posix/refresh/qgl.c
|
build/ref_gl_posix/qgl.o: src/posix/refresh/qgl.c
|
||||||
|
|
142
src/posix/hunk.c
Normal file
142
src/posix/hunk.c
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997-2001 Id Software, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* =======================================================================
|
||||||
|
*
|
||||||
|
* This file implements the low level part of the Hunk_* memory system
|
||||||
|
*
|
||||||
|
* =======================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "../common/header/common.h"
|
||||||
|
|
||||||
|
#if defined( __FreeBSD__ )
|
||||||
|
#include <machine/param.h>
|
||||||
|
#define MAP_ANONYMOUS MAP_ANON
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* For mremap() */
|
||||||
|
#if defined( __linux__ )
|
||||||
|
#define __USE_GNU
|
||||||
|
#endif
|
||||||
|
|
||||||
|
byte *membase;
|
||||||
|
int maxhunksize;
|
||||||
|
int curhunksize;
|
||||||
|
|
||||||
|
void *
|
||||||
|
Hunk_Begin ( int maxsize )
|
||||||
|
{
|
||||||
|
/* reserve a huge chunk of memory, but don't commit any yet */
|
||||||
|
maxhunksize = maxsize + sizeof ( int );
|
||||||
|
curhunksize = 0;
|
||||||
|
|
||||||
|
membase = mmap( 0, maxhunksize, PROT_READ | PROT_WRITE,
|
||||||
|
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 );
|
||||||
|
|
||||||
|
if ( ( membase == NULL ) || ( membase == (byte *) -1 ) )
|
||||||
|
{
|
||||||
|
Sys_Error( "unable to virtual allocate %d bytes", maxsize );
|
||||||
|
}
|
||||||
|
|
||||||
|
*( (int *) membase ) = curhunksize;
|
||||||
|
|
||||||
|
return ( membase + sizeof ( int ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
Hunk_Alloc ( int size )
|
||||||
|
{
|
||||||
|
byte *buf;
|
||||||
|
|
||||||
|
/* round to cacheline */
|
||||||
|
size = ( size + 31 ) & ~31;
|
||||||
|
|
||||||
|
if ( curhunksize + size > maxhunksize )
|
||||||
|
{
|
||||||
|
Sys_Error( "Hunk_Alloc overflow" );
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = membase + sizeof ( int ) + curhunksize;
|
||||||
|
curhunksize += size;
|
||||||
|
return ( buf );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Hunk_End ( void )
|
||||||
|
{
|
||||||
|
byte *n = NULL;
|
||||||
|
|
||||||
|
#if defined( __FreeBSD__ )
|
||||||
|
size_t old_size = maxhunksize;
|
||||||
|
size_t new_size = curhunksize + sizeof ( int );
|
||||||
|
void *unmap_base;
|
||||||
|
size_t unmap_len;
|
||||||
|
|
||||||
|
new_size = round_page( new_size );
|
||||||
|
old_size = round_page( old_size );
|
||||||
|
|
||||||
|
if ( new_size > old_size )
|
||||||
|
{
|
||||||
|
n = 0; /* error */
|
||||||
|
}
|
||||||
|
else if ( new_size < old_size )
|
||||||
|
{
|
||||||
|
unmap_base = (caddr_t) ( membase + new_size );
|
||||||
|
unmap_len = old_size - new_size;
|
||||||
|
n = munmap( unmap_base, unmap_len ) + membase;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined( __linux__ )
|
||||||
|
n = mremap( membase, maxhunksize, curhunksize + sizeof ( int ), 0 );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( n != membase )
|
||||||
|
{
|
||||||
|
Sys_Error( "Hunk_End: Could not remap virtual block (%d)", errno );
|
||||||
|
}
|
||||||
|
|
||||||
|
*( (int *) membase ) = curhunksize + sizeof ( int );
|
||||||
|
|
||||||
|
return ( curhunksize );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Hunk_Free ( void *base )
|
||||||
|
{
|
||||||
|
byte *m;
|
||||||
|
|
||||||
|
if ( base )
|
||||||
|
{
|
||||||
|
m = ( (byte *) base ) - sizeof ( int );
|
||||||
|
|
||||||
|
if ( munmap( m, *( (int *) m ) ) )
|
||||||
|
{
|
||||||
|
Sys_Error( "Hunk_Free: munmap failed (%d)", errno );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 1997-2001 Id Software, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include "glob/glob.h"
|
|
||||||
#include "../common/header/common.h"
|
|
||||||
|
|
||||||
#if defined( __FreeBSD__ )
|
|
||||||
#include <machine/param.h>
|
|
||||||
#define MAP_ANONYMOUS MAP_ANON
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* For mremap() */
|
|
||||||
#if defined( __linux__ )
|
|
||||||
#define __USE_GNU
|
|
||||||
#endif
|
|
||||||
|
|
||||||
byte *membase;
|
|
||||||
int maxhunksize;
|
|
||||||
int curhunksize;
|
|
||||||
|
|
||||||
void *
|
|
||||||
Hunk_Begin ( int maxsize )
|
|
||||||
{
|
|
||||||
/* reserve a huge chunk of memory, but don't commit any yet */
|
|
||||||
maxhunksize = maxsize + sizeof ( int );
|
|
||||||
curhunksize = 0;
|
|
||||||
|
|
||||||
membase = mmap( 0, maxhunksize, PROT_READ | PROT_WRITE,
|
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 );
|
|
||||||
|
|
||||||
if ( ( membase == NULL ) || ( membase == (byte *) -1 ) )
|
|
||||||
{
|
|
||||||
Sys_Error( "unable to virtual allocate %d bytes", maxsize );
|
|
||||||
}
|
|
||||||
|
|
||||||
*( (int *) membase ) = curhunksize;
|
|
||||||
|
|
||||||
return ( membase + sizeof ( int ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
Hunk_Alloc ( int size )
|
|
||||||
{
|
|
||||||
byte *buf;
|
|
||||||
|
|
||||||
/* round to cacheline */
|
|
||||||
size = ( size + 31 ) & ~31;
|
|
||||||
|
|
||||||
if ( curhunksize + size > maxhunksize )
|
|
||||||
{
|
|
||||||
Sys_Error( "Hunk_Alloc overflow" );
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = membase + sizeof ( int ) + curhunksize;
|
|
||||||
curhunksize += size;
|
|
||||||
return ( buf );
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
Hunk_End ( void )
|
|
||||||
{
|
|
||||||
byte *n = NULL;
|
|
||||||
|
|
||||||
#if defined( __FreeBSD__ )
|
|
||||||
size_t old_size = maxhunksize;
|
|
||||||
size_t new_size = curhunksize + sizeof ( int );
|
|
||||||
void *unmap_base;
|
|
||||||
size_t unmap_len;
|
|
||||||
|
|
||||||
new_size = round_page( new_size );
|
|
||||||
old_size = round_page( old_size );
|
|
||||||
|
|
||||||
if ( new_size > old_size )
|
|
||||||
{
|
|
||||||
n = 0; /* error */
|
|
||||||
}
|
|
||||||
else if ( new_size < old_size )
|
|
||||||
{
|
|
||||||
unmap_base = (caddr_t) ( membase + new_size );
|
|
||||||
unmap_len = old_size - new_size;
|
|
||||||
n = munmap( unmap_base, unmap_len ) + membase;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined( __linux__ )
|
|
||||||
n = mremap( membase, maxhunksize, curhunksize + sizeof ( int ), 0 );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ( n != membase )
|
|
||||||
{
|
|
||||||
Sys_Error( "Hunk_End: Could not remap virtual block (%d)", errno );
|
|
||||||
}
|
|
||||||
|
|
||||||
*( (int *) membase ) = curhunksize + sizeof ( int );
|
|
||||||
|
|
||||||
return ( curhunksize );
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Hunk_Free ( void *base )
|
|
||||||
{
|
|
||||||
byte *m;
|
|
||||||
|
|
||||||
if ( base )
|
|
||||||
{
|
|
||||||
m = ( (byte *) base ) - sizeof ( int );
|
|
||||||
|
|
||||||
if ( munmap( m, *( (int *) m ) ) )
|
|
||||||
{
|
|
||||||
Sys_Error( "Hunk_Free: munmap failed (%d)", errno );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int curtime;
|
|
||||||
|
|
||||||
int
|
|
||||||
Sys_Milliseconds ( void )
|
|
||||||
{
|
|
||||||
struct timeval tp;
|
|
||||||
struct timezone tzp;
|
|
||||||
static int secbase;
|
|
||||||
|
|
||||||
gettimeofday( &tp, &tzp );
|
|
||||||
|
|
||||||
if ( !secbase )
|
|
||||||
{
|
|
||||||
secbase = tp.tv_sec;
|
|
||||||
return ( tp.tv_usec / 1000 );
|
|
||||||
}
|
|
||||||
|
|
||||||
curtime = ( tp.tv_sec - secbase ) * 1000 + tp.tv_usec / 1000;
|
|
||||||
|
|
||||||
return ( curtime );
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Sys_Mkdir ( char *path )
|
|
||||||
{
|
|
||||||
mkdir( path, 0755 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Sys_Rmdir ( char *path )
|
|
||||||
{
|
|
||||||
rmdir( path );
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
Sys_GetCurrentDirectory ( void )
|
|
||||||
{
|
|
||||||
static char dir [ MAX_OSPATH ];
|
|
||||||
|
|
||||||
if ( !getcwd( dir, sizeof ( dir ) ) )
|
|
||||||
{
|
|
||||||
Sys_Error( "Couldn't get current working directory" );
|
|
||||||
}
|
|
||||||
|
|
||||||
return ( dir );
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
strlwr ( char *s )
|
|
||||||
{
|
|
||||||
char *p = s;
|
|
||||||
|
|
||||||
while ( *s )
|
|
||||||
{
|
|
||||||
*s = tolower( *s );
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ( p );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static char findbase [ MAX_OSPATH ];
|
|
||||||
static char findpath [ MAX_OSPATH ];
|
|
||||||
static char findpattern [ MAX_OSPATH ];
|
|
||||||
static DIR *fdir;
|
|
||||||
|
|
||||||
static qboolean
|
|
||||||
CompareAttributes ( char *path, char *name, unsigned musthave, unsigned canthave )
|
|
||||||
{
|
|
||||||
struct stat st;
|
|
||||||
char fn [ MAX_OSPATH ];
|
|
||||||
|
|
||||||
/* . and .. never match */
|
|
||||||
if ( ( strcmp( name, "." ) == 0 ) || ( strcmp( name, ".." ) == 0 ) )
|
|
||||||
{
|
|
||||||
return ( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
return ( true );
|
|
||||||
|
|
||||||
if ( stat( fn, &st ) == -1 )
|
|
||||||
{
|
|
||||||
return ( false ); /* shouldn't happen */
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( st.st_mode & S_IFDIR ) && ( canthave & SFF_SUBDIR ) )
|
|
||||||
{
|
|
||||||
return ( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( musthave & SFF_SUBDIR ) && !( st.st_mode & S_IFDIR ) )
|
|
||||||
{
|
|
||||||
return ( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
return ( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
Sys_FindFirst ( char *path, unsigned musthave, unsigned canhave )
|
|
||||||
{
|
|
||||||
struct dirent *d;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if ( fdir )
|
|
||||||
{
|
|
||||||
Sys_Error( "Sys_BeginFind without close" );
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy( findbase, path );
|
|
||||||
|
|
||||||
if ( ( p = strrchr( findbase, '/' ) ) != NULL )
|
|
||||||
{
|
|
||||||
*p = 0;
|
|
||||||
strcpy( findpattern, p + 1 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strcpy( findpattern, "*" );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( strcmp( findpattern, "*.*" ) == 0 )
|
|
||||||
{
|
|
||||||
strcpy( findpattern, "*" );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( fdir = opendir( findbase ) ) == NULL )
|
|
||||||
{
|
|
||||||
return ( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
while ( ( d = readdir( fdir ) ) != NULL )
|
|
||||||
{
|
|
||||||
if ( !*findpattern || glob_match( findpattern, d->d_name ) )
|
|
||||||
{
|
|
||||||
if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) )
|
|
||||||
{
|
|
||||||
sprintf( findpath, "%s/%s", findbase, d->d_name );
|
|
||||||
return ( findpath );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
Sys_FindNext ( unsigned musthave, unsigned canhave )
|
|
||||||
{
|
|
||||||
struct dirent *d;
|
|
||||||
|
|
||||||
if ( fdir == NULL )
|
|
||||||
{
|
|
||||||
return ( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
while ( ( d = readdir( fdir ) ) != NULL )
|
|
||||||
{
|
|
||||||
if ( !*findpattern || glob_match( findpattern, d->d_name ) )
|
|
||||||
{
|
|
||||||
if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) )
|
|
||||||
{
|
|
||||||
sprintf( findpath, "%s/%s", findbase, d->d_name );
|
|
||||||
return ( findpath );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Sys_FindClose ( void )
|
|
||||||
{
|
|
||||||
if ( fdir != NULL )
|
|
||||||
{
|
|
||||||
closedir( fdir );
|
|
||||||
}
|
|
||||||
|
|
||||||
fdir = NULL;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,22 +1,29 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1997-2001 Id Software, Inc.
|
* Copyright (C) 1997-2001 Id Software, Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* modify it under the terms of the GNU General Public License
|
* it under the terms of the GNU General Public License as published by
|
||||||
* as published by the Free Software Foundation; either version 2
|
* the Free Software Foundation; either version 2 of the License, or (at
|
||||||
* of the License, or (at your option) any later version.
|
* your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful, but
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*
|
*
|
||||||
* See the GNU General Public License for more details.
|
* See the GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*
|
*
|
||||||
|
* =======================================================================
|
||||||
|
*
|
||||||
|
* This file implements all system dependend generic funktions
|
||||||
|
*
|
||||||
|
* =======================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -36,18 +43,201 @@
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
|
#include "glob/glob.h"
|
||||||
#include "../common/header/common.h"
|
#include "../common/header/common.h"
|
||||||
|
|
||||||
#include "posix.h"
|
#include "posix.h"
|
||||||
|
|
||||||
unsigned sys_frame_time;
|
unsigned sys_frame_time;
|
||||||
|
int curtime;
|
||||||
static void *game_library;
|
static void *game_library;
|
||||||
|
|
||||||
|
static char findbase [ MAX_OSPATH ];
|
||||||
|
static char findpath [ MAX_OSPATH ];
|
||||||
|
static char findpattern [ MAX_OSPATH ];
|
||||||
|
static DIR *fdir;
|
||||||
|
|
||||||
cvar_t *nostdout;
|
cvar_t *nostdout;
|
||||||
uid_t saved_euid;
|
uid_t saved_euid;
|
||||||
qboolean stdin_active = true;
|
qboolean stdin_active = true;
|
||||||
|
|
||||||
|
int
|
||||||
|
Sys_Milliseconds ( void )
|
||||||
|
{
|
||||||
|
struct timeval tp;
|
||||||
|
struct timezone tzp;
|
||||||
|
static int secbase;
|
||||||
|
|
||||||
|
gettimeofday( &tp, &tzp );
|
||||||
|
|
||||||
|
if ( !secbase )
|
||||||
|
{
|
||||||
|
secbase = tp.tv_sec;
|
||||||
|
return ( tp.tv_usec / 1000 );
|
||||||
|
}
|
||||||
|
|
||||||
|
curtime = ( tp.tv_sec - secbase ) * 1000 + tp.tv_usec / 1000;
|
||||||
|
|
||||||
|
return ( curtime );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Sys_Mkdir ( char *path )
|
||||||
|
{
|
||||||
|
mkdir( path, 0755 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Sys_Rmdir ( char *path )
|
||||||
|
{
|
||||||
|
rmdir( path );
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Sys_GetCurrentDirectory ( void )
|
||||||
|
{
|
||||||
|
static char dir [ MAX_OSPATH ];
|
||||||
|
|
||||||
|
if ( !getcwd( dir, sizeof ( dir ) ) )
|
||||||
|
{
|
||||||
|
Sys_Error( "Couldn't get current working directory" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( dir );
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
strlwr ( char *s )
|
||||||
|
{
|
||||||
|
char *p = s;
|
||||||
|
|
||||||
|
while ( *s )
|
||||||
|
{
|
||||||
|
*s = tolower( *s );
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
static qboolean
|
||||||
|
CompareAttributes ( char *path, char *name, unsigned musthave, unsigned canthave )
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
char fn [ MAX_OSPATH ];
|
||||||
|
|
||||||
|
/* . and .. never match */
|
||||||
|
if ( ( strcmp( name, "." ) == 0 ) || ( strcmp( name, ".." ) == 0 ) )
|
||||||
|
{
|
||||||
|
return ( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( true );
|
||||||
|
|
||||||
|
if ( stat( fn, &st ) == -1 )
|
||||||
|
{
|
||||||
|
return ( false ); /* shouldn't happen */
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( st.st_mode & S_IFDIR ) && ( canthave & SFF_SUBDIR ) )
|
||||||
|
{
|
||||||
|
return ( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( musthave & SFF_SUBDIR ) && !( st.st_mode & S_IFDIR ) )
|
||||||
|
{
|
||||||
|
return ( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Sys_FindFirst ( char *path, unsigned musthave, unsigned canhave )
|
||||||
|
{
|
||||||
|
struct dirent *d;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if ( fdir )
|
||||||
|
{
|
||||||
|
Sys_Error( "Sys_BeginFind without close" );
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy( findbase, path );
|
||||||
|
|
||||||
|
if ( ( p = strrchr( findbase, '/' ) ) != NULL )
|
||||||
|
{
|
||||||
|
*p = 0;
|
||||||
|
strcpy( findpattern, p + 1 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy( findpattern, "*" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( strcmp( findpattern, "*.*" ) == 0 )
|
||||||
|
{
|
||||||
|
strcpy( findpattern, "*" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( fdir = opendir( findbase ) ) == NULL )
|
||||||
|
{
|
||||||
|
return ( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( ( d = readdir( fdir ) ) != NULL )
|
||||||
|
{
|
||||||
|
if ( !*findpattern || glob_match( findpattern, d->d_name ) )
|
||||||
|
{
|
||||||
|
if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) )
|
||||||
|
{
|
||||||
|
sprintf( findpath, "%s/%s", findbase, d->d_name );
|
||||||
|
return ( findpath );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Sys_FindNext ( unsigned musthave, unsigned canhave )
|
||||||
|
{
|
||||||
|
struct dirent *d;
|
||||||
|
|
||||||
|
if ( fdir == NULL )
|
||||||
|
{
|
||||||
|
return ( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( ( d = readdir( fdir ) ) != NULL )
|
||||||
|
{
|
||||||
|
if ( !*findpattern || glob_match( findpattern, d->d_name ) )
|
||||||
|
{
|
||||||
|
if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) )
|
||||||
|
{
|
||||||
|
sprintf( findpath, "%s/%s", findbase, d->d_name );
|
||||||
|
return ( findpath );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Sys_FindClose ( void )
|
||||||
|
{
|
||||||
|
if ( fdir != NULL )
|
||||||
|
{
|
||||||
|
closedir( fdir );
|
||||||
|
}
|
||||||
|
|
||||||
|
fdir = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Sys_ConsoleOutput ( char *string )
|
Sys_ConsoleOutput ( char *string )
|
||||||
{
|
{
|
||||||
|
@ -203,7 +393,6 @@ Sys_ConsoleInput ( void )
|
||||||
return ( text );
|
return ( text );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Sys_UnloadGame ( void )
|
Sys_UnloadGame ( void )
|
||||||
{
|
{
|
||||||
|
@ -319,8 +508,6 @@ Sys_SendKeyEvents ( void )
|
||||||
sys_frame_time = Sys_Milliseconds();
|
sys_frame_time = Sys_Milliseconds();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main ( int argc, char **argv )
|
main ( int argc, char **argv )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue