static char sccsid
[] = "@(#)access.c 4.2 8/17/82";
/* file handling and access routines */
int dmask
[5] = {0, 0xff, 0xffff, 0xffffff, 0xffffffff};
/* get data at loc using descriptor format d */
/* put value at loc using descriptor format d */
ADDR loc
; char d
; long value
; {
val
= (val
& !dmask
[dtol(d
)]) | (value
& dmask
[dtol(d
)]);
/* put value in named register using descriptor format d */
ADDR reg
; char d
; long value
; {
val
= *(ADDR
*)(((ADDR
)&u
)+R0
+WORDSIZE
*reg
);
val
= (val
& !dmask
[dtol(d
)]) | (value
& dmask
[dtol(d
)]);
*(ADDR
*)(((ADDR
)&u
)+R0
+WORDSIZE
*reg
) = val
;
access(WT
,adr
,space
,value
);
return(access(RD
,adr
,space
,0));
access(mode
,adr
,space
,value
)
printf("access(mode=%d,adr=%d,space=%d,value=%d) with pid %d\n",
mode
, adr
, space
, value
, pid
);
IF space
== NSP THEN
return(0); FI
IF adr
&01 ANDF
!rd THEN
error(ODDADR
); FI
pmode
= (space
&DSP
?(rd
?RDUSER
:WDUSER
):(rd
?RIUSER
:WIUSER
));
w
= ptrace(pmode
, pid
, adr
, value
);
printf("ptrace(%d,%d,%d,%d) = %d with error=%d\n",
pmode
, pid
, adr
, value
, w
, errno
);
THEN w1
= ptrace(pmode
, pid
, shorten(adr
+1), value
);
w
= (w
>>8)&LOBYTE
| (w1
<<8);
THEN errflg
= (space
&DSP
? BADDAT
: BADTXT
);
file
=(space
&DSP
?datmap
.ufd
:txtmap
.ufd
);
if (longseek(file
,adr
)==0 ||
(rd
? read(file
,&w
,sizeof(w
)) : write(file
,&value
,sizeof(w
))) < 1)
errflg
=(space
&DSP
?BADDAT
:BADTXT
);
amap
=((space
&DSP
?&datmap
:&txtmap
));
IF space
&STAR ORF
!within(*adr
,amap
->b1
,amap
->e1
)
THEN
if (within(*adr
,amap
->b2
,amap
->e2
))
*adr
+= (amap
->f2
)-(amap
->b2
);
errflg
=(space
&DSP
?BADDAT
:BADTXT
); return(0);
ELSE
*adr
+= (amap
->f1
)-(amap
->b1
);
return(adr
>=lbd
&& adr
<ubd
);
return(chkget(n
, space
) & LOBYTE
);