package org.jerlang.kernel.os; import jnr.ffi.Pointer; import jnr.posix.POSIX; import jnr.posix.POSIXFactory; import org.jerlang.erts.erlang.Error; import org.jerlang.type.Atom; import org.jerlang.type.List; import org.jerlang.type.Str; import org.jerlang.type.Term; import com.kenai.jffi.MemoryIO; public class OSGetenv { static { posix = POSIXFactory.getPOSIX(); } private static final POSIX posix; public static Term dispatch(List params) { switch (params.length()) { case 0: return getenv_0(); case 1: return getenv_1(params.head()); case 2: Term varName = params.head(); params = params.tail(); Term defaultValue = params.head(); return getenv_2(varName, defaultValue); default: throw Error.badarg; } } /** * Returns a list of all environment variables. * Each environment variable is given as a single string on the format * "VarName=Value", * where VarName is the name of the variable and Value its value. * * http://www.erlang.org/doc/man/os.html#getenv-0 */ public static List getenv_0() { Pointer env = posix.environ(); List result = List.nil; int offset = 0; while (env.getPointer(offset) != null) { Pointer entryPointer = env.getPointer(offset); String entry = new String(MemoryIO.getInstance().getZeroTerminatedByteArray(entryPointer.address())); result = new List(Str.of(entry), result); offset += jnr.ffi.Runtime.getSystemRuntime().addressSize(); } return result; } /** * Returns the Value of the environment variable VarName, * or false if the environment variable is undefined. * * http://www.erlang.org/doc/man/os.html#getenv-1 */ public static Term getenv_1(Term varName) { return getenv_2(varName, Atom.of("false")); } /** * Returns the Value of the environment variable VarName, * or DefaultValue if the environment variable is undefined. * * http://www.erlang.org/doc/man/os.html#getenv-2 */ public static Term getenv_2(Term varName, Term defaultValue) { String result = posix.getenv(((Str) varName).string()); if (result == null) { return defaultValue; } else { return Str.of(result); } } }