]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Add utility to map shared memory segments
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 21 Jun 2016 14:27:57 +0000 (15:27 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 21 Jun 2016 14:27:57 +0000 (15:27 +0100)
src/libutil/util.c
src/libutil/util.h

index cf6101e4d5ec425dc2944f2a1c19c4773c9fa5c9..f3effe5cf5f4cc7d1915794d1ae92e92bcc4d4e3 100644 (file)
@@ -2276,3 +2276,44 @@ rspamd_file_xmap (const char *fname, guint mode,
 
        return map;
 }
+
+
+gpointer
+rspamd_shmem_xmap (const char *fname, guint mode,
+               gsize *size)
+{
+       gint fd;
+       struct stat sb;
+       gpointer map;
+
+       g_assert (fname != NULL);
+       g_assert (size != NULL);
+
+       if (mode & PROT_WRITE) {
+               fd = shm_open (fname, O_RDWR, 0);
+       }
+       else {
+               fd = shm_open (fname, O_RDONLY, 0);
+       }
+
+       if (fd == -1) {
+               return NULL;
+       }
+
+       if (fstat (fd, &sb) == -1) {
+               close (fd);
+
+               return NULL;
+       }
+
+       map = mmap (NULL, sb.st_size, mode, MAP_SHARED, fd, 0);
+       close (fd);
+
+       if (map == MAP_FAILED) {
+               return NULL;
+       }
+
+       *size = sb.st_size;
+
+       return map;
+}
index 0c293ccbea0f9f582f7971a179f8f1ef735b1297..2497d538f0a883fb3792bf055b59c7d4b8e9ea75 100644 (file)
@@ -463,4 +463,14 @@ int rspamd_file_xopen (const char *fname, int oflags, guint mode);
 gpointer rspamd_file_xmap (const char *fname, guint mode,
                gsize *size);
 
+/**
+ * Map named shared memory segment
+ * @param fname filename
+ * @param mode mode to open
+ * @param size target size (must NOT be NULL)
+ * @return pointer to memory (should be freed using munmap) or NULL in case of error
+ */
+gpointer rspamd_shmem_xmap (const char *fname, guint mode,
+               gsize *size);
+
 #endif