Commit c847b1b4 authored by Matt Glazar's avatar Matt Glazar Committed by Facebook Github Bot

Fix environ enumeration on Apple platforms

Summary:
environ is documented to not work very well from .dylib-s (dynamic libraries) on macOS. Use the _NSGetEnviron function instead to get a pointer to environ.

<crt_externs.h> is missing from some iOS SDKs, so forward-declare _NSGetEnviron in such cases.

Reviewed By: Orvid, mzlee

Differential Revision: D4491044

fbshipit-source-id: 886d19bdd63dea14225992446b7ba132faf35054
parent c10a6640
......@@ -18,6 +18,12 @@
#include <cstdlib>
#if defined(__APPLE__)
#if __has_include(<crt_externs.h>)
#include <crt_externs.h>
#endif
#endif
extern "C" {
#ifdef _WIN32
// These are technically supposed to be defined linux/limits.h and
......@@ -35,6 +41,10 @@ char* realpath(const char* path, char* resolved_path);
int setenv(const char* name, const char* value, int overwrite);
int unsetenv(const char* name);
#elif defined(__APPLE__)
extern char** environ;
// environ doesn't work well with dylibs, so use _NSGetEnviron instead.
#if !__has_include(<crt_externs.h>)
char*** _NSGetEnviron(void);
#endif
#define environ (*_NSGetEnviron())
#endif
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment