Add wrappers for environment manipulation functions
authorMikko Rasa <tdb@tdb.fi>
Sun, 29 Aug 2021 23:15:57 +0000 (02:15 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 30 Aug 2021 00:22:14 +0000 (03:22 +0300)
source/core/environ.h [new file with mode: 0644]
source/core/unix/environ.cpp [new file with mode: 0644]
source/core/windows/environ.cpp [new file with mode: 0644]
source/fs/dir.cpp
source/fs/osx/dir_location.cpp
source/fs/unix/dir_location.cpp

diff --git a/source/core/environ.h b/source/core/environ.h
new file mode 100644 (file)
index 0000000..67fde05
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef ENVIRON_H_
+#define ENVIRON_H_
+
+#include <string>
+
+namespace Msp {
+
+std::string getenv(const std::string &);
+void setenv(const std::string &, const std::string &);
+void unsetenv(const std::string &);
+
+} // namespace Msp
+
+#endif
diff --git a/source/core/unix/environ.cpp b/source/core/unix/environ.cpp
new file mode 100644 (file)
index 0000000..037a0e9
--- /dev/null
@@ -0,0 +1,34 @@
+#include <cstdlib>
+#include "environ.h"
+#include "mutex.h"
+
+using namespace std;
+
+namespace Msp {
+
+static Mutex &env_mutex()
+{
+       static Mutex mutex;
+       return mutex;
+}
+
+string getenv(const string &name)
+{
+       MutexLock _lock(env_mutex());
+       const char *value = std::getenv(name.c_str());
+       return (value ? string(value) : string());
+}
+
+void setenv(const string &name, const string &value)
+{
+       MutexLock _lock(env_mutex());
+       ::setenv(name.c_str(), value.c_str(), true);
+}
+
+void unsetenv(const string &name)
+{
+       MutexLock _lock(env_mutex());
+       ::unsetenv(name.c_str());
+}
+
+}
diff --git a/source/core/windows/environ.cpp b/source/core/windows/environ.cpp
new file mode 100644 (file)
index 0000000..ff5c2b0
--- /dev/null
@@ -0,0 +1,42 @@
+#include <stdlib.h>
+#include "environ.h"
+#include "mutex.h"
+
+#ifdef __GNUC__
+extern "C" errno_t getenv_s(size_t *, char *, size_t, const char *);
+#endif
+
+using namespace std;
+
+namespace Msp {
+
+static Mutex &env_mutex()
+{
+       static Mutex mutex;
+       return mutex;
+}
+
+string getenv(const string &name)
+{
+       MutexLock _lock(env_mutex());
+       char buffer[1024];
+       size_t result;
+       if(!getenv_s(&result, buffer, sizeof(buffer), name.c_str()))
+               return buffer;
+       else
+               return string();
+}
+
+void setenv(const string &name, const string &value)
+{
+       MutexLock _lock(env_mutex());
+       _putenv_s(name.c_str(), value.c_str());
+}
+
+void unsetenv(const string &name)
+{
+       MutexLock _lock(env_mutex());
+       _putenv_s(name.c_str(), "");
+}
+
+}
index 098020328342db2edf93d4b2b425555405ab5f00..218a7a5cf75e0b8a1a05576bf4d5893423f02ec9 100644 (file)
@@ -1,7 +1,6 @@
-#include <cstdlib>
-#include <unistd.h>
 #include <dirent.h>
 #include <msp/core/application.h>
+#include <msp/core/environ.h>
 #include <msp/core/systemerror.h>
 #include <msp/strings/regex.h>
 #include <msp/strings/utils.h>
@@ -38,7 +37,9 @@ const Path &get_bin_dir(const string &argv0)
        {
                Path exe;
                if(argv0.find(DIRSEP)==string::npos)
-                       if(const char *path = getenv("PATH"))
+               {
+                       string path = getenv("PATH");
+                       if(!path.empty())
                        {
                                for(const string &d: split(path, ITEMSEP))
                                        if(exists(Path(d)/argv0))
@@ -47,6 +48,7 @@ const Path &get_bin_dir(const string &argv0)
                                                break;
                                        }
                        }
+               }
 
                if(exe.empty())
                        exe = realpath(argv0);
@@ -191,7 +193,7 @@ Path path_lookup(const string &name, const vector<Path> &paths)
 
 Path path_lookup(const string &name)
 {
-       const char *path = getenv("PATH");
+       string path = getenv("PATH");
        vector<string> dirs = split(path, ITEMSEP);
        return path_lookup(name, vector<Path>(dirs.begin(), dirs.end()));
 }
index 89d6f576a9dc470e4c0efeabe9024c914ad2fb81..b58b971961e25cdb83db4abe9f51e31c917c0fef 100644 (file)
@@ -1,4 +1,5 @@
 #include <msp/core/application.h>
+#include <msp/core/environ.h>
 #include "dir.h"
 
 using namespace std;
@@ -16,8 +17,8 @@ Path get_home_dir()
        if(len)
                return string(buf, len);
 
-       const char *home = getenv("HOME");
-       if(home)
+       string home = getenv("HOME");
+       if(!home.empty())
                return home;
 
        return ".";
index c980bb27a08bf5f5357299a0072f815b16ddf523..73825875fd4df979ae1b7c5fff619af6982fb133 100644 (file)
@@ -1,5 +1,5 @@
-#include <cstdlib>
 #include <msp/core/application.h>
+#include <msp/core/environ.h>
 #include "dir.h"
 
 using namespace std;
@@ -9,8 +9,8 @@ namespace FS {
 
 Path get_home_dir()
 {
-       const char *home = getenv("HOME");
-       if(home)
+       string home = getenv("HOME");
+       if(!home.empty())
                return home;
        return ".";
 }