Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : /*
7 : ** prshma.h -- NSPR Anonymous Shared Memory
8 : **
9 : ** NSPR provides an anonymous shared memory based on NSPR's PRFileMap
10 : ** type. The anonymous file-mapped shared memory provides an inheritable
11 : ** shared memory, as in: the child process inherits the shared memory.
12 : ** Compare the file-mapped anonymous shared memory to to a named shared
13 : ** memory described in prshm.h. The intent is to provide a shared
14 : ** memory that is accessable only by parent and child processes. ...
15 : ** It's a security thing.
16 : **
17 : ** Depending on the underlying platform, the file-mapped shared memory
18 : ** may be backed by a file. ... surprise! ... On some platforms, no
19 : ** real file backs the shared memory. On platforms where the shared
20 : ** memory is backed by a file, the file's name in the filesystem is
21 : ** visible to other processes for only the duration of the creation of
22 : ** the file, hopefully a very short time. This restricts processess
23 : ** that do not inherit the shared memory from opening the file and
24 : ** reading or writing its contents. Further, when all processes
25 : ** using an anonymous shared memory terminate, the backing file is
26 : ** deleted. ... If you are not paranoid, you're not paying attention.
27 : **
28 : ** The file-mapped shared memory requires a protocol for the parent
29 : ** process and child process to share the memory. NSPR provides two
30 : ** protocols. Use one or the other; don't mix and match.
31 : **
32 : ** In the first protocol, the job of passing the inheritable shared
33 : ** memory is done via helper-functions with PR_CreateProcess(). In the
34 : ** second protocol, the parent process is responsible for creating the
35 : ** child process; the parent and child are mutually responsible for
36 : ** passing a FileMap string. NSPR provides helper functions for
37 : ** extracting data from the PRFileMap object. ... See the examples
38 : ** below.
39 : **
40 : ** Both sides should adhere strictly to the protocol for proper
41 : ** operation. The pseudo-code below shows the use of a file-mapped
42 : ** shared memory by a parent and child processes. In the examples, the
43 : ** server creates the file-mapped shared memory, the client attaches to
44 : ** it.
45 : **
46 : ** First protocol.
47 : ** Server:
48 : **
49 : ** fm = PR_OpenAnonFileMap(dirName, size, FilemapProt);
50 : ** addr = PR_MemMap(fm);
51 : ** attr = PR_NewProcessAttr();
52 : ** PR_ProcessAttrSetInheritableFileMap( attr, fm, shmname );
53 : ** PR_CreateProcess(Client);
54 : ** PR_DestroyProcessAttr(attr);
55 : ** ... yadda ...
56 : ** PR_MemUnmap( addr );
57 : ** PR_CloseFileMap(fm);
58 : **
59 : **
60 : ** Client:
61 : ** ... started by server via PR_CreateProcess()
62 : ** fm = PR_GetInheritedFileMap( shmname );
63 : ** addr = PR_MemMap(fm);
64 : ** ... yadda ...
65 : ** PR_MemUnmap(addr);
66 : ** PR_CloseFileMap(fm);
67 : **
68 : **
69 : ** Second Protocol:
70 : ** Server:
71 : **
72 : ** fm = PR_OpenAnonFileMap(dirName, size, FilemapProt);
73 : ** fmstring = PR_ExportFileMapAsString( fm );
74 : ** addr = PR_MemMap(fm);
75 : ** ... application specific technique to pass fmstring to child
76 : ** ... yadda ... Server uses his own magic to create child
77 : ** PR_MemUnmap( addr );
78 : ** PR_CloseFileMap(fm);
79 : **
80 : **
81 : ** Client:
82 : ** ... started by server via his own magic
83 : ** ... application specific technique to find fmstring from parent
84 : ** fm = PR_ImportFileMapFromString( fmstring )
85 : ** addr = PR_MemMap(fm);
86 : ** ... yadda ...
87 : ** PR_MemUnmap(addr);
88 : ** PR_CloseFileMap(fm);
89 : **
90 : **
91 : ** lth. 2-Jul-1999.
92 : **
93 : ** Note: The second protocol was requested by NelsonB (7/1999); this is
94 : ** to accomodate servers which already create their own child processes
95 : ** using platform native methods.
96 : **
97 : */
98 :
99 : #ifndef prshma_h___
100 : #define prshma_h___
101 :
102 : #include "prtypes.h"
103 : #include "prio.h"
104 : #include "prproces.h"
105 :
106 : PR_BEGIN_EXTERN_C
107 :
108 : /*
109 : ** PR_OpenAnonFileMap() -- Creates an anonymous file-mapped shared memory
110 : **
111 : ** Description:
112 : ** PR_OpenAnonFileMap() creates an anonymous shared memory. If the
113 : ** shared memory already exists, a handle is returned to that shared
114 : ** memory object.
115 : **
116 : ** On Unix platforms, PR_OpenAnonFileMap() uses 'dirName' as a
117 : ** directory name, without the trailing '/', to contain the anonymous
118 : ** file. A filename is generated for the name.
119 : **
120 : ** On Windows platforms, dirName is ignored.
121 : **
122 : ** Inputs:
123 : ** dirName -- A directory name to contain the anonymous file.
124 : ** size -- The size of the shared memory
125 : ** prot -- How the shared memory is mapped. See prio.h
126 : **
127 : ** Outputs:
128 : ** PRFileMap *
129 : **
130 : ** Returns:
131 : ** Pointer to PRFileMap or NULL on error.
132 : **
133 : */
134 : NSPR_API( PRFileMap *)
135 0 : PR_OpenAnonFileMap(
136 : const char *dirName,
137 : PRSize size,
138 : PRFileMapProtect prot
139 : );
140 :
141 : /*
142 : ** PR_ProcessAttrSetInheritableFileMap() -- Prepare FileMap for export
143 : ** to my children processes via PR_CreateProcess()
144 : **
145 : ** Description:
146 : ** PR_ProcessAttrSetInheritableFileMap() connects the PRFileMap to
147 : ** PRProcessAttr with shmname. A subsequent call to PR_CreateProcess()
148 : ** makes the PRFileMap importable by the child process.
149 : **
150 : ** Inputs:
151 : ** attr -- PRProcessAttr, used to pass data to PR_CreateProcess()
152 : ** fm -- PRFileMap structure to be passed to the child process
153 : ** shmname -- The name for the PRFileMap; used by child.
154 : **
155 : ** Outputs:
156 : ** PRFileMap *
157 : **
158 : ** Returns:
159 : ** PRStatus
160 : **
161 : */
162 : NSPR_API(PRStatus)
163 0 : PR_ProcessAttrSetInheritableFileMap(
164 : PRProcessAttr *attr,
165 : PRFileMap *fm,
166 : const char *shmname
167 : );
168 :
169 : /*
170 : ** PR_GetInheritedFileMap() -- Import a PRFileMap previously exported
171 : ** by my parent process via PR_CreateProcess()
172 : **
173 : ** Description:
174 : ** PR_GetInheritedFileMap() retrieves a PRFileMap object exported from
175 : ** its parent process via PR_CreateProcess().
176 : **
177 : ** Inputs:
178 : ** shmname -- The name provided to PR_ProcessAttrSetInheritableFileMap()
179 : **
180 : ** Outputs:
181 : ** PRFileMap *
182 : **
183 : ** Returns:
184 : ** PRFileMap pointer or NULL.
185 : **
186 : */
187 : NSPR_API( PRFileMap *)
188 0 : PR_GetInheritedFileMap(
189 : const char *shmname
190 : );
191 :
192 : /*
193 : ** PR_ExportFileMapAsString() -- Creates a string identifying a PRFileMap
194 : **
195 : ** Description:
196 : ** Creates an identifier, as a string, from a PRFileMap object
197 : ** previously created with PR_OpenAnonFileMap().
198 : **
199 : ** Inputs:
200 : ** fm -- PRFileMap pointer to be represented as a string.
201 : ** bufsize -- sizeof(buf)
202 : ** buf -- a buffer of length PR_FILEMAP_STRING_BUFSIZE
203 : **
204 : ** Outputs:
205 : ** buf contains the stringized PRFileMap identifier
206 : **
207 : ** Returns:
208 : ** PRStatus
209 : **
210 : */
211 : NSPR_API( PRStatus )
212 0 : PR_ExportFileMapAsString(
213 : PRFileMap *fm,
214 : PRSize bufsize,
215 : char *buf
216 : );
217 : #define PR_FILEMAP_STRING_BUFSIZE 128
218 :
219 : /*
220 : ** PR_ImportFileMapFromString() -- Creates a PRFileMap from the identifying string
221 : **
222 : ** Description:
223 : ** PR_ImportFileMapFromString() creates a PRFileMap object from a
224 : ** string previously created by PR_ExportFileMapAsString().
225 : **
226 : ** Inputs:
227 : ** fmstring -- string created by PR_ExportFileMapAsString()
228 : **
229 : ** Returns:
230 : ** PRFileMap pointer or NULL.
231 : **
232 : */
233 : NSPR_API( PRFileMap * )
234 0 : PR_ImportFileMapFromString(
235 : const char *fmstring
236 : );
237 :
238 : PR_END_EXTERN_C
239 : #endif /* prshma_h___ */
|