[PATCH weston v2 3/8] Move the functions launching clients to main.c
Giulio Camuffo
giuliocamuffo at gmail.com
Wed Jun 1 18:43:25 UTC 2016
They belong in the compositor rather than libweston since they
set signals handlers, and a library should not do that behind its
user's back. Besides, they were using functions in main.c already
so they were not usable by other compositors.
Signed-off-by: Giulio Camuffo <giuliocamuffo at gmail.com>
---
ivi-shell/hmi-controller.c | 1 +
src/compositor.c | 144 ----------------------------------------
src/compositor.h | 22 -------
src/main.c | 146 +++++++++++++++++++++++++++++++++++++++++
src/text-backend.c | 1 +
src/weston.h | 22 +++++++
tests/ivi_layout-test-plugin.c | 1 +
tests/weston-test.c | 1 +
xwayland/xwayland.h | 1 +
9 files changed, 173 insertions(+), 166 deletions(-)
diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c
index 97f78af..094682c 100644
--- a/ivi-shell/hmi-controller.c
+++ b/ivi-shell/hmi-controller.c
@@ -62,6 +62,7 @@
#include "ivi-hmi-controller-server-protocol.h"
#include "shared/helpers.h"
#include "shared/xalloc.h"
+#include "src/weston.h"
/*****************************************************************************
* structure, globals
diff --git a/src/compositor.c b/src/compositor.c
index b6ef7f3..2ec2f18 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -236,150 +236,6 @@ weston_output_mode_switch_to_temporary(struct weston_output *output,
}
static void
-child_client_exec(int sockfd, const char *path)
-{
- int clientfd;
- char s[32];
- sigset_t allsigs;
-
- /* do not give our signal mask to the new process */
- sigfillset(&allsigs);
- sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
-
- /* Launch clients as the user. Do not lauch clients with wrong euid.*/
- if (seteuid(getuid()) == -1) {
- weston_log("compositor: failed seteuid\n");
- return;
- }
-
- /* SOCK_CLOEXEC closes both ends, so we dup the fd to get a
- * non-CLOEXEC fd to pass through exec. */
- clientfd = dup(sockfd);
- if (clientfd == -1) {
- weston_log("compositor: dup failed: %m\n");
- return;
- }
-
- snprintf(s, sizeof s, "%d", clientfd);
- setenv("WAYLAND_SOCKET", s, 1);
-
- if (execl(path, path, NULL) < 0)
- weston_log("compositor: executing '%s' failed: %m\n",
- path);
-}
-
-WL_EXPORT struct wl_client *
-weston_client_launch(struct weston_compositor *compositor,
- struct weston_process *proc,
- const char *path,
- weston_process_cleanup_func_t cleanup)
-{
- int sv[2];
- pid_t pid;
- struct wl_client *client;
-
- weston_log("launching '%s'\n", path);
-
- if (os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, sv) < 0) {
- weston_log("weston_client_launch: "
- "socketpair failed while launching '%s': %m\n",
- path);
- return NULL;
- }
-
- pid = fork();
- if (pid == -1) {
- close(sv[0]);
- close(sv[1]);
- weston_log("weston_client_launch: "
- "fork failed while launching '%s': %m\n", path);
- return NULL;
- }
-
- if (pid == 0) {
- child_client_exec(sv[1], path);
- _exit(-1);
- }
-
- close(sv[1]);
-
- client = wl_client_create(compositor->wl_display, sv[0]);
- if (!client) {
- close(sv[0]);
- weston_log("weston_client_launch: "
- "wl_client_create failed while launching '%s'.\n",
- path);
- return NULL;
- }
-
- proc->pid = pid;
- proc->cleanup = cleanup;
- weston_watch_process(proc);
-
- 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)
{
pixman_region32_init_rect(region, INT32_MIN, INT32_MIN,
diff --git a/src/compositor.h b/src/compositor.h
index 1eaa6bf..4b006af 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1605,28 +1605,6 @@ text_backend_init(struct weston_compositor *ec);
void
text_backend_destroy(struct text_backend *text_backend);
-struct weston_process;
-typedef void (*weston_process_cleanup_func_t)(struct weston_process *process,
- int status);
-
-struct weston_process {
- pid_t pid;
- weston_process_cleanup_func_t cleanup;
- struct wl_list link;
-};
-
-struct wl_client *
-weston_client_launch(struct weston_compositor *compositor,
- struct weston_process *proc,
- 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);
-
struct weston_view_animation;
typedef void (*weston_view_animation_done_func_t)(struct weston_view_animation *animation, void *data);
diff --git a/src/main.c b/src/main.c
index bb1dd94..91b951c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -37,6 +37,7 @@
#include <sys/utsname.h>
#include <sys/stat.h>
#include <sys/wait.h>
+#include <sys/socket.h>
#ifdef HAVE_LIBUNWIND
#define UNW_LOCAL_ONLY
@@ -48,6 +49,7 @@
#include "../shared/helpers.h"
#include "git-version.h"
#include "version.h"
+#include "weston.h"
#include "compositor-drm.h"
#include "compositor-headless.h"
@@ -168,12 +170,156 @@ print_backtrace(void)
#endif
+static void
+child_client_exec(int sockfd, const char *path)
+{
+ int clientfd;
+ char s[32];
+ sigset_t allsigs;
+
+ /* do not give our signal mask to the new process */
+ sigfillset(&allsigs);
+ sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
+
+ /* Launch clients as the user. Do not lauch clients with wrong euid.*/
+ if (seteuid(getuid()) == -1) {
+ weston_log("compositor: failed seteuid\n");
+ return;
+ }
+
+ /* SOCK_CLOEXEC closes both ends, so we dup the fd to get a
+ * non-CLOEXEC fd to pass through exec. */
+ clientfd = dup(sockfd);
+ if (clientfd == -1) {
+ weston_log("compositor: dup failed: %m\n");
+ return;
+ }
+
+ snprintf(s, sizeof s, "%d", clientfd);
+ setenv("WAYLAND_SOCKET", s, 1);
+
+ if (execl(path, path, NULL) < 0)
+ weston_log("compositor: executing '%s' failed: %m\n",
+ path);
+}
+
+WL_EXPORT struct wl_client *
+weston_client_launch(struct weston_compositor *compositor,
+ struct weston_process *proc,
+ const char *path,
+ weston_process_cleanup_func_t cleanup)
+{
+ int sv[2];
+ pid_t pid;
+ struct wl_client *client;
+
+ weston_log("launching '%s'\n", path);
+
+ if (os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, sv) < 0) {
+ weston_log("weston_client_launch: "
+ "socketpair failed while launching '%s': %m\n",
+ path);
+ return NULL;
+ }
+
+ pid = fork();
+ if (pid == -1) {
+ close(sv[0]);
+ close(sv[1]);
+ weston_log("weston_client_launch: "
+ "fork failed while launching '%s': %m\n", path);
+ return NULL;
+ }
+
+ if (pid == 0) {
+ child_client_exec(sv[1], path);
+ _exit(-1);
+ }
+
+ close(sv[1]);
+
+ client = wl_client_create(compositor->wl_display, sv[0]);
+ if (!client) {
+ close(sv[0]);
+ weston_log("weston_client_launch: "
+ "wl_client_create failed while launching '%s'.\n",
+ path);
+ return NULL;
+ }
+
+ proc->pid = pid;
+ proc->cleanup = cleanup;
+ weston_watch_process(proc);
+
+ return client;
+}
+
WL_EXPORT void
weston_watch_process(struct weston_process *process)
{
wl_list_insert(&child_process_list, &process->link);
}
+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
log_uname(void)
{
diff --git a/src/text-backend.c b/src/text-backend.c
index ab4667f..743cbc4 100644
--- a/src/text-backend.c
+++ b/src/text-backend.c
@@ -33,6 +33,7 @@
#include <time.h>
#include "compositor.h"
+#include "weston.h"
#include "text-input-unstable-v1-server-protocol.h"
#include "input-method-unstable-v1-server-protocol.h"
#include "shared/helpers.h"
diff --git a/src/weston.h b/src/weston.h
index 88cece9..f2bc1ac 100644
--- a/src/weston.h
+++ b/src/weston.h
@@ -35,6 +35,28 @@ extern "C" {
void
screenshooter_create(struct weston_compositor *ec);
+struct weston_process;
+typedef void (*weston_process_cleanup_func_t)(struct weston_process *process,
+ int status);
+
+struct weston_process {
+ pid_t pid;
+ weston_process_cleanup_func_t cleanup;
+ struct wl_list link;
+};
+
+struct wl_client *
+weston_client_launch(struct weston_compositor *compositor,
+ struct weston_process *proc,
+ 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);
+
#ifdef __cplusplus
}
#endif
diff --git a/tests/ivi_layout-test-plugin.c b/tests/ivi_layout-test-plugin.c
index 80fcdf7..362893e 100644
--- a/tests/ivi_layout-test-plugin.c
+++ b/tests/ivi_layout-test-plugin.c
@@ -33,6 +33,7 @@
#include <assert.h>
#include "src/compositor.h"
+#include "src/weston.h"
#include "weston-test-server-protocol.h"
#include "ivi-test.h"
#include "ivi-shell/ivi-layout-export.h"
diff --git a/tests/weston-test.c b/tests/weston-test.c
index 03e2c54..bda0d91 100644
--- a/tests/weston-test.c
+++ b/tests/weston-test.c
@@ -32,6 +32,7 @@
#include <string.h>
#include "src/compositor.h"
+#include "src/weston.h"
#include "weston-test-server-protocol.h"
#ifdef ENABLE_EGL
diff --git a/xwayland/xwayland.h b/xwayland/xwayland.h
index b1fd904..e09c6f9 100644
--- a/xwayland/xwayland.h
+++ b/xwayland/xwayland.h
@@ -30,6 +30,7 @@
#include <cairo/cairo-xcb.h>
#include "compositor.h"
+#include "weston.h"
#define SEND_EVENT_MASK (0x80)
#define EVENT_TYPE(event) ((event)->response_type & ~SEND_EVENT_MASK)
--
2.8.3
More information about the wayland-devel
mailing list