static pid_t __candidate_pid = -1;
static struct sigaction __prev_sigchld;
static bool __loop_quit;
+static bool __is_candidate = false;
static void __at_exit_to_release_bundle(void)
{
enum hydra_cmd cmd = -1;
int len;
pid_t pid;
- int r;
_D("[hydra] ECORE_FD_READ");
_E("[hydra] unable to fork: %s",
strerror_r(errno, err_str, sizeof(err_str)));
} else if (pid > 0) {
- SECURE_LOGD("[hydra] forked candidate with pid=%d", pid);
+ SECURE_LOGD("[hydra] forked new candidate with pid=%d", pid);
__candidate_pid = pid;
+ __is_candidate = false;
return;
} else {
+ __is_candidate = true;
+
if (sigaction(SIGCHLD, &__prev_sigchld, NULL)) {
_E("[hydra] sigaction failed: %s",
strerror_r(errno, err_str, sizeof(err_str)));
__loader_adapter->loop_quit(__loader_user_data);
- if (__hydra_callbacks->terminate)
- __hydra_callbacks->terminate(__loader_user_data);
-
- r = launchpad_loader_main(__argc, __argv, __loader_callbacks,
- __loader_adapter, __loader_user_data);
- if (r != 0)
- _E("[hydra] launchpad_loader_main failed. Error: %d", r);
-
- exit(r);
+ return;
}
err:
int loader_type;
int loader_id;
int client_fd;
+ int r = -1;
pid_t pid;
struct sigaction new_act;
if (hydra_callbacks->fork)
hydra_callbacks->fork(user_data);
- return launchpad_loader_main(argc, argv, callbacks,
- adapter, user_data);
+ r = launchpad_loader_main(argc, argv, callbacks, adapter, user_data);
+
+ if (r != 0)
+ _E("[hydra] launchpad_loader_main failed. Error: %d", r);
+
+ return r;
} else {
__hydra_callbacks = hydra_callbacks;
__loader_callbacks = callbacks;
__loader_adapter->loop_begin(__loader_user_data);
+ /* At this point, either end of hydra process or start of candidate process main loop */
if (__hydra_callbacks->terminate)
- return __hydra_callbacks->terminate(__loader_user_data);
+ r = __hydra_callbacks->terminate(__loader_user_data);
- return -1;
+ if (__is_candidate) {
+ r = launchpad_loader_main(__argc, __argv, __loader_callbacks,
+ __loader_adapter, __loader_user_data);
+
+ if (r != 0)
+ _E("[hydra] launchpad_loader_main failed. Error: %d", r);
+ }
+
+ return r;
}
return 0;