diff options
author | Marco Peereboom <marco@conformal.com> | 2011-01-21 21:59:34 +0000 |
---|---|---|
committer | Marco Peereboom <marco@conformal.com> | 2011-01-21 21:59:34 +0000 |
commit | 0d5c55311fa81a877b7e6af6e61d485aee64c0b6 (patch) | |
tree | b141d734fa4bde424e5adb0550f249edf89b27ee | |
parent | bf815f9400b6f3a1625b5b8fc09bfc439e9a20b3 (diff) | |
download | xombrero-0d5c55311fa81a877b7e6af6e61d485aee64c0b6.tar.gz |
reap children; somehow i thought gtk handled that.
might break linux and freebsd because of #include
-rw-r--r-- | xxxterm.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/xxxterm.c b/xxxterm.c index 1e0b1ed..a5605ea 100644 --- a/xxxterm.c +++ b/xxxterm.c @@ -39,8 +39,10 @@ #include <pthread.h> #include <dlfcn.h> #include <errno.h> +#include <signal.h> #include <sys/types.h> +#include <sys/wait.h> #if defined(__linux__) #include "linux/util.h" #include "linux/tree.h" @@ -587,6 +589,43 @@ void update_favicon(struct tab *); int icon_size_map(int); 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; +} + +void load_webkit_string(struct tab *t, const char *str) { /* we set this to indicate we want to manually do navaction */ @@ -6578,6 +6617,7 @@ main(int argc, char *argv[]) char *env_proxy = NULL; FILE *f = NULL; struct karg a; + struct sigaction sact; start_argv = argv; @@ -6635,11 +6675,17 @@ main(int argc, char *argv[]) if (!g_thread_supported()) g_thread_init(NULL); + /* signals */ + bzero(&sact, sizeof(sact)); + sigemptyset(&sact.sa_mask); + sact.sa_handler = sigchild; + sact.sa_flags = SA_NOCLDSTOP; + sigaction(SIGCHLD, &sact, NULL); + + /* set download dir */ pwd = getpwuid(getuid()); if (pwd == NULL) errx(1, "invalid user %d", getuid()); - - /* set download dir */ strlcpy(download_dir, pwd->pw_dir, sizeof download_dir); /* set default string settings */ |