diff options
-rw-r--r-- | about.c | 39 | ||||
-rw-r--r-- | externaleditor.c | 60 | ||||
-rw-r--r-- | unix.c | 27 | ||||
-rw-r--r-- | xombrero.c | 107 | ||||
-rw-r--r-- | xombrero.h | 3 |
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) |