ash: make "jobs | cat" work like in bash (was giving empty output)
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 15 Jul 2007 01:13:25 +0000 (01:13 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 15 Jul 2007 01:13:25 +0000 (01:13 -0000)
shell/ash.c

index 6173a25..06c4698 100644 (file)
@@ -4374,8 +4374,10 @@ clear_traps(void)
                }
        }
 }
-/* lives far away from here, needed for forkchild */
+
+/* Lives far away from here, needed for forkchild */
 static void closescript(void);
+/* Called after fork(), in child */
 static void
 forkchild(struct job *jp, union node *n, int mode)
 {
@@ -4419,11 +4421,18 @@ forkchild(struct job *jp, union node *n, int mode)
                setsignal(SIGQUIT);
                setsignal(SIGTERM);
        }
+#if JOBS
+       /* For "jobs | cat" to work like in bash, we must retain list of jobs
+        * in child, but we do need to remove ourself */
+       freejob(jp);
+#else
        for (jp = curjob; jp; jp = jp->prev_job)
                freejob(jp);
+#endif
        jobless = 0;
 }
 
+/* Called after fork(), in parent */
 static void
 forkparent(struct job *jp, union node *n, int mode, pid_t pid)
 {