about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--about.c39
-rw-r--r--externaleditor.c60
-rw-r--r--unix.c27
-rw-r--r--xombrero.c107
-rw-r--r--xombrero.h3
5 files changed, 76 insertions, 160 deletions
diff --git a/about.c b/about.c
index f122817..9305fb6 100644
--- a/about.c
+++ b/about.c
@@ -730,7 +730,6 @@ search_engine_add(char *body, const char *name, const char *url, int select)
 void
 xtp_handle_ab(struct tab *t, uint8_t cmd, int arg)
 {
-	pid_t			pid;
 	char			config[PATH_MAX];
 	char			*cmdstr;
 	char			**sv;
@@ -741,30 +740,20 @@ xtp_handle_ab(struct tab *t, uint8_t cmd, int arg)
 			show_oops(t, "external_editor is unset");
 			break;
 		}
-		switch (pid = fork()) {
-		case -1:
-			/* no process created */
-			show_oops(t, "%s: could not fork process", __func__);
-			break;
-		case 0:
-			/* child */
-			snprintf(config, sizeof config, "%s" PS ".%s",
-			    pwd->pw_dir, XT_CONF_FILE);
-
-			sv = g_strsplit(external_editor, "<file>", -1);
-			cmdstr = g_strjoinv(config, sv);
-			g_strfreev(sv);
-
-			sv = g_strsplit_set(cmdstr, " \t", -1);
-
-			execvp(sv[0], sv);
-			g_strfreev(sv);
-			g_free(cmdstr);
-			_exit(0);
-		default:
-			/* parent */
-			break;
-		}
+
+		snprintf(config, sizeof config, "%s" PS ".%s", pwd->pw_dir,
+		    XT_CONF_FILE);
+		sv = g_strsplit(external_editor, "<file>", -1);
+		cmdstr = g_strjoinv(config, sv);
+		g_strfreev(sv);
+		sv = g_strsplit_set(cmdstr, " \t", -1);
+
+		if (!g_spawn_async(NULL, sv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
+		    NULL, NULL))
+			show_oops(t, "%s: could not spawn process", __func__);
+
+		g_strfreev(sv);
+		g_free(cmdstr);
 		break;
 	default:
 		show_oops(t, "%s, invalid about command", __func__);
