|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "cwd.h" |
|
|
|
#include "jam.h" |
|
#include "mem.h" |
|
#include "pathsys.h" |
|
|
|
#include <assert.h> |
|
#include <errno.h> |
|
#include <limits.h> |
|
|
|
|
|
#if defined( NT ) && !defined( __GNUC__ ) |
|
# include <direct.h> |
|
# define PATH_MAX _MAX_PATH |
|
#else |
|
# include <unistd.h> |
|
# if defined( __COMO__ ) |
|
# include <linux/limits.h> |
|
# endif |
|
#endif |
|
|
|
#ifndef PATH_MAX |
|
# define PATH_MAX 1024 |
|
#endif |
|
|
|
|
|
static OBJECT * cwd_; |
|
|
|
|
|
void cwd_init( void ) |
|
{ |
|
int buffer_size = PATH_MAX; |
|
char * cwd_buffer = 0; |
|
int error; |
|
|
|
assert( !cwd_ ); |
|
|
|
do |
|
{ |
|
char * const buffer = BJAM_MALLOC_RAW( buffer_size ); |
|
cwd_buffer = getcwd( buffer, buffer_size ); |
|
error = errno; |
|
if ( cwd_buffer ) |
|
{ |
|
|
|
OBJECT * const cwd = object_new( cwd_buffer ); |
|
cwd_ = path_as_key( cwd ); |
|
object_free( cwd ); |
|
} |
|
buffer_size *= 2; |
|
BJAM_FREE_RAW( buffer ); |
|
} |
|
while ( !cwd_ && error == ERANGE ); |
|
|
|
if ( !cwd_ ) |
|
{ |
|
perror( "can not get current working directory" ); |
|
exit( EXITBAD ); |
|
} |
|
} |
|
|
|
|
|
OBJECT * cwd( void ) |
|
{ |
|
assert( cwd_ ); |
|
return cwd_; |
|
} |
|
|
|
|
|
void cwd_done( void ) |
|
{ |
|
assert( cwd_ ); |
|
object_free( cwd_ ); |
|
cwd_ = NULL; |
|
} |
|
|