home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / adb / access.c next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.7 KB  |  107 lines

  1. #
  2. /*
  3.  *
  4.  *    UNIX debugger
  5.  *
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10.  
  11. MSG        ODDADR;
  12. MSG        BADDAT;
  13. MSG        BADTXT;
  14. MAP        txtmap;
  15. MAP        datmap;
  16. INT        wtflag;
  17. STRING        errflg;
  18. INT        errno;
  19.  
  20. INT        pid;
  21.  
  22.  
  23.  
  24.  
  25. /* file handling and access routines */
  26.  
  27. put(adr,space,value)
  28. L_INT    adr;
  29. {
  30.     access(WT,adr,space,value);
  31. }
  32.  
  33. POS    get(adr, space)
  34. L_INT        adr;
  35. {
  36.     return(access(RD,adr,space,0));
  37. }
  38.  
  39. POS    chkget(n, space)
  40. L_INT        n;
  41. {
  42.     REG INT        w;
  43.  
  44.     w = get(n, space);
  45.     chkerr();
  46.     return(w);
  47. }
  48.  
  49. access(mode,adr,space,value)
  50. L_INT    adr;
  51. {
  52.     INT        w, w1, pmode, rd, file;
  53.     rd = mode==RD;
  54.  
  55.     IF space == NSP THEN return(0); FI
  56.  
  57.     IF pid        /* tracing on? */
  58.     THEN IF (adr&01) ANDF !rd THEN error(ODDADR); FI
  59.          pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
  60.          w = ptrace(pmode, pid, shorten(adr&~01), value);
  61.          IF adr&01
  62.          THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
  63.           w = (w>>8)&LOBYTE | (w1<<8);
  64.          FI
  65.          IF errno
  66.          THEN errflg = (space&DSP ? BADDAT : BADTXT);
  67.          FI
  68.          return(w);
  69.     FI
  70.     w = 0;
  71.     IF mode==WT ANDF wtflag==0
  72.     THEN    error("not in write mode");
  73.     FI
  74.     IF !chkmap(&adr,space)
  75.     THEN return(0);
  76.     FI
  77.     file=(space&DSP?datmap.ufd:txtmap.ufd);
  78.     IF longseek(file,adr)==0 ORF
  79.        (rd ? read(file,&w,2) : write(file,&value,2)) < 1
  80.     THEN    errflg=(space&DSP?BADDAT:BADTXT);
  81.     FI
  82.     return(w);
  83.  
  84. }
  85.  
  86. chkmap(adr,space)
  87.     REG L_INT    *adr;
  88.     REG INT        space;
  89. {
  90.     REG MAPPTR amap;
  91.     amap=((space&DSP?&datmap:&txtmap));
  92.     IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
  93.     THEN IF within(*adr,amap->b2,amap->e2)
  94.          THEN *adr += (amap->f2)-(amap->b2);
  95.          ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0);
  96.          FI
  97.     ELSE *adr += (amap->f1)-(amap->b1);
  98.     FI
  99.     return(1);
  100. }
  101.  
  102. within(adr,lbd,ubd)
  103. L_INT    adr, lbd, ubd;
  104. {
  105.     return(adr>=lbd && adr<ubd);
  106. }
  107.