process.c: perform bpt trick for clone as well so we can get the pid of the child before it starts doing something
file.c: rename dirent64 struct to kernel_dirent64 so things compile again with newer libcs
diff --git a/ChangeLog b/ChangeLog
index 7f6d438..114c222 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2000-09-03 Wichert Akkerman <wakkerma@debian.org>
+
+ * process.c: perform bpt trick for clone as well so we can get the
+ pid of the child before it starts doing something
+ * file.c: rename dirent64 struct to kernel_dirent64 so things compile
+ again with newer libcs
+
2000-09-01 Wichert Akkerman <wakkerma@debian.org>
* lots of files: merge patch from Gaël Roualland to add
diff --git a/file.c b/file.c
index a74beda..911090c 100644
--- a/file.c
+++ b/file.c
@@ -35,6 +35,7 @@
#include <dirent.h>
#ifdef linux
#define dirent kernel_dirent
+#define dirent64 kernel_dirent64
#include <linux/types.h>
#include <linux/dirent.h>
#undef dirent
diff --git a/process.c b/process.c
index dda3b9e..47fc87d 100644
--- a/process.c
+++ b/process.c
@@ -548,12 +548,18 @@
}
tcp->flags |= TCB_FOLLOWFORK;
- tcp->u_arg[0] |= CLONE_PTRACE;
- setarg(tcp, 0);
+
+ if (setbpt(tcp) < 0)
+ return 0;
} else {
+ int bpt = tcp->flags & TCB_BPTSET;
+
if (!(tcp->flags & TCB_FOLLOWFORK))
return 0;
+ if (bpt)
+ clearbpt(tcp);
+
if (syserror(tcp))
return 0;
@@ -564,10 +570,21 @@
return 0;
}
- /* For fork we need to re-attach, but thanks to CLONE_PTRACE we're
- * already attached.
- */
+ /* Attach to the new child */
+ if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
+ perror("PTRACE_ATTACH");
+ fprintf(stderr, "Too late?\n");
+ droptcb(tcpchild);
+ return 0;
+ }
+
tcpchild->flags |= TCB_ATTACHED;
+ if (bpt) {
+ tcpchild->flags |= TCB_BPTSET;
+ tcpchild->baddr = tcp->baddr;
+ memcpy(tcpchild->inst, tcp->inst,
+ sizeof tcpchild->inst);
+ }
newoutf(tcpchild);
tcp->nchildren++;
if (!qflag)
diff --git a/test/clone.c b/test/clone.c
index 1395b6b..75bc545 100644
--- a/test/clone.c
+++ b/test/clone.c
@@ -10,7 +10,7 @@
main()
{
char stack[4096];
- if (clone(child, stack+4000, CLONE_VM|CLONE_FS|CLONE_FILES, NULL) != 0)
- write(1, "original\n", 9);
+ clone(child, stack+4000, CLONE_VM|CLONE_FS|CLONE_FILES, NULL);
+ write(1, "original\n", 9);
exit(0);
}