(file) Return to shmem.c CVS log (file) (dir) Up to [OMI] / omi / pal

  1 krisbash 1.1 #include "shmem.h"
  2              #include <stdio.h>
  3              #include <pal/strings.h>
  4              
  5              #ifdef _MSC_VER
  6              SECURITY_DESCRIPTOR g_SecurityDescriptor = {
  7                  SECURITY_DESCRIPTOR_REVISION,
  8                  0,
  9                  SE_DACL_PRESENT,
 10                  NULL,
 11                  NULL,
 12                  NULL,
 13                  NULL,
 14              };
 15              
 16              SECURITY_ATTRIBUTES g_SecurityAttributes = {
 17                  sizeof(SECURITY_ATTRIBUTES),
 18                  &g_SecurityDescriptor,
 19                  FALSE,
 20              };
 21              #endif
 22 krisbash 1.1 
 23              int Shmem_Open(
 24                  _Out_ Shmem* self,
 25                  _In_z_ const PAL_Char *name,
 26                  _In_ ShmemAccess access,
 27                  ShmemUserAccess userAccess,
 28                  _In_ size_t size)
 29              {
 30              #if defined(_MSC_VER)
 31              
 32                  DWORD protect = 0;
 33                  DWORD hi;
 34                  DWORD lo;
 35              
 36                  if (access == SHMEM_ACCESS_READWRITE)
 37                      protect = PAGE_READWRITE;
 38                  else if (access == SHMEM_ACCESS_READONLY)
 39                      protect = PAGE_READONLY;
 40                  else
 41                  {
 42                      self->handle = NULL;
 43 krisbash 1.1         return -1;
 44                  }
 45              
 46                  hi = (DWORD)((0xFFFFFFFF00000000 & (PAL_Uint64)size) >> 32);
 47                  lo = (DWORD)(0x00000000FFFFFFFF & (PAL_Uint64)size);
 48              
 49                  self->handle = CreateFileMapping( 
 50                      INVALID_HANDLE_VALUE,                                                         /* use paging file */
 51                      (userAccess == SHMEM_USER_ACCESS_ALLOW_ALL) ? &g_SecurityAttributes : NULL,   /* default or allow all security attributes based on userAccess requested*/
 52                      protect,                                                                      /* page access rights */
 53                      hi,                                                                           /* size: high 32-bits */
 54                      lo,                                                                           /* size: low 32-bits */
 55                      name);                                                                        /* name of map object */
 56                  
 57                  return self->handle ? 0 : -1;
 58              
 59              #else
 60              
 61                  int oflag;
 62              
 63                  /*
 64 krisbash 1.1         *  This is done since the shm_open is only defined for char * and does not take wchar_t
 65                      */
 66                  if (!name)
 67                      return -1;
 68                      
 69              #if defined(CONFIG_ENABLE_WCHAR)
 70                  StrWcslcpy(self->shmname, name, PAL_MAX_PATH_SIZE);
 71              #else
 72                  Strlcpy(self->shmname, name, PAL_MAX_PATH_SIZE);
 73              #endif
 74              
 75                  /* Build the oflag */
 76              
 77                  if (access == SHMEM_ACCESS_READWRITE)
 78                      oflag = O_CREAT | O_RDWR;
 79                  else if (access == SHMEM_ACCESS_READONLY)
 80                      oflag = O_CREAT | O_RDONLY;
 81                  else
 82                      return -1;
 83              
 84                  /* Open the shared memory segment */
 85 krisbash 1.1 
 86                  if ((self->shmid = shm_open(self->shmname, oflag, S_IRUSR | S_IWUSR)) == -1)
 87                  {
 88                      return -1;
 89                  }
 90              
 91                  if (ftruncate(self->shmid, size) != 0)
 92                  {
 93                      close(self->shmid);
 94                      shm_unlink(self->shmname);
 95                      return -1;
 96                  }
 97              
 98                  return 0;
 99              
100              #endif
101              }
102              
103              void* Shmem_Map(
104                  _Inout_ Shmem* self,
105                  _In_ ShmemAccess access,
106 krisbash 1.1     _In_ ptrdiff_t offset,
107                  _In_ size_t size)
108              {
109              #if defined(_MSC_VER)
110              
111                  DWORD desiredAccess = 0;
112                  DWORD lo;
113                  DWORD hi;
114                  void* ptr;
115              
116                  if (access == SHMEM_ACCESS_READWRITE)
117                      desiredAccess = FILE_MAP_ALL_ACCESS;
118                  else if (access == SHMEM_ACCESS_READONLY)
119                      desiredAccess = FILE_MAP_READ;
120                  else
121                      return NULL;
122              
123                  lo = (DWORD)(0x00000000FFFFFFFF & (PAL_Uint64)offset);
124                  hi = (DWORD)((0xFFFFFFFF00000000 & (PAL_Uint64)offset) >> 32);
125              
126                  ptr = MapViewOfFile(
127 krisbash 1.1         self->handle,
128                      desiredAccess,
129                      hi, /* offset: high 32-bits */
130                      lo, /* offset: low 32-bits */
131                      size);
132              
133                  return ptr;
134              
135              #else
136              
137                  int mprot;
138                  int mflags;
139                  void* ptr;
140              
141                  if (access == SHMEM_ACCESS_READWRITE)
142                      mprot = PROT_READ | PROT_WRITE;
143                  else if (access == SHMEM_ACCESS_READONLY)
144                      mprot = PROT_READ;
145                  else
146                      return NULL;
147                      
148 krisbash 1.1     mflags = MAP_SHARED;
149              #if !defined(sun)
150                  mflags |= MAP_FILE;
151              #endif
152              
153                  ptr = mmap(NULL, size, mprot, mflags, self->shmid, offset);
154              
155                  if (ptr == MAP_FAILED)
156                      return NULL;
157              
158                  return ptr;
159              
160              #endif
161              }

ViewCVS 0.9.2