You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by Jim Jagielski <ji...@jaguNET.com> on 2002/09/27 15:33:36 UTC

[PATCH] apr_shm_create_ex

To allow Apache (and others) to control various things when creating
shared memory, I've added apr_shm_create_ex. At present, we just have
the bit flags for controlling the uid/gid bits of SysV shared memory,
but the capability is there for more :)

Comments:

Index: include/apr_shm.h
===================================================================
RCS file: /home/cvs/apr/include/apr_shm.h,v
retrieving revision 1.2
diff -u -r1.2 apr_shm.h
--- include/apr_shm.h	13 Mar 2002 20:39:15 -0000	1.2
+++ include/apr_shm.h	27 Sep 2002 13:28:56 -0000
@@ -81,6 +81,44 @@
 typedef struct apr_shm_t apr_shm_t;
 
 /**
+ * Public possible bit settings for use by apr_shm_create_ex().
+ */
+enum {
+    APR_SHMEM_SYSV_ANON_SETUGID = 0x1,
+    APR_SHMEM_SYSV_NAMED_SETUGID = 0x2
+};
+
+/**
+ * Create and make accessable a shared memory segment with optional bit flags.
+ * @param m The shared memory structure to create.
+ * @param reqsize The desired size of the segment.
+ * @param file The file to use for shared memory on platforms that
+ *        require it.
+ * @param pool the pool from which to allocate the shared memory
+ *        structure.
+ * @param bflags bit flag controlling behavior or settings of segment
+ * @remark A note about Anonymous vs. Named shared memory segments:
+ *         Not all plaforms support anonymous shared memory segments, but in
+ *         some cases it is prefered over other types of shared memory
+ *         implementations. Passing a NULL 'file' parameter to this function
+ *         will cause the subsystem to use anonymous shared memory segments.
+ *         If such a system is not available, APR_ENOTIMPL is returned.
+ * @remark A note about allocation sizes:
+ *         On some platforms it is necessary to store some metainformation
+ *         about the segment within the actual segment. In order to supply
+ *         the caller with the requested size it may be necessary for the
+ *         implementation to request a slightly greater segment length
+ *         from the subsystem. In all cases, the apr_shm_baseaddr_get()
+ *         function will return the first usable byte of memory.
+ * 
+ */
+APR_DECLARE(apr_status_t) apr_shm_create_ex(apr_shm_t **m,
+                                         apr_size_t reqsize,
+                                         const char *filename,
+                                         apr_pool_t *pool,
+                                         int bflags);
+
+/**
  * Create and make accessable a shared memory segment.
  * @param m The shared memory structure to create.
  * @param reqsize The desired size of the segment.
Index: shmem/beos/shm.c
===================================================================
RCS file: /home/cvs/apr/shmem/beos/shm.c,v
retrieving revision 1.9
diff -u -r1.9 shm.c
--- shmem/beos/shm.c	13 Mar 2002 20:39:26 -0000	1.9
+++ shmem/beos/shm.c	27 Sep 2002 13:28:56 -0000
@@ -71,10 +71,11 @@
     area_id aid;
 };
 
-APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, 
+APR_DECLARE(apr_status_t) apr_shm_create_ex(apr_shm_t **m, 
                                          apr_size_t reqsize, 
                                          const char *file, 
-                                         apr_pool_t *p)
+                                         apr_pool_t *p,
+                                         int bflags)
 {
     apr_size_t pagesize;
     area_id newid;
@@ -98,6 +99,14 @@
     (*m)->reqsize = reqsize;
 
     return APR_SUCCESS;
+}
+
+APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, 
+                                         apr_size_t reqsize, 
+                                         const char *file, 
+                                         apr_pool_t *p)
+{
+    return apr_shm_create_ex(m, reqsize, file, p, 0);
 }
 
 APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m)
Index: shmem/os2/shm.c
===================================================================
RCS file: /home/cvs/apr/shmem/os2/shm.c,v
retrieving revision 1.7
diff -u -r1.7 shm.c
--- shmem/os2/shm.c	13 Mar 2002 20:39:26 -0000	1.7
+++ shmem/os2/shm.c	27 Sep 2002 13:28:56 -0000
@@ -64,10 +64,11 @@
     void *memblock;
 };
 
-APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m,
+APR_DECLARE(apr_status_t) apr_shm_create_ex(apr_shm_t **m,
                                          apr_size_t reqsize,
                                          const char *filename,
-                                         apr_pool_t *pool)
+                                         apr_pool_t *pool,
+                                         int bflags)
 {
     int rc;
     apr_shm_t *newm = (apr_shm_t *)apr_palloc(pool, sizeof(apr_shm_t));
@@ -92,6 +93,14 @@
 
     *m = newm;
     return APR_SUCCESS;
+}
+
+APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m,
+                                         apr_size_t reqsize,
+                                         const char *filename,
+                                         apr_pool_t *pool)
+{
+    return apr_shm_create_ex(m, reqsize, filename, pool, 0);
 }
 
 APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m)
Index: shmem/unix/shm.c
===================================================================
RCS file: /home/cvs/apr/shmem/unix/shm.c,v
retrieving revision 1.18
diff -u -r1.18 shm.c
--- shmem/unix/shm.c	16 Apr 2002 20:25:57 -0000	1.18
+++ shmem/unix/shm.c	27 Sep 2002 13:28:57 -0000
@@ -127,10 +127,11 @@
     return APR_ENOTIMPL;
 }
 
-APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m,
+APR_DECLARE(apr_status_t) apr_shm_create_ex(apr_shm_t **m,
                                          apr_size_t reqsize, 
                                          const char *filename,
-                                         apr_pool_t *pool)
+                                         apr_pool_t *pool,
+                                         int bflags)
 {
     apr_shm_t *new_m;
     apr_status_t status;
@@ -241,10 +242,12 @@
             return errno;
         }
         apr_current_userid(&uid, &gid, pool);
-        shmbuf.shm_perm.uid = uid;
-        shmbuf.shm_perm.gid = gid;
-        if (shmctl(new_m->shmid, IPC_SET, &shmbuf) == -1) {
-            return errno;
+        if (bflags & APR_SHMEM_SYSV_ANON_SETUGID) {
+            shmbuf.shm_perm.uid = uid;
+            shmbuf.shm_perm.gid = gid;
+            if (shmctl(new_m->shmid, IPC_SET, &shmbuf) == -1) {
+                return errno;
+            }
         }
 
         /* Remove the segment once use count hits zero.
@@ -388,10 +391,12 @@
             return errno;
         }
         apr_current_userid(&uid, &gid, pool);
-        shmbuf.shm_perm.uid = uid;
-        shmbuf.shm_perm.gid = gid;
-        if (shmctl(new_m->shmid, IPC_SET, &shmbuf) == -1) {
-            return errno;
+        if (bflags & APR_SHMEM_SYSV_NAMED_SETUGID) {
+            shmbuf.shm_perm.uid = uid;
+            shmbuf.shm_perm.gid = gid;
+            if (shmctl(new_m->shmid, IPC_SET, &shmbuf) == -1) {
+                return errno;
+            }
         }
 
         nbytes = sizeof(reqsize);
@@ -414,6 +419,14 @@
     }
 
     return APR_ENOTIMPL;
+}
+
+APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m,
+                                         apr_size_t reqsize, 
+                                         const char *filename,
+                                         apr_pool_t *pool)
+{
+    return apr_shm_create_ex(m, reqsize, filename, pool, 0);
 }
 
 APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m)
Index: shmem/win32/shm.c
===================================================================
RCS file: /home/cvs/apr/shmem/win32/shm.c,v
retrieving revision 1.12
diff -u -r1.12 shm.c
--- shmem/win32/shm.c	31 Jul 2002 06:20:15 -0000	1.12
+++ shmem/win32/shm.c	27 Sep 2002 13:28:57 -0000
@@ -89,10 +89,11 @@
     return rv;
 }
 
-APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m,
+APR_DECLARE(apr_status_t) apr_shm_create_ex(apr_shm_t **m,
                                          apr_size_t reqsize,
                                          const char *file,
-                                         apr_pool_t *pool)
+                                         apr_pool_t *pool,
+                                         int bflags)
 {
     static apr_size_t memblock = 0;
     HANDLE hMap, hFile;
@@ -187,6 +188,14 @@
     apr_pool_cleanup_register((*m)->pool, *m, 
                               shm_cleanup, apr_pool_cleanup_null);
     return APR_SUCCESS;
+}
+
+APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m,
+                                         apr_size_t reqsize,
+                                         const char *file,
+                                         apr_pool_t *pool)
+{
+    return apr_shm_create_ex(m, reqsize, file, pool, 0);
 }
 
 APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m) 
-- 
===========================================================================
   Jim Jagielski   [|]   jim@jaguNET.com   [|]   http://www.jaguNET.com/
      "A society that will trade a little liberty for a little order
             will lose both and deserve neither" - T.Jefferson