version 1.7, 2002/06/05 18:02:27 |
version 1.8, 2002/06/09 02:44:13 |
|
|
{ |
{ |
extern char *__progname; |
extern char *__progname; |
|
|
fprintf(stderr, "Usage: %s [-c core] <program> args\n", __progname); |
fprintf(stderr, "Usage: %s [-c core] [-p pid] <program> args\n", __progname); |
exit(1); |
exit(1); |
} |
} |
|
|
|
|
int i, c; |
int i, c; |
int status; |
int status; |
void *cm; |
void *cm; |
char *pmenv, *core; |
char *pmenv, *core, *perr; |
int level; |
int level; |
|
pid_t pid; |
|
|
if (argc < 2) { |
if (argc < 2) { |
usage(); |
usage(); |
} |
} |
|
|
core = NULL; |
core = NULL; |
|
pid = 0; |
|
|
while ((c = getopt(argc, argv, "c:")) != -1) { |
while((c = getopt(argc, argv, "c:p:")) != -1) { |
switch(c) { |
switch(c) { |
case 'c': |
case 'c': |
core = optarg; |
core = optarg; |
break; |
break; |
|
case 'p': |
|
pid = (pid_t) strtol(optarg, &perr, 10); |
|
if(*perr != '\0') |
|
errx(1, "invalid PID"); |
|
break; |
case '?': |
case '?': |
default: |
default: |
usage(); |
usage(); |
|
|
asprintf(&pmenv, "%d", level); |
asprintf(&pmenv, "%d", level); |
setenv("IN_PMDB", pmenv, 1); |
setenv("IN_PMDB", pmenv, 1); |
|
|
ps.ps_pid = 0; |
ps.ps_pid = pid; |
ps.ps_state = NONE; |
ps.ps_state = NONE; |
ps.ps_argc = argc; |
ps.ps_argc = argc; |
ps.ps_argv = argv; |
ps.ps_argv = argv; |
|
|
{ |
{ |
struct pstate *ps = arg; |
struct pstate *ps = arg; |
|
|
ps->ps_flags |= PSF_KILL; |
if ((ps->ps_flags & PSF_ATCH)) { |
|
if ((ps->ps_flags & PSF_ATCH) && |
|
ptrace(PT_DETACH, ps->ps_pid, NULL, 0) < 0) |
|
err(1, "ptrace(PT_DETACH)"); |
|
} else { |
|
ps->ps_flags |= PSF_KILL; |
|
|
if (process_kill(ps)) |
if (process_kill(ps)) |
return 1; |
return 1; |
|
} |
|
|
ps->ps_state = TERMINATED; |
ps->ps_state = TERMINATED; |
return 1; |
return 1; |