Move the Environment portability header to the stdlib header
authorChristopher Dykes <cdykes@fb.com>
Fri, 27 Jan 2017 02:11:24 +0000 (18:11 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Fri, 27 Jan 2017 02:17:56 +0000 (18:17 -0800)
Summary: This completely kills the environment portability header, which was among the earliest, and was created before the general convention of splitting based on the header they are in, in the standard library, existed. The functions that were defined in it are expected to be in stdlib, so move them there.

Reviewed By: mzlee

Differential Revision: D4462502

fbshipit-source-id: c4549b9d1ea623644223db4365b81507f443ad5e

folly/Makefile.am
folly/Subprocess.cpp
folly/experimental/TestUtil.cpp
folly/experimental/test/TestUtilTest.cpp
folly/portability/Environment.cpp [deleted file]
folly/portability/Environment.h [deleted file]
folly/portability/Stdlib.cpp
folly/portability/Stdlib.h

index 80dbbdf140d933a2f564b94d6d2c021831c65b22..b879b2fabf7952da1e926896462fd0219855b881 100644 (file)
@@ -286,7 +286,6 @@ nobase_follyinclude_HEADERS = \
        portability/Config.h \
        portability/Constexpr.h \
        portability/Dirent.h \
-       portability/Environment.h \
        portability/Event.h \
        portability/Fcntl.h \
        portability/GFlags.h \
@@ -475,7 +474,6 @@ libfolly_la_SOURCES = \
        MacAddress.cpp \
        MemoryMapping.cpp \
        portability/Dirent.cpp \
-       portability/Environment.cpp \
        portability/Fcntl.cpp \
        portability/Libgen.cpp \
        portability/Malloc.cpp \
index bf9c4ab05a22dfd15fc69195839c19205aed06a4..6c04e91bddfb45b6eedbb3a44df944d5ab53f4f3 100644 (file)
@@ -41,8 +41,8 @@
 #include <folly/Shell.h>
 #include <folly/String.h>
 #include <folly/io/Cursor.h>
-#include <folly/portability/Environment.h>
 #include <folly/portability/Sockets.h>
+#include <folly/portability/Stdlib.h>
 #include <folly/portability/Unistd.h>
 
 constexpr int kExecFailure = 127;
index aeef414bcc31f04050be0e70fe3a421c16b18cd9..100ed1ae28e102ec031b849bb38b2abcc081dfaf 100644 (file)
@@ -26,8 +26,8 @@
 #include <folly/FileUtil.h>
 #include <folly/Memory.h>
 #include <folly/String.h>
-#include <folly/portability/Environment.h>
 #include <folly/portability/Fcntl.h>
+#include <folly/portability/Stdlib.h>
 #include <folly/portability/Unistd.h>
 
 #ifdef _WIN32
index acf9a1f4a25756cd12821ac9e8636dcc3384bf31..f351fc52d62611c4df6439b2b01fa213bd10bcb2 100644 (file)
@@ -22,9 +22,9 @@
 #include <glog/logging.h>
 
 #include <folly/Memory.h>
-#include <folly/portability/Environment.h>
 #include <folly/portability/Fcntl.h>
 #include <folly/portability/GTest.h>
+#include <folly/portability/Stdlib.h>
 
 using namespace folly;
 using namespace folly::test;
diff --git a/folly/portability/Environment.cpp b/folly/portability/Environment.cpp
deleted file mode 100755 (executable)
index ba31059..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2017 Facebook, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <folly/portability/Environment.h>
-
-#ifdef _WIN32
-#include <Windows.h>
-
-extern "C" {
-
-int setenv(const char* name, const char* value, int overwrite) {
-  if (overwrite == 0 && getenv(name) != nullptr) {
-    return 0;
-  }
-
-  if (*value != '\0') {
-    auto e = _putenv_s(name, value);
-    if (e != 0) {
-      errno = e;
-      return -1;
-    }
-    return 0;
-  }
-
-  // We are trying to set the value to an empty string, but
-  // _putenv_s deletes entries if the value is an empty string,
-  // and just calling SetEnvironmentVariableA doesn't update
-  // _environ, so we have to do these terrible things.
-  if (_putenv_s(name, "  ") != 0) {
-    errno = EINVAL;
-    return -1;
-  }
-
-  // Here lies the documentation we blatently ignore to make
-  // this work >_>...
-  *getenv(name) = '\0';
-  // This would result in a double null termination, which
-  // normally signifies the end of the environment variable
-  // list, so we stick a completely empty environment variable
-  // into the list instead.
-  *(getenv(name) + 1) = '=';
-
-  // If _wenviron is null, the wide environment has not been initialized
-  // yet, and we don't need to try to update it.
-  // We have to do this otherwise we'd be forcing the initialization and
-  // maintenance of the wide environment even though it's never actually
-  // used in most programs.
-  if (_wenviron != nullptr) {
-    wchar_t buf[_MAX_ENV + 1];
-    size_t len;
-    if (mbstowcs_s(&len, buf, _MAX_ENV + 1, name, _MAX_ENV) != 0) {
-      errno = EINVAL;
-      return -1;
-    }
-    *_wgetenv(buf) = u'\0';
-    *(_wgetenv(buf) + 1) = u'=';
-  }
-
-  // And now, we have to update the outer environment to have
-  // a proper empty value.
-  if (!SetEnvironmentVariableA(name, value)) {
-    errno = EINVAL;
-    return -1;
-  }
-  return 0;
-}
-
-int unsetenv(const char* name) {
-  if (_putenv_s(name, "") != 0) {
-    return -1;
-  }
-  return 0;
-}
-}
-#endif
diff --git a/folly/portability/Environment.h b/folly/portability/Environment.h
deleted file mode 100755 (executable)
index d69cad5..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2017 Facebook, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <stdlib.h>
-
-extern "C" {
-#ifndef _WIN32
-extern char** environ;
-#else
-int setenv(const char* name, const char* value, int overwrite);
-int unsetenv(const char* name);
-#endif
-}
index 1a6a7520908af3caca6309f25e1d4f2a5fc23928..013a7d32539d0a2752d46db9a9d40831121572b9 100644 (file)
@@ -70,5 +70,69 @@ char* realpath(const char* path, char* resolved_path) {
   // I sure hope the caller gave us _MAX_PATH space in the buffer....
   return _fullpath(resolved_path, path, _MAX_PATH);
 }
+
+int setenv(const char* name, const char* value, int overwrite) {
+  if (overwrite == 0 && getenv(name) != nullptr) {
+    return 0;
+  }
+
+  if (*value != '\0') {
+    auto e = _putenv_s(name, value);
+    if (e != 0) {
+      errno = e;
+      return -1;
+    }
+    return 0;
+  }
+
+  // We are trying to set the value to an empty string, but
+  // _putenv_s deletes entries if the value is an empty string,
+  // and just calling SetEnvironmentVariableA doesn't update
+  // _environ, so we have to do these terrible things.
+  if (_putenv_s(name, "  ") != 0) {
+    errno = EINVAL;
+    return -1;
+  }
+
+  // Here lies the documentation we blatently ignore to make
+  // this work >_>...
+  *getenv(name) = '\0';
+  // This would result in a double null termination, which
+  // normally signifies the end of the environment variable
+  // list, so we stick a completely empty environment variable
+  // into the list instead.
+  *(getenv(name) + 1) = '=';
+
+  // If _wenviron is null, the wide environment has not been initialized
+  // yet, and we don't need to try to update it.
+  // We have to do this otherwise we'd be forcing the initialization and
+  // maintenance of the wide environment even though it's never actually
+  // used in most programs.
+  if (_wenviron != nullptr) {
+    wchar_t buf[_MAX_ENV + 1];
+    size_t len;
+    if (mbstowcs_s(&len, buf, _MAX_ENV + 1, name, _MAX_ENV) != 0) {
+      errno = EINVAL;
+      return -1;
+    }
+    *_wgetenv(buf) = u'\0';
+    *(_wgetenv(buf) + 1) = u'=';
+  }
+
+  // And now, we have to update the outer environment to have
+  // a proper empty value.
+  if (!SetEnvironmentVariableA(name, value)) {
+    errno = EINVAL;
+    return -1;
+  }
+  return 0;
+}
+
+int unsetenv(const char* name) {
+  if (_putenv_s(name, "") != 0) {
+    return -1;
+  }
+  return 0;
+}
 }
 #endif
index e14d78d391572057422ea8157393d38810c81121..3aca93bfbc53d444c74867e0353814c5a925a6ef 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <cstdlib>
 
+extern "C" {
 #ifdef _WIN32
 // These are technically supposed to be defined linux/limits.h and
 // sys/param.h respectively, but Windows defines _MAX_PATH in stdlib.h,
 #define PATH_MAX _MAX_PATH
 #define MAXPATHLEN _MAX_PATH
 
-extern "C" {
 char* mktemp(char* tn);
 char* mkdtemp(char* tn);
 int mkstemp(char* tn);
 char* realpath(const char* path, char* resolved_path);
-}
+int setenv(const char* name, const char* value, int overwrite);
+int unsetenv(const char* name);
+#else
+extern char** environ;
 #endif
+}