[PATCH weston 08/15] libweston: move the child process launching and monitoring to weston

Giulio Camuffo giuliocamuffo at gmail.com
Thu Nov 6 12:41:27 PST 2014


libweston still internally uses those functions, so it is not linkable
yet by other compositors.
---
 src/compositor.c | 144 ------------------------------------------------------
 src/weston.c     | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 145 insertions(+), 144 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index 1c41fb0..80283f1 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -222,150 +222,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/weston.c b/src/weston.c
index 9a42cac..566bee0 100644
--- a/src/weston.c
+++ b/src/weston.c
@@ -33,6 +33,7 @@
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <sys/time.h>
+#include <sys/socket.h>
 
 #ifdef HAVE_LIBUNWIND
 #define UNW_LOCAL_ONLY
@@ -237,6 +238,150 @@ weston_watch_process(struct weston_process *process)
 }
 
 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
 log_uname(void)
 {
 	struct utsname usys;
-- 
2.1.3



More information about the wayland-devel mailing list