• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 //  Copyright (c) 2012 Artyom Beilis (Tonkikh)
3 //  Copyright (c) 2020 Alexander Grund
4 //
5 //  Distributed under the Boost Software License, Version 1.0. (See
6 //  accompanying file LICENSE or copy at
7 //  http://www.boost.org/LICENSE_1_0.txt)
8 //
9 
10 #define BOOST_NOWIDE_SOURCE
11 
12 #ifdef _MSC_VER
13 #define _CRT_SECURE_NO_WARNINGS
14 #elif(defined(__MINGW32__) || defined(__CYGWIN__)) && defined(__STRICT_ANSI__)
15 // Need the _w* functions which are extensions on MinGW/Cygwin
16 #undef __STRICT_ANSI__
17 #endif
18 
19 #include <boost/nowide/cstdlib.hpp>
20 
21 #if !defined(BOOST_WINDOWS)
22 namespace boost {
23 namespace nowide {
setenv(const char * key,const char * value,int overwrite)24     int setenv(const char* key, const char* value, int overwrite)
25     {
26         return ::setenv(key, value, overwrite);
27     }
28 
unsetenv(const char * key)29     int unsetenv(const char* key)
30     {
31         return ::unsetenv(key);
32     }
33 
putenv(char * string)34     int putenv(char* string)
35     {
36         return ::putenv(string);
37     }
38 } // namespace nowide
39 } // namespace boost
40 #else
41 #include <boost/nowide/stackstring.hpp>
42 #include <vector>
43 #include <windows.h>
44 
45 namespace boost {
46 namespace nowide {
getenv(const char * key)47     char* getenv(const char* key)
48     {
49         static stackstring value;
50 
51         const wshort_stackstring name(key);
52 
53         static const size_t buf_size = 64;
54         wchar_t buf[buf_size];
55         std::vector<wchar_t> tmp;
56         wchar_t* ptr = buf;
57         size_t n = GetEnvironmentVariableW(name.get(), buf, buf_size);
58         if(n == 0 && GetLastError() == 203) // ERROR_ENVVAR_NOT_FOUND
59             return 0;
60         if(n >= buf_size)
61         {
62             tmp.resize(n + 1, L'\0');
63             n = GetEnvironmentVariableW(name.get(), &tmp[0], static_cast<unsigned>(tmp.size() - 1));
64             // The size may have changed
65             if(n >= tmp.size() - 1)
66                 return 0;
67             ptr = &tmp[0];
68         }
69         value.convert(ptr);
70         return value.get();
71     }
72 
setenv(const char * key,const char * value,int overwrite)73     int setenv(const char* key, const char* value, int overwrite)
74     {
75         const wshort_stackstring name(key);
76         if(!overwrite)
77         {
78             wchar_t unused[2];
79             if(GetEnvironmentVariableW(name.get(), unused, 2) != 0 || GetLastError() != 203) // ERROR_ENVVAR_NOT_FOUND
80                 return 0;
81         }
82         const wstackstring wval(value);
83         if(SetEnvironmentVariableW(name.get(), wval.get()))
84             return 0;
85         return -1;
86     }
87 
unsetenv(const char * key)88     int unsetenv(const char* key)
89     {
90         const wshort_stackstring name(key);
91         if(SetEnvironmentVariableW(name.get(), 0))
92             return 0;
93         return -1;
94     }
95 
putenv(char * string)96     int putenv(char* string)
97     {
98         const char* key = string;
99         const char* key_end = string;
100         while(*key_end != '=' && *key_end != '\0')
101             key_end++;
102         if(*key_end == '\0')
103             return -1;
104         const wshort_stackstring wkey(key, key_end);
105         const wstackstring wvalue(key_end + 1);
106 
107         if(SetEnvironmentVariableW(wkey.get(), wvalue.get()))
108             return 0;
109         return -1;
110     }
111 
system(const char * cmd)112     int system(const char* cmd)
113     {
114         if(!cmd)
115             return _wsystem(0);
116         const wstackstring wcmd(cmd);
117         return _wsystem(wcmd.get());
118     }
119 } // namespace nowide
120 } // namespace boost
121 #endif
122