diff --git a/externaleditor.c b/externaleditor.c
index b144ab0..65ce4ae 100644
--- a/externaleditor.c
+++ b/externaleditor.c
@@ -26,7 +26,7 @@ struct edit_src_cb_args {
 };
 
 struct open_external_editor_cb_args {
-		int		child_pid;
+		GPid		child_pid;
 		char		*path;
 		time_t		mtime;
 		struct tab	*tab;
@@ -110,7 +110,6 @@ open_external_editor_cb(gpointer data)
 	/* Check if child has terminated */
 	rv = waitpid(args->child_pid, &status, WNOHANG);
 	if (rv == -1 /* || WIFEXITED(status) */) {
-
 		/* Delete the file */
 		unlink(args->path);
 		goto done;
@@ -118,6 +117,7 @@ open_external_editor_cb(gpointer data)
 
 	return (1);
 done:
+	g_spawn_close_pid(args->child_pid);
 	g_free(args->path);
 	g_free(args->cb_data);
 	g_free(args);
@@ -132,15 +132,15 @@ int
 open_external_editor(struct tab *t, const char *contents, const char *suffix,
     int (*callback)(const char *, gpointer), gpointer cb_data)
 {
+	struct stat				st;
 	struct open_external_editor_cb_args	*a;
+	GPid					pid;
 	char					*cmdstr;
 	char					filename[PATH_MAX];
 	char					**sv;
 	int					fd;
 	int					nb, rv;
 	int					cnt;
-	struct stat				st;
-	pid_t					pid;
 
 	if (external_editor == NULL)
 		return (0);
@@ -185,44 +185,34 @@ open_external_editor(struct tab *t, const char *contents, const char *suffix,
 
 	DPRINTF("edit_src: external_editor: %s\n", external_editor);
 
-	/* Launch editor */
-	pid = fork();
-	switch (pid) {
-	case -1:
-		show_oops(t, "can't fork to execute editor");
-		return (1);
-	case 0:
-		break;
-	default:
-		/* parent */
-		a = g_malloc(sizeof(struct open_external_editor_cb_args));
-		a->child_pid = pid;
-		a->path = g_strdup(filename);
-		a->tab = t;
-		a->mtime = st.st_mtime;
-		a->callback = callback;
-		a->cb_data = cb_data;
-
-		/* Check every 100 ms if file has changed */
-		g_timeout_add(100, (GSourceFunc)open_external_editor_cb,
-		    (gpointer)a);
-		return (0);
-	}
-
-	/* child */
 	sv = g_strsplit(external_editor, "<file>", -1);
 	cmdstr = g_strjoinv(filename, sv);
 	g_strfreev(sv);
-
 	sv = g_strsplit_set(cmdstr, " \t", -1);
+	if (!g_spawn_async(NULL, sv, NULL,
+	    (G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD), NULL, NULL, &pid,
+	    NULL)) {
+		show_oops(t, "%s: could not spawn process");
+		g_strfreev(sv);
+		g_free(cmdstr);
+		return (1);
+	}
 
-	DPRINTF("edit_src: Launching program %s\n", cmdstr);
-
-	execvp(sv[0], sv);
+	/* parent */
 	g_strfreev(sv);
 	g_free(cmdstr);
-	_exit(0);
-	/* NOTREACHED */
+
+	a = g_malloc(sizeof(struct open_external_editor_cb_args));
+	a->child_pid = pid;
+	a->path = g_strdup(filename);
+	a->tab = t;
+	a->mtime = st.st_mtime;
+	a->callback = callback;
+	a->cb_data = cb_data;
+
+	/* Check every 100 ms if file has changed */
+	g_timeout_add(100, (GSourceFunc)open_external_editor_cb,
+	    (gpointer)a);
 	return (0);
 }
 
diff --git a/unix.c b/unix.c
index a5a765e..a11344b 100644
--- a/unix.c
+++ b/unix.c
@@ -18,30 +18,3 @@
 
 /* put this here for now, move away if unix needs something special */
 void	(*os_init)(void);
-
-int
-fork_exec(struct tab *t, char *argv0, const gchar *argv1, char *error, int loud)
-{
-
-	if (loud)
-		show_oops(t, "running: %s %s", argv0, argv1);
-
-	switch (fork()) {
-	case -1:
-		show_oops(t, error);
-		return (1);
-		/* NOTREACHED */
-	case 0:
-		break;
-	default:
-		return (0);
-	}
-
-	/* child */
-	execlp(argv0, argv0, argv1, (void *)NULL);
-
-	/* NOTREACHED */
-	_exit(0);
-
-	return (0);
-}
diff --git a/xombrero.c b/xombrero.c
index 712ae52..36c2001 100644
--- a/xombrero.c
+++ b/xombrero.c
@@ -375,45 +375,6 @@ qmarktoindex(char m)
 	return (-1);
 }
 
-#ifndef XT_SIGNALS_DISABLE
-void
-sigchild(int sig)
-{
-	int			saved_errno, status;
-	pid_t			pid;
-
-	saved_errno = errno;
-
-	while ((pid = waitpid(WAIT_ANY, &status, WNOHANG)) != 0) {
-		if (pid == -1) {
-			if (errno == EINTR)
-				continue;
-			if (errno != ECHILD) {
-				/*
-				clog_warn("sigchild: waitpid:");
-				*/
-			}
-			break;
-		}
-
-		if (WIFEXITED(status)) {
-			if (WEXITSTATUS(status) != 0) {
-				/*
-				clog_warnx("sigchild: child exit status: %d",
-				    WEXITSTATUS(status));
-				*/
-			}
-		} else {
-			/*
-			clog_warnx("sigchild: child is terminated abnormally");
-			*/
-		}
-	}
-
-	errno = saved_errno;
-}
-#endif
-
 int
 is_g_object_setting(GObject *o, char *str)
 {
@@ -1436,6 +1397,7 @@ run_page_script(struct tab *t, struct karg *args)
 {
 	const gchar		*uri;
 	char			*tmp, script[PATH_MAX];
+	char			*sv[3];
 
 	tmp = args->s != NULL && strlen(args->s) > 0 ? args->s : default_script;
 	if (tmp[0] == '\0') {
@@ -1450,7 +1412,16 @@ run_page_script(struct tab *t, struct karg *args)
 
 	expand_tilde(script, sizeof script, tmp);
 
-	return (fork_exec(t, script, uri, "can't launch external script", 1));
+	sv[0] = script;
+	sv[1] = (char *)uri;
+	sv[2] = NULL;
+	if (!g_spawn_async(NULL, sv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
+	    NULL, NULL)) {
+		show_oops(t, "%s: could not spawn process", __func__);
+		return (1);
+	}
+	return (0);
+	
 }
 
 int
@@ -3446,25 +3417,19 @@ parse_custom_uri(struct tab *t, const char *uri)
 {
 	struct custom_uri	*u;
 	int			handled = 0;
+	char			*sv[3];
 
 	TAILQ_FOREACH(u, &cul, entry) {
 		if (strncmp(uri, u->uri, strlen(u->uri)))
 			continue;
 
 		handled = 1;
-		switch (fork()) {
-		case -1:
-			show_oops(t, "%s: unable to fork", __func__);
-			break;
-		case 0:
-			/* child */
-			execlp(u->cmd, u->cmd, uri, (char *)0);
-			_exit(0);
-			/* NOTREACHED */
-		default:
-			/* parent */
-			break;
-		}
+		sv[0] = u->cmd;
+		sv[1] = (char *)uri;
+		sv[2] = NULL;
+		if (!g_spawn_async(NULL, sv, NULL, G_SPAWN_SEARCH_PATH, NULL,
+		    NULL, NULL, NULL))
+			show_oops(t, "%s: could not spawn process", __func__);
 	}
 
 	return (handled);
@@ -4924,6 +4889,7 @@ int
 run_mimehandler(struct tab *t, char *mime_type, WebKitNetworkRequest *request)
 {
 	struct mime_type	*m;
+	char			*sv[3];
 
 	m = find_mime_type(mime_type);
 	if (m == NULL)
@@ -4931,9 +4897,14 @@ run_mimehandler(struct tab *t, char *mime_type, WebKitNetworkRequest *request)
 	if (m->mt_download)
 		return (1);
 
-	return (fork_exec(t, m->mt_action,
-	    webkit_network_request_get_uri(request),
-	    "can't launch MIME handler", 0));
+	sv[0] = m->mt_action;
+	sv[1] = (char *)webkit_network_request_get_uri(request);
+	sv[2] = NULL;
+	if (!g_spawn_async(NULL, sv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
+	    NULL, NULL))
+		/* No show_oops here to handle "donothing" example in config */
+		warnx("%s: could not spawn process", __func__);
+	return (0);
 }
 
 char *
@@ -4962,13 +4933,21 @@ int
 run_download_mimehandler(char *mime_type, char *file)
 {
 	struct mime_type	*m;
+	char			*sv[3];
 
 	m = find_mime_type(mime_type);
 	if (m == NULL)
 		return (1);
 
-	return (fork_exec(NULL, m->mt_action, file,
-	    "can't launch download MIME handler", 0));
+	sv[0] = m->mt_action;
+	sv[1] = file;
+	sv[2] = NULL;
+	if (!g_spawn_async(NULL, sv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
+	    NULL, NULL)) {
+		show_oops(NULL, "%s: could not spawn process");
+		return (1);
+	}
+	return (0);
 }
 
 void
@@ -8172,18 +8151,6 @@ main(int argc, char **argv)
 
 	xtp_generate_keys();
 
-	/* XXX this hammer is way too big but treat all signaling the same */
-#ifndef XT_SIGNALS_DISABLE
-	/* signals */
-	struct sigaction	sact;
-
-	bzero(&sact, sizeof(sact));
-	sigemptyset(&sact.sa_mask);
-	sact.sa_handler = sigchild;
-	sact.sa_flags = SA_NOCLDSTOP;
-	sigaction(SIGCHLD, &sact, NULL);
-#endif
-
 	/* set download dir */
 	pwd = getpwuid(getuid());
 	if (pwd == NULL)
diff --git a/xombrero.h b/xombrero.h
index 4e703a8..4dbc2ad 100644
--- a/xombrero.h
+++ b/xombrero.h
@@ -559,9 +559,6 @@ void		input_focus_blur(struct tab *, void *);
 void		*input_check_mode(struct tab *);
 int		command_mode(struct tab *, struct karg *);
 
-/* OS specific */
-int		fork_exec(struct tab *, char *, const gchar *, char *, int);
-
 /* settings */
 #define XT_BM_NORMAL		(0)
 #define XT_BM_WHITELIST		(1)