home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3297 / getvmseg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-07  |  1.5 KB  |  98 lines

  1. /* History:
  2. 5/1/91 DJB baseline
  3. Originally stolen from Dupuy ofiles.
  4. */
  5.  
  6. /*
  7.  
  8. XXX: Don't ask me what this does; I dunno nuthin' bout no mmaps, bro.
  9.  
  10. */
  11.  
  12. #include "structproc.h"
  13. #include "vmstuff.h"
  14. #include "getvmseg.h"
  15. #include "structxnode.h"
  16. #include "kmem.h"
  17. #include "confhavevmseg.h"
  18.  
  19. int vmsegmax;
  20.  
  21. #ifndef HAVE_VMSEG
  22. static struct vnode *result = 0;
  23.  
  24. struct vnode **getvmseg(p)
  25. struct proc *p;
  26. {
  27.  vmsegmax = 1;
  28.  return &result;
  29. }
  30.  
  31. int seginit()
  32. {
  33.  ;
  34. }
  35.  
  36. #else
  37.  
  38. #define SEGNLIST "_segvn_ops"
  39. #define MAXSEGS 256
  40.  
  41. static int init = 0;
  42. static unsigned long nlsegvnv;
  43. static short nlsegvnt;
  44.  
  45. int seginit()
  46. {
  47.  nlistadd(SEGNLIST,&nlsegvnt,&nlsegvnv);
  48.  init = 1;
  49.  return 0;
  50. }
  51.  
  52. struct vnode **getvmseg(p)
  53. struct proc *p;
  54. {
  55.  static struct vnode *segvns[MAXSEGS];
  56.  struct as as;
  57.  struct seg seg;
  58.  struct seg *s;
  59.  register int segn;
  60.  union gseg
  61.   {
  62.    struct segvn_data segvn;
  63.    struct segdev_data segdev;
  64.    struct segmap_data segmap;
  65.   }
  66.  gseg;
  67.  
  68.  segvns[0] = 0;
  69.  if (!(p->p_as))
  70.    return segvns;
  71.  
  72.  if (!init)
  73.    seginit();
  74.  if (nlsegvnt == -1)
  75.    nlistdo();
  76.  
  77.  kmemcpy((char *) &as,(char *) p->p_as,sizeof(as));
  78.  
  79.  segn = 0;
  80.  
  81.  for (s = as.a_segs;;s = seg.s_next)
  82.   {
  83.    kmemcpy((char *) &seg,(char *) s,sizeof(seg));
  84.    kmemcpy((char *) &gseg,(char *) seg.s_data,sizeof(gseg));
  85.    if ((unsigned long) seg.s_ops == nlsegvnv
  86.      &&gseg.segvn.vp
  87.      &&!gseg.segvn.amp)
  88.      segvns[segn++] = gseg.segvn.vp;
  89.    if (s == as.a_seglast || segn == MAXSEGS)
  90.     {
  91.      vmsegmax = segn;
  92.      return segvns;
  93.     }
  94.   }
  95. }
  96.  
  97. #endif
  98.