summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compositor.c60
-rw-r--r--src/compositor.h3
2 files changed, 63 insertions, 0 deletions
diff --git a/src/compositor.c b/src/compositor.c
index 96e3435f..c62077c4 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -319,6 +319,66 @@ weston_client_launch(struct weston_compositor *compositor,
return client;
}
+struct process_info {
+ struct weston_process proc;
+ char *path;
+};
+
+static void
+process_handle_sigchld(struct weston_process *process, int status)
+{
+ struct process_info *pinfo =
+ container_of(process, struct process_info, proc);
+
+ /*
+ * There are no guarantees whether this runs before or after
+ * the wl_client destructor.
+ */
+
+ if (WIFEXITED(status)) {
+ weston_log("%s exited with status %d\n", pinfo->path,
+ WEXITSTATUS(status));
+ } else if (WIFSIGNALED(status)) {
+ weston_log("%s died on signal %d\n", pinfo->path,
+ WTERMSIG(status));
+ } else {
+ weston_log("%s disappeared\n", pinfo->path);
+ }
+
+ free(pinfo->path);
+ free(pinfo);
+}
+
+WL_EXPORT struct wl_client *
+weston_client_start(struct weston_compositor *compositor, const char *path)
+{
+ struct process_info *pinfo;
+ struct wl_client *client;
+
+ pinfo = zalloc(sizeof *pinfo);
+ if (!pinfo)
+ return NULL;
+
+ pinfo->path = strdup(path);
+ if (!pinfo->path)
+ goto out_free;
+
+ client = weston_client_launch(compositor, &pinfo->proc, path,
+ process_handle_sigchld);
+ if (!client)
+ goto out_str;
+
+ return client;
+
+out_str:
+ free(pinfo->path);
+
+out_free:
+ free(pinfo);
+
+ return NULL;
+}
+
static void
region_init_infinite(pixman_region32_t *region)
{
diff --git a/src/compositor.h b/src/compositor.h
index c0fc0a6e..24a97681 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1345,6 +1345,9 @@ weston_client_launch(struct weston_compositor *compositor,
const char *path,
weston_process_cleanup_func_t cleanup);
+struct wl_client *
+weston_client_start(struct weston_compositor *compositor, const char *path);
+
void
weston_watch_process(struct weston_process *process);