} // namespace
-LaunchpadHydra::LaunchpadHydra(int argc, char** argv)
- : argc_(argc), argv_(argv) {
+LaunchpadHydra::LaunchpadHydra(int argc, char** argv) : argc_(argc) {
if (argc_ < 4) {
_E("Too few arguments");
THROW(-EINVAL);
}
- type_ = argv_[LOADER_ARG_TYPE][0] - '0';
+ type_ = argv[LOADER_ARG_TYPE][0] - '0';
if (type_ < 0 || type_ >= LAUNCHPAD_LOADER_TYPE_MAX) {
_E("Invalid argument. type(%d)", type_);
THROW(-EINVAL);
}
- int hydra_mode = argv_[LOADER_ARG_HYDRA][0] - '0';
+ int hydra_mode = argv[LOADER_ARG_HYDRA][0] - '0';
_D("Hydra mode: %d", hydra_mode);
if (!hydra_mode) {
_W("Run in non hydra mode");
THROW(-EINVAL);
}
- argv_[LOADER_ARG_HYDRA] = const_cast<char*>("0");
- loader_id_ = atoi(argv_[LOADER_ARG_ID]);
+ argv[LOADER_ARG_HYDRA] = const_cast<char*>("0");
+ loader_id_ = atoi(argv[LOADER_ARG_ID]);
- HydraArgs::GetInst().Set(argc_, argv_);
+ HydraArgs::GetInst().Set(argc, argv);
std::string env = std::to_string(
- reinterpret_cast<unsigned long int>(argv_[0]));
+ reinterpret_cast<unsigned long int>(argv[0]));
setenv("TIZEN_LOADER_ARGS", env.c_str(), 1);
+
+ if (!CloneArgs(argc, argv)) {
+ ReleaseArgs();
+ THROW(-ENOMEM);
+ }
}
LaunchpadHydra::~LaunchpadHydra() {
+ ReleaseArgs();
+}
+
+void LaunchpadHydra::ReleaseArgs() {
+ if (argv_ != nullptr) {
+ for (int i = 0; i < argc_; ++i)
+ free(argv_[i]);
+
+ free(argv_);
+ }
+}
+
+bool LaunchpadHydra::CloneArgs(int argc, char** argv) {
+ argv_ = static_cast<char**>(malloc(argc_ * sizeof(char*)));
+ if (argv_ == nullptr) {
+ _E("malloc() is failed");
+ return false;
+ }
+
+ for (int i = 0; i < argc_; ++i) {
+ argv_[i] = strdup(argv[i]);
+ if (argv_[i] == nullptr) {
+ _E("strdup() is failed");
+ return false;
+ }
+
+ if (i != (argc_ - 1))
+ SECURE_LOGD("[%d] %s", i, argv_[i]);
+ }
+
+ return true;
}
void LaunchpadHydra::Run(hydra_lifecycle_callback_s* callback,
int ret = 0;
if (callback_.fork != nullptr) {
- memset(argv_[0], '\0', kLoaderArgMax);
- snprintf(argv_[0], kLoaderArgMax, "%s candidate", argv[0]);
+ char** hydra_args = HydraArgs::GetInst().GetArgs();
+ memset(hydra_args[0], '\0', kLoaderArgMax);
+ snprintf(hydra_args[0], kLoaderArgMax, "%s candidate", argv[0]);
ret = callback_.fork(argc, argv, user_data_);
}