diff options
Diffstat (limited to 'tools/build/src/engine/cwd.c')
-rw-r--r-- | tools/build/src/engine/cwd.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/tools/build/src/engine/cwd.c b/tools/build/src/engine/cwd.c new file mode 100644 index 000000000..7ebe97045 --- /dev/null +++ b/tools/build/src/engine/cwd.c @@ -0,0 +1,83 @@ +/* + * Copyright 2002. Vladimir Prus + * Copyright 2005. Rene Rivera + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + */ + +#include "cwd.h" + +#include "jam.h" +#include "mem.h" +#include "pathsys.h" + +#include <assert.h> +#include <errno.h> +#include <limits.h> + +/* MinGW on Windows declares PATH_MAX in 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 ) + { + /* We store the path using its canonical/long/key format. */ + 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; +} |