clean up when finished.
don't set PLAN9 don't set PLAN9
This commit is contained in:
parent
e15e6c0820
commit
1b135a7805
45 changed files with 294 additions and 60 deletions
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
TARG=factotum
|
TARG=factotum
|
||||||
|
|
|
||||||
|
|
@ -243,11 +243,6 @@ void limread(struct xy *p, int *argcp, char ***argvp){
|
||||||
p->xqf = 1;
|
p->xqf = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
isdigit(char c){
|
|
||||||
return '0'<=c && c<='9';
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
numb(float *np, int *argcp, char ***argvp){
|
numb(float *np, int *argcp, char ***argvp){
|
||||||
char c;
|
char c;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
TARG=graph
|
TARG=graph
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
# Calling this grep breaks a LOT. Like egrep on Linux.
|
# Calling this grep breaks a LOT. Like egrep on Linux.
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
HFILES=\
|
HFILES=\
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
TARG=hoc
|
TARG=hoc
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
TARG=mk
|
TARG=mk
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=../libplot.a
|
LIB=../libplot.a
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ struct penvir E[9] = {
|
||||||
{ 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}
|
{ 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}
|
||||||
};
|
};
|
||||||
struct penvir *e0 = E, *e1 = &E[1], *esave;
|
struct penvir *e0 = E, *e1 = &E[1], *esave;
|
||||||
|
int
|
||||||
bcolor(char *s){
|
bcolor(char *s){
|
||||||
int c;
|
int c;
|
||||||
while (*s != NULL) {
|
while (*s != NULL) {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
TARG=plot
|
TARG=plot
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
TARG=plumber plumb
|
TARG=plumber plumb
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
YACC=yacc -d
|
YACC=yacc -d
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
OFILES=\
|
OFILES=\
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
TARG=sam
|
TARG=sam
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
TARG=samterm
|
TARG=samterm
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
TARG=sprog
|
TARG=sprog
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIBFILES=\
|
LIBFILES=\
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIBOFILES=\
|
LIBOFILES=\
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libfmt.a
|
LIB=libfmt.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=lib9.a
|
LIB=lib9.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libutf.a
|
LIB=libutf.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=lib9p.a
|
LIB=lib9p.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libString.a
|
LIB=libString.a
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#include <libc.h>
|
#include <libc.h>
|
||||||
#include "libString.h"
|
#include "libString.h"
|
||||||
|
|
||||||
|
#undef isspace
|
||||||
#define isspace(c) ((c)==' ' || (c)=='\t' || (c)=='\n')
|
#define isspace(c) ((c)==' ' || (c)=='\t' || (c)=='\n')
|
||||||
|
|
||||||
/* Get the next field from a String. The field is delimited by white space,
|
/* Get the next field from a String. The field is delimited by white space,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libbin.a
|
LIB=libbin.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libbio.a
|
LIB=libbio.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libcomplete.a
|
LIB=libcomplete.a
|
||||||
|
|
|
||||||
|
|
@ -29,13 +29,6 @@ chantostr(char *buf, u32int cc)
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* avoid pulling in ctype when using with drawterm etc. */
|
|
||||||
static int
|
|
||||||
isspace(char c)
|
|
||||||
{
|
|
||||||
return c==' ' || c== '\t' || c=='\r' || c=='\n';
|
|
||||||
}
|
|
||||||
|
|
||||||
u32int
|
u32int
|
||||||
strtochan(char *s)
|
strtochan(char *s)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libdraw.a
|
LIB=libdraw.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libflate.a
|
LIB=libflate.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libframe.a
|
LIB=libframe.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libfs.a
|
LIB=libfs.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libhttpd.a
|
LIB=libhttpd.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libip.a
|
LIB=libip.a
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,318 @@
|
||||||
/*
|
/*
|
||||||
* process interface for FreeBSD
|
* process interface for FreeBSD
|
||||||
|
*
|
||||||
|
* we could be a little more careful about not using
|
||||||
|
* ptrace unless absolutely necessary. this would let us
|
||||||
|
* look at processes without stopping them.
|
||||||
|
*
|
||||||
|
* I'd like to make this a bit more generic (there's too much
|
||||||
|
* duplication with Linux and presumably other systems),
|
||||||
|
* but ptrace is too damn system-specific.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <u.h>
|
#include <u.h>
|
||||||
#include <sys/ptrace.h>
|
#include <sys/ptrace.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
#include <machine/reg.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <libc.h>
|
#include <libc.h>
|
||||||
#include <mach.h>
|
#include <mach.h>
|
||||||
#include "ureg386.h"
|
#include "ureg386.h"
|
||||||
|
|
||||||
|
Mach *machcpu = &mach386;
|
||||||
|
|
||||||
|
typedef struct PtraceRegs PtraceRegs;
|
||||||
|
struct PtraceRegs
|
||||||
|
{
|
||||||
|
Regs r;
|
||||||
|
int pid;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int ptracerw(Map*, Seg*, ulong, void*, uint, int);
|
||||||
|
static int ptraceregrw(Regs*, char*, ulong*, int);
|
||||||
|
|
||||||
void
|
void
|
||||||
unmapproc(Map*)
|
unmapproc(Map *map)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(map == nil)
|
||||||
|
return;
|
||||||
|
for(i=0; i<map->nseg; i++)
|
||||||
|
while(i<map->nseg && map->seg[i].pid){
|
||||||
|
map->nseg--;
|
||||||
|
memmove(&map->seg[i], &map->seg[i+1],
|
||||||
|
(map->nseg-i)*sizeof(map->seg[0]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
mapproc(int, Map*, Regs**)
|
mapproc(int pid, Map *map, Regs **rp)
|
||||||
{
|
{
|
||||||
|
Seg s;
|
||||||
|
PtraceRegs *r;
|
||||||
|
|
||||||
|
if(ptrace(PT_ATTACH, pid, 0, 0) < 0)
|
||||||
|
if(ptrace(PT_READ_I, pid, 0, 0)<0 && errno!=EINVAL)
|
||||||
|
if(ptrace(PT_ATTACH, pid, 0, 0) < 0){
|
||||||
|
werrstr("ptrace attach %d: %r", pid);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctlproc(pid, "waitanyway") < 0){
|
||||||
|
ptrace(PT_DETACH, pid, 0, 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&s, 0, sizeof s);
|
||||||
|
s.base = 0;
|
||||||
|
s.size = 0xFFFFFFFF;
|
||||||
|
s.offset = 0;
|
||||||
|
s.name = "data";
|
||||||
|
s.file = nil;
|
||||||
|
s.rw = ptracerw;
|
||||||
|
s.pid = pid;
|
||||||
|
if(addseg(map, s) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if((r = mallocz(sizeof(PtraceRegs), 1)) == nil)
|
||||||
|
return -1;
|
||||||
|
r->r.rw = ptraceregrw;
|
||||||
|
r->pid = pid;
|
||||||
|
*rp = (Regs*)r;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
detachproc(int)
|
detachproc(int pid)
|
||||||
{
|
{
|
||||||
|
return ptrace(PT_DETACH, pid, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static int
|
||||||
procnotes(int, char***)
|
ptracerw(Map *map, Seg *seg, ulong addr, void *v, uint n, int isr)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
u32int u;
|
||||||
|
uchar buf[4];
|
||||||
|
|
||||||
|
addr += seg->base;
|
||||||
|
for(i=0; i<n; i+=4){
|
||||||
|
if(isr){
|
||||||
|
errno = 0;
|
||||||
|
u = ptrace(PT_READ_D, seg->pid, (char*)addr+i, 0);
|
||||||
|
if(errno)
|
||||||
|
goto ptraceerr;
|
||||||
|
if(n-i >= 4)
|
||||||
|
*(u32int*)((char*)v+i) = u;
|
||||||
|
else{
|
||||||
|
*(u32int*)buf = u;
|
||||||
|
memmove((char*)v+i, buf, n-i);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(n-i >= 4)
|
||||||
|
u = *(u32int*)((char*)v+i);
|
||||||
|
else{
|
||||||
|
errno = 0;
|
||||||
|
u = ptrace(PT_READ_D, seg->pid, (char*)addr+i, 0);
|
||||||
|
if(errno)
|
||||||
|
return -1;
|
||||||
|
*(u32int*)buf = u;
|
||||||
|
memmove(buf, (char*)v+i, n-i);
|
||||||
|
u = *(u32int*)buf;
|
||||||
|
}
|
||||||
|
if(ptrace(PT_WRITE_D, seg->pid, (char*)addr+i, u) < 0)
|
||||||
|
goto ptraceerr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ptraceerr:
|
||||||
|
werrstr("ptrace: %r");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static char *freebsdregs[] = {
|
||||||
ctlproc(int, char*)
|
"FS",
|
||||||
|
"ES",
|
||||||
|
"DS",
|
||||||
|
"DI",
|
||||||
|
"SI",
|
||||||
|
"BP",
|
||||||
|
"SP",
|
||||||
|
"BX",
|
||||||
|
"DX",
|
||||||
|
"CX",
|
||||||
|
"AX",
|
||||||
|
"TRAP",
|
||||||
|
"PC",
|
||||||
|
"CS",
|
||||||
|
"EFLAGS",
|
||||||
|
"SP",
|
||||||
|
"SS",
|
||||||
|
"GS",
|
||||||
|
};
|
||||||
|
|
||||||
|
static ulong
|
||||||
|
reg2freebsd(char *reg)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<nelem(freebsdregs); i++)
|
||||||
|
if(strcmp(freebsdregs[i], reg) == 0)
|
||||||
|
return 4*i;
|
||||||
|
return ~(ulong)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ptraceregrw(Regs *regs, char *name, ulong *val, int isr)
|
||||||
|
{
|
||||||
|
int pid;
|
||||||
|
ulong addr;
|
||||||
|
struct reg mregs;
|
||||||
|
|
||||||
|
addr = reg2freebsd(name);
|
||||||
|
if(~addr == 0){
|
||||||
|
if(isr){
|
||||||
|
*val = ~(ulong)0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
werrstr("register not available");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pid = ((PtraceRegs*)regs)->pid;
|
||||||
|
if(ptrace(PT_GETREGS, pid, (char*)&mregs, 0) < 0)
|
||||||
|
return -1;
|
||||||
|
if(isr)
|
||||||
|
*val = *(u32int*)((char*)&mregs+addr);
|
||||||
|
else{
|
||||||
|
*(u32int*)((char*)&mregs+addr) = *val;
|
||||||
|
if(ptrace(PT_SETREGS, pid, (char*)&mregs, 0) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
proctextfile(int)
|
proctextfile(int pid)
|
||||||
{
|
{
|
||||||
|
static char buf[1024], pbuf[128];
|
||||||
|
|
||||||
|
snprint(pbuf, sizeof pbuf, "/proc/%d/file", pid);
|
||||||
|
if(readlink(pbuf, buf, sizeof buf) >= 0)
|
||||||
|
return buf;
|
||||||
|
if(access(pbuf, AEXIST) >= 0)
|
||||||
|
return pbuf;
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
status The process status. This file is read-only and returns a single
|
||||||
|
line containing multiple space-separated fields as follows:
|
||||||
|
|
||||||
|
o command name
|
||||||
|
o process id
|
||||||
|
o parent process id
|
||||||
|
o process group id
|
||||||
|
o session id
|
||||||
|
o major,minor of the controlling terminal, or -1,-1 if there is
|
||||||
|
no controlling terminal.
|
||||||
|
o a list of process flags: ctty if there is a controlling ter-
|
||||||
|
minal, sldr if the process is a session leader, noflags if
|
||||||
|
neither of the other two flags are set.
|
||||||
|
o the process start time in seconds and microseconds, comma
|
||||||
|
separated.
|
||||||
|
o the user time in seconds and microseconds, comma separated.
|
||||||
|
o the system time in seconds and microseconds, comma separated.
|
||||||
|
o the wait channel message
|
||||||
|
o the process credentials consisting of the effective user id
|
||||||
|
and the list of groups (whose first member is the effective
|
||||||
|
group id) all comma separated.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
procnotes(int pid, char ***pnotes)
|
||||||
|
{
|
||||||
|
/* figure out the set of pending notes - how? */
|
||||||
|
*pnotes = nil;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
isstopped(int pid)
|
||||||
|
{
|
||||||
|
char buf[1024], *f[12];
|
||||||
|
int fd, n, nf;
|
||||||
|
|
||||||
|
snprint(buf, sizeof buf, "/proc/%d/status", pid);
|
||||||
|
if((fd = open(buf, OREAD)) < 0)
|
||||||
|
return 0;
|
||||||
|
n = read(fd, buf, sizeof buf-1);
|
||||||
|
close(fd);
|
||||||
|
if(n <= 0)
|
||||||
|
return 0;
|
||||||
|
buf[n] = 0;
|
||||||
|
|
||||||
|
if((nf = tokenize(buf, f, nelem(f))) < 11)
|
||||||
|
return 0;
|
||||||
|
if(strcmp(f[10], "nochan") == 0)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef waitpid
|
||||||
|
|
||||||
|
int
|
||||||
|
ctlproc(int pid, char *msg)
|
||||||
|
{
|
||||||
|
int p, status;
|
||||||
|
|
||||||
|
if(strcmp(msg, "hang") == 0){
|
||||||
|
if(pid == getpid())
|
||||||
|
return ptrace(PT_TRACE_ME, 0, 0, 0);
|
||||||
|
werrstr("can only hang self");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(strcmp(msg, "kill") == 0)
|
||||||
|
return ptrace(PT_KILL, pid, 0, 0);
|
||||||
|
if(strcmp(msg, "startstop") == 0){
|
||||||
|
if(ptrace(PT_CONTINUE, pid, 0, 0) < 0)
|
||||||
|
return -1;
|
||||||
|
goto waitstop;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if(strcmp(msg, "sysstop") == 0){
|
||||||
|
if(ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)
|
||||||
|
return -1;
|
||||||
|
goto waitstop;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
if(strcmp(msg, "stop") == 0){
|
||||||
|
if(kill(pid, SIGSTOP) < 0)
|
||||||
|
return -1;
|
||||||
|
goto waitstop;
|
||||||
|
}
|
||||||
|
if(strcmp(msg, "waitanyway") == 0)
|
||||||
|
goto waitanyway;
|
||||||
|
if(strcmp(msg, "waitstop") == 0){
|
||||||
|
waitstop:
|
||||||
|
if(isstopped(pid))
|
||||||
|
return 0;
|
||||||
|
waitanyway:
|
||||||
|
for(;;){
|
||||||
|
p = waitpid(pid, &status, WUNTRACED);
|
||||||
|
if(p <= 0)
|
||||||
|
return -1;
|
||||||
|
if(WIFEXITED(status) || WIFSTOPPED(status))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(strcmp(msg, "start") == 0)
|
||||||
|
return ptrace(PT_CONTINUE, pid, 0, 0);
|
||||||
|
werrstr("unknown control message '%s'", msg);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,3 +56,11 @@ dwarfdump: dwarfdump.o $LIBDIR/$LIB
|
||||||
|
|
||||||
nm: nm.o $LIBDIR/$LIB
|
nm: nm.o $LIBDIR/$LIB
|
||||||
$LD -o $target $prereq -l9
|
$LD -o $target $prereq -l9
|
||||||
|
|
||||||
|
Linux.$O: ptrace.c
|
||||||
|
FreeBSD.$O: ptrace.c
|
||||||
|
SunOS.$O: nosys.c
|
||||||
|
Darwin.$O: nosys.c
|
||||||
|
OpenBSD.$O: nosys.c
|
||||||
|
NetBSD.$O: nosys.c
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
DIRS=\
|
DIRS=\
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libmp.a
|
LIB=libmp.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libmux.a
|
LIB=libmux.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libplumb.a
|
LIB=libplumb.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libregexp9.a
|
LIB=libregexp9.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
DIRS=\
|
DIRS=\
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libsec.a
|
LIB=libsec.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libthread.a
|
LIB=libthread.a
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
PLAN9=../..
|
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
|
||||||
LIB=libventi.a
|
LIB=libventi.a
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue