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