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
This commit is contained in:
Wichert Akkerman
2000-09-03 21:56:29 +00:00
parent f75a9ab431
commit 9b0c31d663
4 changed files with 32 additions and 7 deletions

View File

@@ -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<47>l Roualland to add

1
file.c
View File

@@ -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

View File

@@ -548,12 +548,18 @@ struct tcb *tcp;
}
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 @@ struct tcb *tcp;
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)

View File

@@ -10,7 +10,7 @@ int
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);
}