Merge pull request #1444 from spevans/pr_sr_6968

diff --git a/Foundation/ProcessInfo.swift b/Foundation/ProcessInfo.swift
index af3f9aa..e2e8625 100644
--- a/Foundation/ProcessInfo.swift
+++ b/Foundation/ProcessInfo.swift
@@ -41,13 +41,22 @@
         
     }
     
-    
-    internal static var _environment: [String : String] = {
-        return Dictionary<String, String>._unconditionallyBridgeFromObjectiveC(__CFGetEnvironment()._nsObject)
-    }()
-    
     open var environment: [String : String] {
-        return ProcessInfo._environment
+        let equalSign = Character("=")
+        let strEncoding = String.defaultCStringEncoding
+        let envp = _CFEnviron()
+        var env: [String : String] = [:]
+        var idx = 0
+
+        while let entry = envp.advanced(by: idx).pointee {
+            if let entry = String(cString: entry, encoding: strEncoding), let i = entry.index(of: equalSign) {
+                let key = String(entry.prefix(upTo: i))
+                let value = String(entry.suffix(from: i).dropFirst())
+                env[key] = value
+            }
+            idx += 1
+        }
+        return env
     }
     
     open var arguments: [String] {
diff --git a/TestFoundation/TestProcessInfo.swift b/TestFoundation/TestProcessInfo.swift
index 58a5711..efd542c 100644
--- a/TestFoundation/TestProcessInfo.swift
+++ b/TestFoundation/TestProcessInfo.swift
@@ -24,6 +24,7 @@
             ("test_operatingSystemVersion", test_operatingSystemVersion ),
             ("test_processName", test_processName ),
             ("test_globallyUniqueString", test_globallyUniqueString ),
+            ("test_environment", test_environment),
         ]
     }
     
@@ -66,5 +67,41 @@
         XCTAssertEqual(parts[3].utf16.count, 4)
         XCTAssertEqual(parts[4].utf16.count, 12)
     }
-    
+
+    func test_environment() {
+        let preset = ProcessInfo.processInfo.environment["test"]
+        setenv("test", "worked", 1)
+        let postset = ProcessInfo.processInfo.environment["test"]
+        XCTAssertNil(preset)
+        XCTAssertEqual(postset, "worked")
+
+        // Bad values that wont be stored
+        XCTAssertEqual(setenv("", "", 1), -1)
+        XCTAssertEqual(setenv("bad1=", "", 1), -1)
+        XCTAssertEqual(setenv("bad2=", "1", 1) ,-1)
+        XCTAssertEqual(setenv("bad3=", "=2", 1), -1)
+
+        // Good values that will be, check splitting on '='
+        XCTAssertEqual(setenv("var1", "",1 ), 0)
+        XCTAssertEqual(setenv("var2", "=", 1), 0)
+        XCTAssertEqual(setenv("var3", "=x", 1), 0)
+        XCTAssertEqual(setenv("var4", "x=", 1), 0)
+        XCTAssertEqual(setenv("var5", "=x=", 1), 0)
+
+        let env = ProcessInfo.processInfo.environment
+
+        XCTAssertNil(env[""])
+        XCTAssertNil(env["bad1"])
+        XCTAssertNil(env["bad1="])
+        XCTAssertNil(env["bad2"])
+        XCTAssertNil(env["bad2="])
+        XCTAssertNil(env["bad3"])
+        XCTAssertNil(env["bad3="])
+
+        XCTAssertEqual(env["var1"], "")
+        XCTAssertEqual(env["var2"], "=")
+        XCTAssertEqual(env["var3"], "=x")
+        XCTAssertEqual(env["var4"], "x=")
+        XCTAssertEqual(env["var5"], "=x=")
+    }
 }