void process_subprocess_close(struct sol_flow_node *node, void *data) { struct subprocess_data *mdata = data; if (mdata->fork_run) sol_platform_linux_fork_run_stop(mdata->fork_run); if (mdata->watches.in) sol_fd_del(mdata->watches.in); if (mdata->watches.err) sol_fd_del(mdata->watches.err); if (mdata->watches.out) { struct write_data *w; uint16_t i; sol_fd_del(mdata->watches.out); SOL_VECTOR_FOREACH_IDX (&mdata->write_data, w, i) sol_blob_unref(w->blob); sol_vector_clear(&mdata->write_data); } close(mdata->pipes.in[0]); close(mdata->pipes.in[1]); close(mdata->pipes.err[0]); close(mdata->pipes.err[1]); close(mdata->pipes.out[0]); close(mdata->pipes.out[1]); free(mdata->command); }
static void shutdown(void) { if (!did_idle) SOL_WRN("failed to do idle"); if (!did_timeout) SOL_WRN("failed to do timeout"); if (!did_fd) SOL_WRN("failed to do fd"); if (fork_run) sol_platform_linux_fork_run_stop(fork_run); if (pfd[0] > 0) { close(pfd[0]); close(pfd[1]); } if (!did_idle || !did_timeout || !did_fd) exit(EXIT_FAILURE); }
static int dbus_stop(const struct sol_platform_linux_micro_module *mod, const char *service, bool force_immediate) { int err = 0; if (!fork_run) return 0; if (!force_immediate) err = sol_platform_linux_fork_run_send_signal(fork_run, SIGTERM); else { sol_platform_linux_fork_run_stop(fork_run); fork_run = NULL; } if (check_timeout) { sol_timeout_del(check_timeout); check_timeout = NULL; } return err; }
static int bluetooth_stop(const struct sol_platform_linux_micro_module *mod, const char *service, bool force_immediate) { static const char *DBUS = "dbus"; int err = 0; if (!fork_run) return 0; if (!force_immediate) err = sol_platform_linux_fork_run_send_signal(fork_run, SIGTERM); else { sol_platform_linux_fork_run_stop(fork_run); fork_run = NULL; } sol_platform_del_service_monitor (on_dbus_service_state_changed, DBUS, NULL); return err; }