|
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 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 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 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 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 PR_ImportFileMapFromString( |
|
235 const char *fmstring |
|
236 ); |
|
237 |
|
238 PR_END_EXTERN_C |
|
239 #endif /* prshma_h___ */ |