| /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| /* |
| ** prshma.h -- NSPR Anonymous Shared Memory |
| ** |
| ** NSPR provides an anonymous shared memory based on NSPR's PRFileMap |
| ** type. The anonymous file-mapped shared memory provides an inheritable |
| ** shared memory, as in: the child process inherits the shared memory. |
| ** Compare the file-mapped anonymous shared memory to to a named shared |
| ** memory described in prshm.h. The intent is to provide a shared |
| ** memory that is accessable only by parent and child processes. ... |
| ** It's a security thing. |
| ** |
| ** Depending on the underlying platform, the file-mapped shared memory |
| ** may be backed by a file. ... surprise! ... On some platforms, no |
| ** real file backs the shared memory. On platforms where the shared |
| ** memory is backed by a file, the file's name in the filesystem is |
| ** visible to other processes for only the duration of the creation of |
| ** the file, hopefully a very short time. This restricts processess |
| ** that do not inherit the shared memory from opening the file and |
| ** reading or writing its contents. Further, when all processes |
| ** using an anonymous shared memory terminate, the backing file is |
| ** deleted. ... If you are not paranoid, you're not paying attention. |
| ** |
| ** The file-mapped shared memory requires a protocol for the parent |
| ** process and child process to share the memory. NSPR provides two |
| ** protocols. Use one or the other; don't mix and match. |
| ** |
| ** In the first protocol, the job of passing the inheritable shared |
| ** memory is done via helper-functions with PR_CreateProcess(). In the |
| ** second protocol, the parent process is responsible for creating the |
| ** child process; the parent and child are mutually responsible for |
| ** passing a FileMap string. NSPR provides helper functions for |
| ** extracting data from the PRFileMap object. ... See the examples |
| ** below. |
| ** |
| ** Both sides should adhere strictly to the protocol for proper |
| ** operation. The pseudo-code below shows the use of a file-mapped |
| ** shared memory by a parent and child processes. In the examples, the |
| ** server creates the file-mapped shared memory, the client attaches to |
| ** it. |
| ** |
| ** First protocol. |
| ** Server: |
| ** |
| ** fm = PR_OpenAnonFileMap(dirName, size, FilemapProt); |
| ** addr = PR_MemMap(fm); |
| ** attr = PR_NewProcessAttr(); |
| ** PR_ProcessAttrSetInheritableFileMap( attr, fm, shmname ); |
| ** PR_CreateProcess(Client); |
| ** PR_DestroyProcessAttr(attr); |
| ** ... yadda ... |
| ** PR_MemUnmap( addr ); |
| ** PR_CloseFileMap(fm); |
| ** |
| ** |
| ** Client: |
| ** ... started by server via PR_CreateProcess() |
| ** fm = PR_GetInheritedFileMap( shmname ); |
| ** addr = PR_MemMap(fm); |
| ** ... yadda ... |
| ** PR_MemUnmap(addr); |
| ** PR_CloseFileMap(fm); |
| ** |
| ** |
| ** Second Protocol: |
| ** Server: |
| ** |
| ** fm = PR_OpenAnonFileMap(dirName, size, FilemapProt); |
| ** fmstring = PR_ExportFileMapAsString( fm ); |
| ** addr = PR_MemMap(fm); |
| ** ... application specific technique to pass fmstring to child |
| ** ... yadda ... Server uses his own magic to create child |
| ** PR_MemUnmap( addr ); |
| ** PR_CloseFileMap(fm); |
| ** |
| ** |
| ** Client: |
| ** ... started by server via his own magic |
| ** ... application specific technique to find fmstring from parent |
| ** fm = PR_ImportFileMapFromString( fmstring ) |
| ** addr = PR_MemMap(fm); |
| ** ... yadda ... |
| ** PR_MemUnmap(addr); |
| ** PR_CloseFileMap(fm); |
| ** |
| ** |
| ** lth. 2-Jul-1999. |
| ** |
| ** Note: The second protocol was requested by NelsonB (7/1999); this is |
| ** to accomodate servers which already create their own child processes |
| ** using platform native methods. |
| ** |
| */ |
| |
| #ifndef prshma_h___ |
| #define prshma_h___ |
| |
| #include "prtypes.h" |
| #include "prio.h" |
| #include "prproces.h" |
| |
| PR_BEGIN_EXTERN_C |
| |
| /* |
| ** PR_OpenAnonFileMap() -- Creates an anonymous file-mapped shared memory |
| ** |
| ** Description: |
| ** PR_OpenAnonFileMap() creates an anonymous shared memory. If the |
| ** shared memory already exists, a handle is returned to that shared |
| ** memory object. |
| ** |
| ** On Unix platforms, PR_OpenAnonFileMap() uses 'dirName' as a |
| ** directory name, without the trailing '/', to contain the anonymous |
| ** file. A filename is generated for the name. |
| ** |
| ** On Windows platforms, dirName is ignored. |
| ** |
| ** Inputs: |
| ** dirName -- A directory name to contain the anonymous file. |
| ** size -- The size of the shared memory |
| ** prot -- How the shared memory is mapped. See prio.h |
| ** |
| ** Outputs: |
| ** PRFileMap * |
| ** |
| ** Returns: |
| ** Pointer to PRFileMap or NULL on error. |
| ** |
| */ |
| NSPR_API( PRFileMap *) |
| PR_OpenAnonFileMap( |
| const char *dirName, |
| PRSize size, |
| PRFileMapProtect prot |
| ); |
| |
| /* |
| ** PR_ProcessAttrSetInheritableFileMap() -- Prepare FileMap for export |
| ** to my children processes via PR_CreateProcess() |
| ** |
| ** Description: |
| ** PR_ProcessAttrSetInheritableFileMap() connects the PRFileMap to |
| ** PRProcessAttr with shmname. A subsequent call to PR_CreateProcess() |
| ** makes the PRFileMap importable by the child process. |
| ** |
| ** Inputs: |
| ** attr -- PRProcessAttr, used to pass data to PR_CreateProcess() |
| ** fm -- PRFileMap structure to be passed to the child process |
| ** shmname -- The name for the PRFileMap; used by child. |
| ** |
| ** Outputs: |
| ** PRFileMap * |
| ** |
| ** Returns: |
| ** PRStatus |
| ** |
| */ |
| NSPR_API(PRStatus) |
| PR_ProcessAttrSetInheritableFileMap( |
| PRProcessAttr *attr, |
| PRFileMap *fm, |
| const char *shmname |
| ); |
| |
| /* |
| ** PR_GetInheritedFileMap() -- Import a PRFileMap previously exported |
| ** by my parent process via PR_CreateProcess() |
| ** |
| ** Description: |
| ** PR_GetInheritedFileMap() retrieves a PRFileMap object exported from |
| ** its parent process via PR_CreateProcess(). |
| ** |
| ** Inputs: |
| ** shmname -- The name provided to PR_ProcessAttrSetInheritableFileMap() |
| ** |
| ** Outputs: |
| ** PRFileMap * |
| ** |
| ** Returns: |
| ** PRFileMap pointer or NULL. |
| ** |
| */ |
| NSPR_API( PRFileMap *) |
| PR_GetInheritedFileMap( |
| const char *shmname |
| ); |
| |
| /* |
| ** PR_ExportFileMapAsString() -- Creates a string identifying a PRFileMap |
| ** |
| ** Description: |
| ** Creates an identifier, as a string, from a PRFileMap object |
| ** previously created with PR_OpenAnonFileMap(). |
| ** |
| ** Inputs: |
| ** fm -- PRFileMap pointer to be represented as a string. |
| ** bufsize -- sizeof(buf) |
| ** buf -- a buffer of length PR_FILEMAP_STRING_BUFSIZE |
| ** |
| ** Outputs: |
| ** buf contains the stringized PRFileMap identifier |
| ** |
| ** Returns: |
| ** PRStatus |
| ** |
| */ |
| NSPR_API( PRStatus ) |
| PR_ExportFileMapAsString( |
| PRFileMap *fm, |
| PRSize bufsize, |
| char *buf |
| ); |
| #define PR_FILEMAP_STRING_BUFSIZE 128 |
| |
| /* |
| ** PR_ImportFileMapFromString() -- Creates a PRFileMap from the identifying string |
| ** |
| ** Description: |
| ** PR_ImportFileMapFromString() creates a PRFileMap object from a |
| ** string previously created by PR_ExportFileMapAsString(). |
| ** |
| ** Inputs: |
| ** fmstring -- string created by PR_ExportFileMapAsString() |
| ** |
| ** Returns: |
| ** PRFileMap pointer or NULL. |
| ** |
| */ |
| NSPR_API( PRFileMap * ) |
| PR_ImportFileMapFromString( |
| const char *fmstring |
| ); |
| |
| PR_END_EXTERN_C |
| #endif /* prshma_h___ */ |