1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
18 #include <OSD_Environment.hxx>
19 #include <OSD_OSDError.hxx>
20 #include <OSD_WhoAmI.hxx>
21 #include <Standard_ConstructionError.hxx>
22 #include <Standard_Failure.hxx>
23 #include <Standard_Mutex.hxx>
24 #include <Standard_NullObject.hxx>
25 #include <TCollection_AsciiString.hxx>
31 static const OSD_WhoAmI Iam = OSD_WEnvironment;
33 // ----------------------------------------------------------------------
35 // Updated by : JPT Dec,7 1992
36 // What : OSD_Environment::OSD_Environment
37 // (const TCollection_AsciiString& Name,
38 // const TCollection_AsciiString& Value)
39 // Value could contain the character $ (Ex setenv a = $c)
41 // ----------------------------------------------------------------------
44 OSD_Environment::OSD_Environment()
49 // ----------------------------------------------------------------------
51 // ----------------------------------------------------------------------
53 OSD_Environment::OSD_Environment(const TCollection_AsciiString& Name)
56 if (!Name.IsAscii() || Name.Search("$") != -1 )
57 Standard_ConstructionError::Raise("OSD_Environment::OSD_Environment: bad argument");
63 // ----------------------------------------------------------------------
64 // Create an environment variable and initialize it
65 // ----------------------------------------------------------------------
67 OSD_Environment::OSD_Environment(const TCollection_AsciiString& Name,
68 const TCollection_AsciiString& Value)
71 if (!Name.IsAscii() || !Value.IsAscii() ||
72 // JPT : Dec-7-1992 Name.Search("$") != -1 || Value.Search("$") != -1)
73 Name.Search("$") != -1 )
74 Standard_ConstructionError::Raise("OSD_Environment::OSD_Environment: bad argument");
81 // ----------------------------------------------------------------------
82 // Returns the name of the symbol
83 // ----------------------------------------------------------------------
85 TCollection_AsciiString OSD_Environment::Name () const
90 // ----------------------------------------------------------------------
91 // Set new value for environment variable
92 // ----------------------------------------------------------------------
94 void OSD_Environment::SetName (const TCollection_AsciiString& Name)
97 if (!Name.IsAscii() || Name.Search("$") != -1 )
98 Standard_ConstructionError::Raise("OSD_Environment::SetName: bad argument");
103 // ----------------------------------------------------------------------
105 // ----------------------------------------------------------------------
107 void OSD_Environment::SetValue (const TCollection_AsciiString& Value)
109 if (!Value.IsAscii() || Value.Search("$") != -1)
110 Standard_ConstructionError::Raise("OSD_Environment::Change: bad argument");
115 // ----------------------------------------------------------------------
116 // Get environment variable physically
117 // ----------------------------------------------------------------------
119 TCollection_AsciiString OSD_Environment::Value()
121 char *result = getenv(myName.ToCString());
122 if (result == NULL) myValue.Clear();
123 else myValue = result;
127 // ----------------------------------------------------------------------
128 // Sets physically the environment variable
129 // ----------------------------------------------------------------------
131 void OSD_Environment::Build ()
133 // Static buffer to hold definitions of new variables for the environment.
134 // Note that they need to be static since putenv does not make a copy
135 // of the string, but just adds its pointer to the environment.
136 static char **buffer = 0 ; // JPT:
137 static int Ibuffer = 0 ; // Tout ca pour putenv,getenv
139 // Use mutex to avoid concurrent access to the buffer
140 static Standard_Mutex theMutex;
141 Standard_Mutex::Sentry aSentry ( theMutex );
143 // check if such variable has already been created in the buffer
144 int index = -1, len = myName.Length();
145 for ( int i=0; i < Ibuffer; i++ ) {
146 if ( ! strncmp ( buffer[i], myName.ToCString(), len ) && buffer[i][len] == '=' ) {
152 // and either add a new entry, or remember the old entry for a while
155 old_value = buffer[index];
158 // Allocation memoire. Surtout tout la heap!
161 aTmp = (char **) realloc ( buffer, Ibuffer * sizeof(char*) );
168 myError.SetValue(errno, Iam, "Memory realloc failure");
173 // create a new entry in the buffer and add it to environment
174 buffer[index] = (char *) malloc ( len + myValue.Length() + 2 );
175 sprintf(buffer[index], "%s=%s", myName.ToCString(), myValue.ToCString());
176 putenv(buffer[index]);
178 // then (and only then!) free old entry, if existed
183 char *result = getenv(myName.ToCString());
185 myError.SetValue(errno, Iam, "Set Environment");
188 // ----------------------------------------------------------------------
189 // Remove physically the environment variable
190 // ----------------------------------------------------------------------
192 void OSD_Environment::Remove ()
200 // ----------------------------------------------------------------------
201 // ----------------------------------------------------------------------
202 void OSD_Environment::Reset()
207 // ----------------------------------------------------------------------
208 // ----------------------------------------------------------------------
209 Standard_Boolean OSD_Environment::Failed() const
211 return myError.Failed();
214 // ----------------------------------------------------------------------
215 // ----------------------------------------------------------------------
216 void OSD_Environment::Perror()
222 // ----------------------------------------------------------------------
223 // ----------------------------------------------------------------------
224 Standard_Integer OSD_Environment::Error() const
226 return myError.Error();
231 //------------------------------------------------------------------------
232 //------------------- WNT Sources of OSD_Environment --------------------
233 //------------------------------------------------------------------------
236 #include <OSD_Environment.hxx>
238 #include <OSD_WNT.hxx>
242 #pragma warning( disable : 4700 )
244 static void __fastcall _set_error ( OSD_Error&, DWORD );
246 OSD_Environment :: OSD_Environment () {
248 } // end constructor ( 1 )
250 OSD_Environment :: OSD_Environment ( const TCollection_AsciiString& Name ) {
254 } // end constructor ( 2 )
256 OSD_Environment :: OSD_Environment (
257 const TCollection_AsciiString& Name,
258 const TCollection_AsciiString& Value
264 } // end constructor ( 3 )
266 void OSD_Environment :: SetValue ( const TCollection_AsciiString& Value ) {
270 } // end OSD_Environment :: SetValue
272 TCollection_AsciiString OSD_Environment :: Value () {
274 Standard_PCharacter pBuff=0;
280 SetLastError ( ERROR_SUCCESS );
281 dwSize = GetEnvironmentVariable ( myName.ToCString (), pBuff, dwSize );
283 if ( ( dwSize == 0 && GetLastError () != ERROR_SUCCESS ) ||
284 ( envVal = getenv ( myName.ToCString () ) ) == NULL
287 _set_error ( myError, ERROR_ENVVAR_NOT_FOUND );
289 else if ( envVal != NULL )
296 pBuff = new Standard_Character[ dwSize ];
297 GetEnvironmentVariable ( (char *)myName.ToCString (), pBuff, dwSize );
306 } // end OSD_Environment :: Value
308 void OSD_Environment :: SetName ( const TCollection_AsciiString& name ) {
312 } // end OSD_Environment :: SetName
314 TCollection_AsciiString OSD_Environment :: Name () const {
318 } // end OSD_Environment :: Name
320 void OSD_Environment :: Build () {
322 TCollection_AsciiString str;
324 str = myName + TEXT( "=" ) + myValue;
326 putenv ( str.ToCString () );
328 } // end OSD_Environment :: Build
330 void OSD_Environment :: Remove () {
332 TCollection_AsciiString str;
334 str = myName + TEXT( "=" );
336 putenv ( str.ToCString () );
338 } // end OSD_Environment :: Remove
340 Standard_Boolean OSD_Environment :: Failed () const {
342 return myError.Failed ();
344 } // end OSD_Environment :: Failed
346 void OSD_Environment :: Reset () {
350 } // end OSD_Environment :: Reset
352 void OSD_Environment :: Perror () {
354 if ( ErrorPrefix () )
356 ( *ErrorStream () ) << TEXT( '\'' ) << myName.ToCString () << TEXT( "' - " );
360 } // end OSD_Environment :: Perror
362 Standard_Integer OSD_Environment :: Error () const {
364 return myError.Error ();
366 } // end OSD_Environment :: Error
368 static void __fastcall _set_error ( OSD_Error& err, DWORD code ) {
371 Standard_Character buffer[ 2048 ];
373 errCode = code ? code : GetLastError ();
375 if ( !FormatMessage (
376 FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY,
377 0, errCode, MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL ),
382 sprintf ( buffer, "error code %d", (Standard_Integer)errCode );
383 SetLastError ( errCode );
387 err.SetValue ( errCode, OSD_WEnvironment, buffer );