ProcessEnvironment.java revision 3909
7321N/A * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 7321N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 7321N/A * This code is free software; you can redistribute it and/or modify it 7321N/A * under the terms of the GNU General Public License version 2 only, as 7321N/A * published by the Free Software Foundation. Oracle designates this 7321N/A * particular file as subject to the "Classpath" exception as provided 7321N/A * by Oracle in the LICENSE file that accompanied this code. 7321N/A * This code is distributed in the hope that it will be useful, but WITHOUT 7321N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 7321N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 7321N/A * version 2 for more details (a copy is included in the LICENSE file that 7321N/A * You should have received a copy of the GNU General Public License version 7321N/A * 2 along with this work; if not, write to the Free Software Foundation, 7321N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 7321N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 7321N/A * or visit www.oracle.com if you need additional information or have any 7321N/A/* We use APIs that access a so-called Windows "Environment Block", 7321N/A * which looks like an array of jchars like this: 7321N/A * FOO=BAR\u0000 ... GORP=QUUX\u0000\u0000 7321N/A * This data structure has a number of peculiarities we must contend with: 7321N/A * - The NUL jchar separators, and a double NUL jchar terminator. 7321N/A * It appears that the Windows implementation requires double NUL 7321N/A * termination even if the environment is empty. We should always 7321N/A * generate environments with double NUL termination, while accepting 7321N/A * empty environments consisting of a single NUL. 7321N/A * - on Windows9x, this is actually an array of 8-bit chars, not jchars, 7321N/A * encoded in the system default encoding. 7321N/A * - The block must be sorted by Unicode value, case-insensitively, 7321N/A * as if folded to upper case. 7321N/A * - There are magic environment variables maintained by Windows 7321N/A * that start with a `=' (!) character. These are used for 7321N/A * Windows drive current directory (e.g. "=C:=C:\WINNT") or the 7321N/A * exit code of the last command (e.g. "=ExitCode=0000001"). 7321N/A * Since Java and non-9x Windows speak the same character set, and 7321N/A * even the same encoding, we don't have to deal with unreliable 7321N/A * conversion to byte streams. Just add a few NUL terminators. 7321N/A * System.getenv(String) is case-insensitive, while System.getenv() 7321N/A * returns a map that is case-sensitive, which is consistent with 7321N/A * The non-private methods in this class are not for general use even 7321N/A * within this package. Instead, they are the system-dependent parts 7321N/A * of the system-independent method of the same name. Don't even 7321N/A * think of using this class unless your method's name appears below. 7321N/A // An initial `=' indicates a magic Windows variable name -- OK 7321N/A (
"Invalid environment variable name: \"" +
name +
"\"");
7321N/A (
"Invalid environment variable value: \"" +
value +
"\"");
7321N/A // We can't use String.compareToIgnoreCase since it 7321N/A // canonicalizes to lower case, while Windows 7321N/A // canonicalizes to upper case! For example, "_" should 7321N/A // sort *after* "Z", not before. 7321N/A // No overflow because of numeric promotion 7321N/A // Allow `=' as first char in name, e.g. =C:=C:\DIR 7321N/A // An initial `=' indicates a magic Windows variable name -- OK 7321N/A // Ignore corrupted environment strings. 7321N/A // Only for use by System.getenv(String) 7321N/A // The original implementation used a native call to _wgetenv, 7321N/A // but it turns out that _wgetenv is only consistent with 7321N/A // GetEnvironmentStringsW (for non-ASCII) if `wmain' is used 7321N/A // instead of `main', even in a process created using 7321N/A // CREATE_UNICODE_ENVIRONMENT. Instead we perform the 7321N/A // case-insensitive comparison ourselves. At least this 7321N/A // guarantees that System.getenv().get(String) will be 7321N/A // consistent with System.getenv(String). 7321N/A // Only for use by System.getenv() 7321N/A // Only for use by ProcessBuilder.environment() 7321N/A // Only for use by Runtime.exec(...String[]envp...) 7321N/A // Only for use by ProcessImpl.start() 7321N/A // Sort Unicode-case-insensitively by name 7321N/A // Ensure double NUL termination, 7321N/A // even if environment is empty.