version 1.3, 2002/03/19 07:26:58 |
version 1.4, 2002/06/09 02:44:13 |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
#include <sys/ptrace.h> |
#include <sys/ptrace.h> |
#include <sys/wait.h> |
#include <sys/wait.h> |
|
#include <sys/stat.h> |
|
|
#include <err.h> |
#include <err.h> |
#include <errno.h> |
#include <errno.h> |
#include <signal.h> |
#include <signal.h> |
|
|
return (0); |
return (0); |
} |
} |
|
|
switch (ps->ps_pid = fork()) { |
if (stat(ps->ps_argv[0], &(ps->exec_stat)) < 0) |
case 0: |
err(1, "stat()"); |
if (ptrace(PT_TRACE_ME, getpid(), NULL, 0) != 0) |
|
err(1, "ptrace(PT_TRACE_ME)"); |
if (ps->ps_pid != 0) { |
execvp(*ps->ps_argv, ps->ps_argv); |
/* attach to an already running process */ |
err(1, "exec"); |
if (ptrace(PT_ATTACH, ps->ps_pid, (caddr_t) 0, 0) < 0) |
/* NOTREACHED */ |
err(1, "failed to ptrace process"); |
case -1: |
ps->ps_state = STOPPED; |
err(1, "fork"); |
ps->ps_flags |= PSF_ATCH; |
/* NOTREACHED */ |
|
default: |
|
break; |
|
} |
} |
|
else { |
|
switch (ps->ps_pid = fork()) { |
|
case 0: |
|
if (ptrace(PT_TRACE_ME, getpid(), NULL, 0) != 0) |
|
err(1, "ptrace(PT_TRACE_ME)"); |
|
execvp(*ps->ps_argv, ps->ps_argv); |
|
err(1, "exec"); |
|
/* NOTREACHED */ |
|
case -1: |
|
err(1, "fork"); |
|
/* NOTREACHED */ |
|
default: |
|
break; |
|
} |
|
|
|
ps->ps_state = LOADED; |
|
} |
|
|
if ((ps->ps_flags & PSF_SYMBOLS) == 0) { |
if ((ps->ps_flags & PSF_SYMBOLS) == 0) { |
sym_init_exec(ps, ps->ps_argv[0]); |
sym_init_exec(ps, ps->ps_argv[0]); |
ps->ps_flags |= PSF_SYMBOLS; |
ps->ps_flags |= PSF_SYMBOLS; |
|
|
if (wait(&status) == 0) |
if (wait(&status) == 0) |
err(1, "wait"); |
err(1, "wait"); |
|
|
ps->ps_state = LOADED; |
|
return 0; |
return 0; |
} |
} |
|
|