about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--extrace.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/extrace.c b/extrace.c
index a00a1db..99c4aeb 100644
--- a/extrace.c
+++ b/extrace.c
@@ -92,6 +92,7 @@
 #define CMDLINE_MAX 32768
 #define CMDLINE_DB_MAX 32
 pid_t parent = 1;
+pid_t child;
 int flat = 0;
 int run = 0;
 int full_path = 0;
@@ -242,10 +243,16 @@ sig2name(int sig)
 static void
 sigchld(int sig)
 {
+        int old_errno = errno;
+	pid_t pid;
+
 	(void)sig;
-	while (waitpid(-1, NULL, WNOHANG) > 0)
-		;
-	quit = 1;
+
+	while ((pid = waitpid(-1, NULL, WNOHANG)) > 0)
+		if (pid == child)
+			quit = 1;
+
+	errno = old_errno;
 }
 
 static void
@@ -386,6 +393,10 @@ handle_msg(struct cn_msg *cn_hdr)
 			r3 = readlinkat(proc_dir_fd, "cwd", cwd, sizeof cwd);
 			if (r3 > 0)
 				cwd[r3] = 0;
+			else if (errno == EACCES)
+				strcpy(cwd, "EACCES");
+			else
+				strcpy(cwd, "EUNKNOWN");
 		}
 
 		if (!flat)
@@ -588,8 +599,6 @@ usage:
 	}
 
 	if (optind != argc) {
-		pid_t child;
-
 		parent = getpid();
 		signal(SIGCHLD, sigchld);