/* -*- 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___ */
