diff options
author | Rui Abreu Ferreira <raf-ep@gmx.com> | 2014-06-08 19:57:18 +0100 |
---|---|---|
committer | Seth Jackson <sethjackson@gmail.com> | 2015-12-12 22:33:10 -0500 |
commit | 810d31a43001e0955a0a3194998afcc9a0ed33ec (patch) | |
tree | 90ca7f70057a79e5bf5370dc29954262c4f35eff | |
parent | f183cc14de40542899f1bad44943695b0ccf0e5c (diff) | |
download | rneovim-810d31a43001e0955a0a3194998afcc9a0ed33ec.tar.gz rneovim-810d31a43001e0955a0a3194998afcc9a0ed33ec.tar.bz2 rneovim-810d31a43001e0955a0a3194998afcc9a0ed33ec.zip |
Windows: Implement os_setenv() using _putenv_s()
Windows does not have setenv(), instead the _putenv_s() function is used - added
a function check and fatal errors. Implemented os_setenv() for Windows.
Vim supports the original putenv() function if no alternative is available.
Neovim only supports systems where safer alternatives exist, so the check for
putenv() was removed from config/CMakeLists.txt.
-rw-r--r-- | config/CMakeLists.txt | 5 | ||||
-rw-r--r-- | config/config.h.in | 2 | ||||
-rw-r--r-- | src/nvim/os/env.c | 12 |
3 files changed, 17 insertions, 2 deletions
diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index b780291264..3d7660ed58 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -51,7 +51,10 @@ if(JEMALLOC_FOUND) set(HAVE_JEMALLOC 1) endif() -check_function_exists(putenv HAVE_PUTENV) +check_function_exists(_putenv_s HAVE_PUTENV_S) +if(WIN32 AND NOT HAVE_PUTENV_S) + message(SEND_ERROR "_putenv_s() function not found on your system.") +endif() check_function_exists(opendir HAVE_OPENDIR) check_function_exists(readlink HAVE_READLINK) check_function_exists(setenv HAVE_SETENV) diff --git a/config/config.h.in b/config/config.h.in index 7d901180b4..017cb80f2f 100644 --- a/config/config.h.in +++ b/config/config.h.in @@ -29,7 +29,7 @@ #cmakedefine HAVE_LOCALE_H #cmakedefine HAVE_NL_LANGINFO_CODESET #cmakedefine HAVE_NL_MSG_CAT_CNTR -#cmakedefine HAVE_PUTENV +#cmakedefine HAVE_PUTENV_S #cmakedefine HAVE_PWD_H #cmakedefine HAVE_READLINK // TODO: add proper cmake check diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 0e052ced55..a791dca39c 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -46,7 +46,19 @@ bool os_env_exists(const char *name) int os_setenv(const char *name, const char *value, int overwrite) FUNC_ATTR_NONNULL_ALL { +#ifdef HAVE_SETENV return setenv(name, value, overwrite); +#elif defined(HAVE_PUTENV_S) + if (!overwrite && os_getenv(name) != NULL) { + return 0; + } + if (_putenv_s(name, value) == 0) { + return 0; + } + return -1; +#else +# error "This system has no implementation available for os_setenv()" +#endif } /// Unset environment variable |