/** * Converts an environment to a string used by CreateProcess(). * * Converts the environment's contents to the format used by the * CreateProcess() system call. The returned char* string is * allocated in dynamic memory; the caller must free it when not * used any more. This is enforced by the use of a shared pointer. * * \return A dynamically allocated char* string that represents * the environment's content. This string is of the form * var1=value1\\0var2=value2\\0\\0. */ inline boost::shared_array<char> environment_to_win32_strings(const environment &env) { boost::shared_array<char> envp; if (env.empty()) { envp.reset(new char[2]); ::ZeroMemory(envp.get(), 2); } else { std::string s; for (environment::const_iterator it = env.begin(); it != env.end(); ++it) { s += it->first + "=" + it->second; s.push_back(0); } envp.reset(new char[s.size() + 1]); #if defined(__CYGWIN__) || defined(_SCL_SECURE_NO_DEPRECATE) ::memcpy(envp.get(), s.c_str(), s.size() + 1); #else ::memcpy_s(envp.get(), s.size() + 1, s.c_str(), s.size() + 1); #endif } return envp; }
/** * Converts an environment to a char** table as used by execve(). * * Converts the environment's contents to the format used by the * execve() system call. The returned char** array is allocated * in dynamic memory; the caller must free it when not used any * more. Each entry is also allocated in dynamic memory and is a * NULL-terminated string of the form var=value; these must also be * released by the caller. * * This operation is only available on POSIX systems. * * \return The first argument of the pair is an integer that indicates * how many strings are stored in the second argument. The * second argument is a NULL-terminated, dynamically allocated * array of dynamically allocated strings representing the * enviroment's content. Each array entry is a NULL-terminated * string of the form var=value. The caller is responsible for * freeing them. */ inline std::pair<std::size_t, char **> environment_to_envp(const environment &env) { std::size_t nargs = env.size(); char **envp = new char *[nargs + 1]; environment::size_type i = 0; for (environment::const_iterator it = env.begin(); it != env.end(); ++it) { std::string s = it->first + "=" + it->second; envp[i] = new char[s.size() + 1]; std::strncpy(envp[i], s.c_str(), s.size() + 1); ++i; } envp[i] = 0; return std::pair<std::size_t, char **>(nargs, envp); } // environment_to_envp