1 /* 2 * Copyright 2002. Vladimir Prus 3 * Copyright 2005. Rene Rivera 4 * Distributed under the Boost Software License, Version 1.0. 5 * (See accompanying file LICENSE_1_0.txt or copy at 6 * http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 9 #include "cwd.h" 10 11 #include "jam.h" 12 #include "mem.h" 13 #include "pathsys.h" 14 15 #include <assert.h> 16 #include <errno.h> 17 #include <limits.h> 18 19 /* MinGW on Windows declares PATH_MAX in limits.h */ 20 #if defined( NT ) && !defined( __GNUC__ ) 21 # include <direct.h> 22 # define PATH_MAX _MAX_PATH 23 #else 24 # include <unistd.h> 25 # if defined( __COMO__ ) 26 # include <linux/limits.h> 27 # endif 28 #endif 29 30 #ifndef PATH_MAX 31 # define PATH_MAX 1024 32 #endif 33 34 35 static OBJECT * cwd_; 36 37 cwd_init(void)38void cwd_init( void ) 39 { 40 int buffer_size = PATH_MAX; 41 char * cwd_buffer = 0; 42 int error; 43 44 assert( !cwd_ ); 45 46 do 47 { 48 char * const buffer = BJAM_MALLOC_RAW( buffer_size ); 49 cwd_buffer = getcwd( buffer, buffer_size ); 50 error = errno; 51 if ( cwd_buffer ) 52 { 53 /* We store the path using its canonical/long/key format. */ 54 OBJECT * const cwd = object_new( cwd_buffer ); 55 cwd_ = path_as_key( cwd ); 56 object_free( cwd ); 57 } 58 buffer_size *= 2; 59 BJAM_FREE_RAW( buffer ); 60 } 61 while ( !cwd_ && error == ERANGE ); 62 63 if ( !cwd_ ) 64 { 65 perror( "can not get current working directory" ); 66 exit( EXITBAD ); 67 } 68 } 69 70 cwd(void)71OBJECT * cwd( void ) 72 { 73 assert( cwd_ ); 74 return cwd_; 75 } 76 77 cwd_done(void)78void cwd_done( void ) 79 { 80 assert( cwd_ ); 81 object_free( cwd_ ); 82 cwd_ = NULL; 83 } 84