|
|
1.1 ! root 1: # ! 2: /* ! 3: * ! 4: * UNIX debugger ! 5: * ! 6: */ ! 7: ! 8: #include "defs.h" ! 9: SCCSID(@(#)access.c 2.2); ! 10: ! 11: ! 12: MSG ODDADR; ! 13: MSG BADDAT; ! 14: MSG BADTXT; ! 15: MAP txtmap; ! 16: MAP datmap; ! 17: INT wtflag; ! 18: STRING errflg; ! 19: INT errno; ! 20: ! 21: INT pid; ! 22: ! 23: ! 24: ! 25: ! 26: /* file handling and access routines */ ! 27: ! 28: put(adr,space,value) ! 29: #ifndef EDDT ! 30: L_INT adr; ! 31: { ! 32: access(WT,adr,space,value); ! 33: } ! 34: #else ! 35: L_INT *adr; {*adr=value;} ! 36: #endif ! 37: ! 38: POS get(adr, space) ! 39: #ifndef EDDT ! 40: L_INT adr; ! 41: { ! 42: return(access(RD,adr,space,0)); ! 43: } ! 44: #else ! 45: L_INT *adr; {return(*adr);} ! 46: #endif ! 47: ! 48: POS chkget(n, space) ! 49: L_INT n; ! 50: { ! 51: #ifndef vax ! 52: REG INT w; ! 53: #else ! 54: REG L_INT w; ! 55: #endif ! 56: ! 57: w = get(n, space); ! 58: chkerr(); ! 59: return(w); ! 60: } ! 61: ! 62: POS bchkget(n, space) ! 63: L_INT n; ! 64: { ! 65: return(chkget(n, space) & LOBYTE); ! 66: } ! 67: ! 68: #ifndef EDDT ! 69: access(mode,adr,space,value) ! 70: L_INT adr; ! 71: { ! 72: INT pmode,rd,file; ! 73: ADDR w; ! 74: rd = mode==RD; ! 75: ! 76: IF space == NSP THEN return(0); FI ! 77: ! 78: IF pid /* tracing on? */ ! 79: THEN ! 80: #ifndef vax ! 81: IF adr&01 ANDF !rd THEN error(ODDADR); FI ! 82: #endif ! 83: pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER)); ! 84: w = ptrace(pmode, pid, adr, value); ! 85: #ifndef vax ! 86: IF adr&01 ! 87: THEN w1 = ptrace(pmode, pid, shorten(adr+1), value); ! 88: w = (w>>8)&LOBYTE | (w1<<8); ! 89: FI ! 90: #endif ! 91: IF errno ! 92: THEN errflg = (space&DSP ? BADDAT : BADTXT); ! 93: FI ! 94: return(w); ! 95: FI ! 96: w = 0; ! 97: IF mode==WT ANDF wtflag==0 ! 98: THEN error("not in write mode"); ! 99: FI ! 100: IF !chkmap(&adr,space) ! 101: THEN return(0); ! 102: FI ! 103: file=(space&DSP?datmap.ufd:txtmap.ufd); ! 104: IF longseek(file,adr)==0 ORF ! 105: (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1 ! 106: THEN errflg=(space&DSP?BADDAT:BADTXT); ! 107: FI ! 108: return(w); ! 109: ! 110: } ! 111: #endif ! 112: ! 113: chkmap(adr,space) ! 114: REG L_INT *adr; ! 115: REG INT space; ! 116: { ! 117: REG MAPPTR amap; ! 118: amap=((space&DSP?&datmap:&txtmap)); ! 119: IF space&STAR ORF !within(*adr,amap->b1,amap->e1) ! 120: THEN IF within(*adr,amap->b2,amap->e2) ! 121: THEN *adr += (amap->f2)-(amap->b2); ! 122: ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0); ! 123: FI ! 124: ELSE *adr += (amap->f1)-(amap->b1); ! 125: FI ! 126: return(1); ! 127: } ! 128: ! 129: within(adr,lbd,ubd) ! 130: POS adr, lbd, ubd; ! 131: { ! 132: return(adr>=lbd && adr<ubd); ! 133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.