38bd73f
diff -urp ltrace-0.5-1/ltrace.h ltrace-0.5/ltrace.h
38bd73f
--- ltrace-0.5-1/ltrace.h	2008-10-07 12:05:57.000000000 +0200
38bd73f
+++ ltrace-0.5/ltrace.h	2008-10-07 12:06:20.000000000 +0200
38bd73f
@@ -173,6 +173,7 @@ extern void reinitialize_breakpoints(str
768acb9
 
768acb9
 extern struct process *open_program(char *filename, pid_t pid);
768acb9
 extern void open_pid(pid_t pid, int verbose);
768acb9
+extern void open_forked_pid(pid_t pid);
768acb9
 extern void show_summary(void);
768acb9
 
768acb9
 /* Arch-dependent stuff: */
38bd73f
diff -urp ltrace-0.5-1/ltrace.h.orig ltrace-0.5/ltrace.h.orig
38bd73f
--- ltrace-0.5-1/ltrace.h.orig	2006-06-14 06:55:21.000000000 +0200
38bd73f
+++ ltrace-0.5/ltrace.h.orig	2008-10-07 12:06:19.000000000 +0200
38bd73f
@@ -12,6 +12,7 @@
38bd73f
 #include "sysdep.h"
38bd73f
 
38bd73f
 #define MAX_LIBRARY	30
38bd73f
+#define TRACE_FORK	1
38bd73f
 
38bd73f
 #if defined HAVE_LIBIBERTY || defined HAVE_LIBSUPC__
38bd73f
 # define USE_DEMANGLE
38bd73f
@@ -176,7 +177,7 @@ extern void show_summary(void);
38bd73f
 
38bd73f
 /* Arch-dependent stuff: */
38bd73f
 extern char *pid2name(pid_t pid);
38bd73f
-extern void trace_set_options(struct process *proc, pid_t pid);
38bd73f
+extern void trace_set_options(struct process *proc, pid_t pid, int option);
38bd73f
 extern void trace_me(void);
38bd73f
 extern int trace_pid(pid_t pid);
38bd73f
 extern void untrace_pid(pid_t pid);
38bd73f
@@ -204,5 +205,5 @@ extern void *sym2addr(struct process *, 
38bd73f
 #if 0				/* not yet */
38bd73f
 extern int umoven(struct process *proc, void *addr, int len, void *laddr);
38bd73f
 #endif
38bd73f
-
38bd73f
+extern ulong get_child_pid(pid_t pid);
38bd73f
 #endif
38bd73f
diff -urp ltrace-0.5-1/proc.c ltrace-0.5/proc.c
38bd73f
--- ltrace-0.5-1/proc.c	2008-10-07 12:05:58.000000000 +0200
38bd73f
+++ ltrace-0.5/proc.c	2008-10-07 12:06:20.000000000 +0200
38bd73f
@@ -58,3 +58,11 @@ void open_pid(pid_t pid, int verbose)
38bd73f
 	proc = open_program(filename, 0);
768acb9
 	proc->pid = pid;
768acb9
 }
768acb9
+
768acb9
+void open_forked_pid(pid_t pid)
768acb9
+{
768acb9
+	char *filename = pid2name(pid);
768acb9
+	struct process *proc = open_program(filename, 0);
768acb9
+	proc->pid = pid;
768acb9
+	proc->breakpoints_enabled = -1;
768acb9
+}
38bd73f
Only in ltrace-0.5: proc.c.orig
38bd73f
diff -urp ltrace-0.5-1/testsuite/lib/ltrace.exp ltrace-0.5/testsuite/lib/ltrace.exp
38bd73f
--- ltrace-0.5-1/testsuite/lib/ltrace.exp	2006-03-14 00:12:01.000000000 +0100
38bd73f
+++ ltrace-0.5/testsuite/lib/ltrace.exp	2008-10-07 12:06:20.000000000 +0200
768acb9
@@ -260,7 +260,7 @@ proc ltrace_saveoutput { args } {
768acb9
 proc ltrace_verify_output { file_to_search pattern {instance_no 0}} {
768acb9
 
768acb9
 	# compute the number of PATTERN in FILE_TO_SEARCH by grep and wc.
768acb9
-	catch "exec sh -c {grep $pattern $file_to_search | wc -l ;exit}" output
768acb9
+	catch "exec sh -c {egrep $pattern $file_to_search | wc -l ;exit}" output
768acb9
 	verbose "output = $output"
768acb9
 	
768acb9
 	if { $instance_no == 0 } then {
38bd73f
diff -urp ltrace-0.5-1/testsuite/ltrace.minor/trace-fork.exp ltrace-0.5/testsuite/ltrace.minor/trace-fork.exp
38bd73f
--- ltrace-0.5-1/testsuite/ltrace.minor/trace-fork.exp	2006-03-14 00:12:01.000000000 +0100
38bd73f
+++ ltrace-0.5/testsuite/ltrace.minor/trace-fork.exp	2008-10-07 12:06:20.000000000 +0200
768acb9
@@ -35,6 +35,19 @@ if [regexp {ELF from incompatible archit
768acb9
 
768acb9
 ltrace_saveoutput "${exec_output}" ${srcdir}/${subdir}/${testfile}.ltrace
768acb9
 
768acb9
-set pattern "fork"
768acb9
+if [ regexp {Cannot attach} $exec_output ] {
768acb9
+	fail "Couldn't attach to forked process!"
768acb9
+	return
768acb9
+}
768acb9
+
768acb9
+set pattern "^fork"
768acb9
 ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1
768acb9
 
768acb9
+set pattern {'^\[pid [0-9]*\][ \t]*(printf|puts)'}
768acb9
+ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 2
768acb9
+
768acb9
+set pattern {'^\[pid [0-9]*\][ \t]*wait'}
768acb9
+ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1
768acb9
+
768acb9
+set pattern {'^\[pid [0-9]*\][ \t]*sleep'}
768acb9
+ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1
38bd73f
diff -urp ltrace-0.5-1/wait_for_something.c ltrace-0.5/wait_for_something.c
38bd73f
--- ltrace-0.5-1/wait_for_something.c	2008-10-07 12:05:57.000000000 +0200
38bd73f
+++ ltrace-0.5/wait_for_something.c	2008-10-07 12:06:20.000000000 +0200
38bd73f
@@ -103,7 +103,8 @@ struct event *wait_for_something(void)
768acb9
 		event.e_un.signum = WSTOPSIG(status);
768acb9
 		child_pid = (pid_t) get_child_pid(event.proc->pid);
768acb9
                 if (child_pid){
768acb9
-			open_pid(child_pid,0);
768acb9
+			debug (3, "fork: get_child_pid gave us %d", child_pid);
768acb9
+			open_forked_pid(child_pid);
768acb9
                 }
768acb9
                 enable_all_breakpoints(event.proc);
768acb9
 		continue_after_signal(event.proc->pid, event.e_un.signum);