Ultrix-3.1/src/cmd/adb/access.c

Compare this file to the similar file:
Show the results in this format:


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

#
static char *sccsid = "@(#)access.c	3.0	4/21/86";
/*
 *
 *	UNIX debugger
 *
 */

#include "defs.h"

MSG		ODDADR;
MSG		BADDAT;
MSG		BADTXT;
struct map txtmap;
struct map datmap;
struct symtab symbol,*lastsym;
struct symslave *symsp;
int 	wtflag,unxkern,offset;
long	ovbase,ovsize,datbas, dot,symnum, calcov();
char *errflg;
int 	errno;
int 	pid,wantov,cwantov,magic;
long	ovhdroff[16];

/* file handling and access routines */

put(adr,space,value)
long adr;
{
	if(cwantov)
		wantov = cwantov;
	access(WT,adr,space,value);
}

unsigned get(adr, space)
long 	adr;
{
	if(cwantov)
		wantov = cwantov;
	return(access(RD,adr,space,0));
}

unsigned chkget(n, space)
long 	n;
{
	register int 	w;

	w = get(n, space);
	chkerr();
	return(w);
}

access(mode,adr,space,value)
long adr;
{
	int 	w, w1, pmode, rd, file;
	long tadr;

	rd = mode==RD;
	if(space == NSP)
	{
		return(0);
	}
	if(pid		/* tracing on? */)
	{
		if((adr&01) && !rd)
		{
			error(ODDADR);
		}
		pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
		pmode |= (wantov << 8);
		w = ptrace(pmode, pid, shorten(adr&~01), value);
		if(adr&01)
		{
			w1 = ptrace(pmode, pid, shorten(adr+1), value);
			w = (w>>8)&0377 | (w1<<8);
		}
		if(errno)
		{
			perror("");
			errflg = (space&DSP ? BADDAT : BADTXT);
		}
		wantov = 0;
		return(w);
	}
	w = 0;
	if(mode==WT && wtflag==0)
	{
		error("not in write mode");
	}
	tadr = adr;
	if (inov(adr)) {
		if ((space & (STAR|ISP)) == ISP) {
			if (wantov)
				tadr = calcov(adr, wantov);
			else if (symnum > 0L)
				tadr = calcov(adr, symsp->ovnslave);
		} else if (unxkern && symnum > 0L && (space&(STAR|DSP)) == (STAR|DSP))
			tadr = (adr & sizeov) + symsp->osmslave;
	}
	wantov = 0;
	if(!chkmap(&tadr,space))
	{
		return(0);
	}
	file=(space&DSP?datmap.ufd:txtmap.ufd);
	if(longseek(file,tadr)==0 ||
	    (rd ? read(file,&w,2) : write(file,&value,2)) < 1)
	{
		errflg=(space&DSP?BADDAT:BADTXT);
	}
	return(w);
}

chkmap(adr,space)
register long *adr;
register int 	space;
{
	register struct map *amap;
	amap=((space&DSP?&datmap:&txtmap));
	if(space&STAR || !within(*adr,amap->b1,amap->e1))
	{
		if(within(*adr,amap->b2,amap->e2))
		{
			*adr += (amap->f2)-(amap->b2);
		}
		else{
			errflg=(space&DSP?BADDAT:BADTXT); 
			return(0);
		}
	}
	else{
		*adr += (amap->f1)-(amap->b1);
	}
	return(1);
}

within(adr,lbd,ubd)
long adr, lbd, ubd;
{
	return(adr>=lbd && adr<ubd);
}

inov(adr)
long adr;
{
	if ((magic == 0430 || magic == 0450) && adr >= ovbase && adr < datbas)
		return(1);
	else if ((magic == 0431 || magic == 0451) && adr >= ovbase &&
							adr < (ovbase+ovsize))
		return(1);
	else
		return(0);
}