home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2 / DJLSR201.ZIP / src / libc / compat / mman / mprotect.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-15  |  1.1 KB  |  46 lines

  1. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  2. #include <sys/types.h>
  3. #include <sys/mman.h>
  4. #include <stubinfo.h>
  5. #include <dpmi.h>
  6. #include <crt0.h>
  7. #include <errno.h>
  8.  
  9. int mprotect(void *addr, size_t len, int prot)
  10. {
  11.   unsigned start, end;
  12.   unsigned npage;
  13.   unsigned short newprot;
  14.  
  15.   start = ~0xfff & (unsigned)addr;
  16.   end = ((unsigned)addr + len + 0xfff) & ~0xfff;
  17.   npage = (end - start) / 0x1000;
  18.   
  19.   if(prot & PROT_WRITE)
  20.     newprot = 9;        /* committed, writeable */
  21.   else if(prot & PROT_READ)
  22.     newprot = 1;        /* committed, read-only */
  23.   else
  24.     newprot = 0;        /* uncommitted */
  25.  
  26.   {
  27.     unsigned short pageprot[npage];
  28.     int i;
  29.     __dpmi_meminfo meminfo;
  30.     __djgpp_sbrk_handle *handle_info;
  31.  
  32.     for(i=0;i < npage; i++)
  33.       pageprot[i] = newprot;
  34.  
  35.     handle_info = __djgpp_memory_handle(start);
  36.     meminfo.handle = handle_info->handle;
  37.     meminfo.address = start - handle_info->address;
  38.     meminfo.size = npage;
  39.  
  40.     i = __dpmi_set_page_attributes(&meminfo, pageprot);
  41.     if(i)
  42.       errno = EACCES;
  43.     return i;
  44.   }
  45. }
  46.