]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) | |
3 | * Licensed under the GPL | |
4 | */ | |
5 | ||
6 | #include <stdio.h> | |
7 | #include <unistd.h> | |
8 | #include <stdlib.h> | |
9 | #include <sched.h> | |
10 | #include <errno.h> | |
11 | #include <sys/wait.h> | |
12 | #include <signal.h> | |
1da177e4 LT |
13 | #include "kern_util.h" |
14 | #include "user.h" | |
15 | #include "ptrace_user.h" | |
16 | #include "os.h" | |
17 | ||
18 | void do_exec(int old_pid, int new_pid) | |
19 | { | |
20 | unsigned long regs[FRAME_SIZE]; | |
21 | int err; | |
22 | ||
23 | if((ptrace(PTRACE_ATTACH, new_pid, 0, 0) < 0) || | |
24 | (ptrace(PTRACE_CONT, new_pid, 0, 0) < 0)) | |
25 | tracer_panic("do_exec failed to attach proc - errno = %d", | |
26 | errno); | |
27 | ||
28 | CATCH_EINTR(err = waitpid(new_pid, 0, WUNTRACED)); | |
29 | if (err < 0) | |
30 | tracer_panic("do_exec failed to attach proc in waitpid - errno = %d", | |
31 | errno); | |
32 | ||
33 | if(ptrace_getregs(old_pid, regs) < 0) | |
34 | tracer_panic("do_exec failed to get registers - errno = %d", | |
35 | errno); | |
36 | ||
37 | os_kill_ptraced_process(old_pid, 0); | |
38 | ||
39 | if (ptrace(PTRACE_OLDSETOPTIONS, new_pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) | |
40 | tracer_panic("do_exec: PTRACE_SETOPTIONS failed, errno = %d", errno); | |
41 | ||
42 | if(ptrace_setregs(new_pid, regs) < 0) | |
43 | tracer_panic("do_exec failed to start new proc - errno = %d", | |
44 | errno); | |
45 | } | |
46 | ||
47 | /* | |
48 | * Overrides for Emacs so that we follow Linus's tabbing style. | |
49 | * Emacs will notice this stuff at the end of the file and automatically | |
50 | * adjust the settings for this buffer only. This must remain at the end | |
51 | * of the file. | |
52 | * --------------------------------------------------------------------------- | |
53 | * Local variables: | |
54 | * c-file-style: "linux" | |
55 | * End: | |
56 | */ |