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)38 void 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)71 OBJECT * cwd( void )
72 {
73     assert( cwd_ );
74     return cwd_;
75 }
76 
77 
cwd_done(void)78 void cwd_done( void )
79 {
80     assert( cwd_ );
81     object_free( cwd_ );
82     cwd_ = NULL;
83 }
84