struct AttachConfig {
/// Arguments passed by user, argv[0] is the binary's path in container
- std::vector<const char*> argv;
+ std::vector<std::string> argv;
/// PID of the container's init process
pid_t initPid;
AttachConfig() = default;
- AttachConfig(const std::vector<const char*>& argv,
+ AttachConfig(const std::vector<std::string>& argv,
const pid_t initPid,
const std::vector<Namespace>& namespaces,
const uid_t uid,
CONFIG_REGISTER
(
//TODO: Uncomment and fix cstring serialization
- // argv,
+ argv,
initPid,
- //TODO: Uncomment and fix Namespace serialization (or remove Namespace)
- // namespaces,
+ namespaces,
uid,
gid,
ttyFD,
supplementaryGids,
capsToKeep,
workDirInContainer,
- envToKeep
- //TODO: Uncomment and fix std::pair serialization
- // envToSet
+ envToKeep,
+ envToSet
)
};
::_exit(EXIT_FAILURE);
}
- // Run user's binary
- ::execve(config.argv[0], const_cast<char *const*>(config.argv.data()), nullptr);
+ lxcpp::execve(config.argv);
+
return EXIT_FAILURE;
}
namespace lxcpp {
Attach::Attach(const lxcpp::ContainerImpl& container,
- const std::vector<const char*>& argv,
+ const std::vector<std::string>& argv,
const uid_t uid,
const gid_t gid,
const std::string& ttyPath,
* @param envToSet new environment variables that will be set
*/
Attach(const lxcpp::ContainerImpl& container,
- const std::vector<const char*>& argv,
+ const std::vector<std::string>& argv,
const uid_t uid,
const gid_t gid,
const std::string& ttyPath,
throw NotImplementedException();
}
-void ContainerImpl::attach(const std::vector<const char*>& argv,
+void ContainerImpl::attach(const std::vector<std::string>& argv,
const std::string& cwdInContainer)
{
Attach attach(*this,
void reboot();
// Other
- void attach(const std::vector<const char*>& argv,
+ void attach(const std::vector<std::string>& argv,
const std::string& cwdInContainer);
// Network interfaces setup/config
virtual void reboot() = 0;
// Other
- virtual void attach(const std::vector<const char*>& argv,
+ virtual void attach(const std::vector<std::string>& argv,
const std::string& cwdInContainer) = 0;
// Network interfaces setup/config
void startContainer(const ContainerConfig &cfg)
{
- std::vector<char const *> argv;
- argv.reserve(cfg.mInit.size() + 1);
- for (auto const & it : cfg.mInit) {
- argv.push_back(it.c_str());
- }
- argv.push_back(nullptr);
-
- LOGD("Executing container's init: " << argv[0]);
- ::execve(argv[0], const_cast<char *const*>(argv.data()), NULL);
- ::_exit(EXIT_FAILURE);
+ lxcpp::execve(cfg.mInit);
}
int startGuard(int channelFD)
throw ProcessSetupException(msg);
}
}
+
+void execve(const std::vector<std::string>& argv)
+{
+ // Prepare the arguments
+ std::vector<char const *> tmpArgv;
+ tmpArgv.reserve(argv.size() + 1);
+
+ for (auto const &str : argv) {
+ tmpArgv.push_back(str.c_str());
+ }
+ tmpArgv.push_back(nullptr);
+
+ // Run user's binary
+ ::execve(tmpArgv[0], const_cast<char *const*>(tmpArgv.data()), nullptr);
+}
+
} // namespace lxcpp
void unshare(const Namespace ns);
+void execve(const std::vector<std::string>& argv);
+
} // namespace lxcpp
#endif // LXCPP_PROCESS_HPP
\ No newline at end of file