file.c: rename dirent64 struct to kernel_dirent64 so things compile again with newer libcs
+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
#include <dirent.h>
#ifdef linux
#define dirent kernel_dirent
+#define dirent64 kernel_dirent64
#include <linux/types.h>
#include <linux/dirent.h>
#undef dirent
}
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;
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)
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);
}