? truss.patch Index: sys/kern/kern_fork.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_fork.c,v retrieving revision 1.258 diff -u -r1.258 kern_fork.c --- sys/kern/kern_fork.c 15 Mar 2006 23:24:14 -0000 1.258 +++ sys/kern/kern_fork.c 17 May 2006 08:19:36 -0000 @@ -722,6 +722,13 @@ */ KNOTE_LOCKED(&p1->p_klist, NOTE_FORK | p2->p_pid); + /* + * If fork in parent won't return before child exits, + * inform tracing processes so they may act. + */ + if (flags & RFPPWAIT) + _STOPEVENT(p1, S_FWAIT, p2->p_pid); + PROC_UNLOCK(p1); /* Index: sys/sys/pioctl.h =================================================================== RCS file: /home/ncvs/src/sys/sys/pioctl.h,v retrieving revision 1.14 diff -u -r1.14 pioctl.h --- sys/sys/pioctl.h 7 Jan 2005 02:29:23 -0000 1.14 +++ sys/sys/pioctl.h 17 May 2006 08:19:36 -0000 @@ -65,7 +65,8 @@ # define S_SCX 0x00000008 /* stop on syscall exit */ # define S_CORE 0x00000010 /* stop on coredump */ # define S_EXIT 0x00000020 /* stop on exit */ -# define S_ALLSTOPS 0x003f /* stop on all events */ +# define S_FWAIT 0x00000040 /* stop on fork/wait (vfork) */ +# define S_ALLSTOPS 0x007f /* stop on all events */ /* * If PF_LINGER is set in procp->p_pfsflags, then the last close Index: usr.bin/truss/alpha-fbsd.c =================================================================== RCS file: /home/ncvs/src/usr.bin/truss/alpha-fbsd.c,v retrieving revision 1.19 diff -u -r1.19 alpha-fbsd.c --- usr.bin/truss/alpha-fbsd.c 2 Jan 2006 08:36:25 -0000 1.19 +++ usr.bin/truss/alpha-fbsd.c 17 May 2006 08:19:36 -0000 @@ -161,8 +161,7 @@ if (fsc.name && (trussinfo->flags & FOLLOWFORKS) && ((!strcmp(fsc.name, "fork") - || !strcmp(fsc.name, "rfork") - || !strcmp(fsc.name, "vfork")))) + || !strcmp(fsc.name, "rfork")))) { trussinfo->in_fork = 1; } Index: usr.bin/truss/amd64-fbsd.c =================================================================== RCS file: /home/ncvs/src/usr.bin/truss/amd64-fbsd.c,v retrieving revision 1.6 diff -u -r1.6 amd64-fbsd.c --- usr.bin/truss/amd64-fbsd.c 15 May 2006 22:09:45 -0000 1.6 +++ usr.bin/truss/amd64-fbsd.c 17 May 2006 08:19:36 -0000 @@ -160,8 +160,7 @@ if (fsc.name && (trussinfo->flags & FOLLOWFORKS) && ((!strcmp(fsc.name, "fork") - || !strcmp(fsc.name, "rfork") - || !strcmp(fsc.name, "vfork")))) + || !strcmp(fsc.name, "rfork")))) { trussinfo->in_fork = 1; } Index: usr.bin/truss/i386-fbsd.c =================================================================== RCS file: /home/ncvs/src/usr.bin/truss/i386-fbsd.c,v retrieving revision 1.25 diff -u -r1.25 i386-fbsd.c --- usr.bin/truss/i386-fbsd.c 15 May 2006 21:18:28 -0000 1.25 +++ usr.bin/truss/i386-fbsd.c 17 May 2006 08:19:36 -0000 @@ -166,8 +166,7 @@ if (fsc.name && (trussinfo->flags & FOLLOWFORKS) && ((!strcmp(fsc.name, "fork") - || !strcmp(fsc.name, "rfork") - || !strcmp(fsc.name, "vfork")))) + || !strcmp(fsc.name, "rfork")))) { trussinfo->in_fork = 1; } Index: usr.bin/truss/i386-linux.c =================================================================== RCS file: /home/ncvs/src/usr.bin/truss/i386-linux.c,v retrieving revision 1.25 diff -u -r1.25 i386-linux.c --- usr.bin/truss/i386-linux.c 15 May 2006 21:03:02 -0000 1.25 +++ usr.bin/truss/i386-linux.c 17 May 2006 08:19:36 -0000 @@ -140,8 +140,7 @@ } if (fsc.name && (trussinfo->flags & FOLLOWFORKS) - && ((!strcmp(fsc.name, "linux_fork") - || !strcmp(fsc.name, "linux_vfork")))) + && (!strcmp(fsc.name, "linux_fork"))) { trussinfo->in_fork = 1; } Index: usr.bin/truss/ia64-fbsd.c =================================================================== RCS file: /home/ncvs/src/usr.bin/truss/ia64-fbsd.c,v retrieving revision 1.9 diff -u -r1.9 ia64-fbsd.c --- usr.bin/truss/ia64-fbsd.c 15 May 2006 21:03:02 -0000 1.9 +++ usr.bin/truss/ia64-fbsd.c 17 May 2006 08:19:36 -0000 @@ -155,8 +155,7 @@ if (fsc.name && (trussinfo->flags & FOLLOWFORKS) && ((!strcmp(fsc.name, "fork") - || !strcmp(fsc.name, "rfork") - || !strcmp(fsc.name, "vfork")))) + || !strcmp(fsc.name, "rfork")))) { trussinfo->in_fork = 1; } Index: usr.bin/truss/main.c =================================================================== RCS file: /home/ncvs/src/usr.bin/truss/main.c,v retrieving revision 1.43 diff -u -r1.43 main.c --- usr.bin/truss/main.c 15 May 2006 21:18:28 -0000 1.43 +++ usr.bin/truss/main.c 17 May 2006 08:19:36 -0000 @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -259,7 +260,7 @@ START_TRACE: Procfd = start_tracing( trussinfo->pid, initial_open, - S_EXEC | S_SCE | S_SCX | S_CORE | S_EXIT | + S_EXEC | S_SCE | S_SCX | S_CORE | S_EXIT | S_FWAIT | ((trussinfo->flags & NOSIGS) ? 0 : S_SIG), ((trussinfo->flags & FOLLOWFORKS) ? PF_FORK : 0)); initial_open = 0; @@ -328,6 +329,22 @@ } funcs->exit_syscall(trussinfo, pfs.val); break; + case S_FWAIT: + if ((trussinfo->flags & FOLLOWFORKS) == 0) + break; + /* Fork ourself to trace child */ + int forkpid = fork(); + if (forkpid == 0) { + /* Child truss starts tracing */ + trussinfo->pid = pfs.val; + goto START_TRACE; + } + /* + * Parent truss waits for child so that + * output prints in the right order. + */ + waitpid(forkpid, NULL, 0); + break; case S_SIG: if (trussinfo->flags & FOLLOWFORKS) fprintf(trussinfo->outfile, "%5d: ", Index: usr.bin/truss/sparc64-fbsd.c =================================================================== RCS file: /home/ncvs/src/usr.bin/truss/sparc64-fbsd.c,v retrieving revision 1.9 diff -u -r1.9 sparc64-fbsd.c --- usr.bin/truss/sparc64-fbsd.c 15 May 2006 21:03:02 -0000 1.9 +++ usr.bin/truss/sparc64-fbsd.c 17 May 2006 08:19:36 -0000 @@ -162,8 +162,7 @@ if (fsc.name && (trussinfo->flags & FOLLOWFORKS) && ((!strcmp(fsc.name, "fork") - || !strcmp(fsc.name, "rfork") - || !strcmp(fsc.name, "vfork")))) + || !strcmp(fsc.name, "rfork")))) { trussinfo->in_fork = 1; }