/* * Copyright © 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by: Thomas Voß */ #include #include #include #include #include #include namespace core { namespace posix { ChildProcess exec(const std::string& fn, const std::vector& argv, const std::map& env, const StandardStream& flags) { std::function null_function = [](){}; return exec(fn, argv, env, flags, null_function); } ChildProcess exec(const std::string& fn, const std::vector& argv, const std::map& env, const StandardStream& flags, const std::function& child_setup) { return posix::fork([fn, argv, env, child_setup]() { char** it; char** pargv; char** penv; it = pargv = new char*[argv.size()+2]; *it = ::strdup(fn.c_str()); it++; for (auto element : argv) { *it = ::strdup(element.c_str()); it++; } *it = nullptr; it = penv = new char*[env.size()+1]; for (auto pair : env) { *it = ::strdup((pair.first + "=" + pair.second).c_str()); it++; } *it = nullptr; child_setup(); return static_cast(execve(fn.c_str(), pargv, penv)); }, flags); } } }