Subject: minherit(2) API
To: None <freebsd-arch@freebsd.org, freebsd-hackers@freebsd.org,>
From: Thomas Klausner <wiz@netbsd.org>
List: tech-kern
Date: 07/09/2000 15:09:24
Hi,

The user API for minherit(2) is broken on all three of
{Free,Net,Open}BSD, but broken differently (for details see end of
this mail).  We would like to see a common fix that allows minherit to
be used portably across the three systems.

  The API we propose:

  synopsis for minherit:

	#include <sys/mman.h>

	int minherit(void *addr, size_t len, int inherit);

  constants for inherit parameter defined in sys/mman.h:

	#define MAP_INHERIT_SHARE        0      /* share with child */
	#define MAP_INHERIT_COPY         1      /* copy into child */
	#define MAP_INHERIT_NONE         2      /* absent from child */

possibly including the following:

	#define MAP_INHERIT_DONATE_COPY  3      /* copy and delete */
	#define MAP_INHERIT_DEFAULT      MAP_INHERIT_COPY
	
(donate copy is not present in FreeBSD, default is not documented in
the man pages of any of the three).

  We propose the addition of these constant definitions to sys/mman.h
to avoid requiring the inclusion of kernel internal vm header files.
We propose the renaming of these constants from VM_INHERIT_ to
MAP_INHERIT_ to avoid name space pollution (the MAP_ prefix is
reserved for sys/mman.h by POSIX, VM_ is not).

  That this change is not backwards compatible is of little concern,
since it is currently broken anyway.  Besides, a C program can check
for the definition of the MAP_INHERIT_ constants after including
sys/mman.h and include conditional workarounds for the current APIs.


  The current state of affairs on each system:

  FreeBSD: synopsis:

	#include <sys/types.h>
	#include <sys/mman.h>

	int minherit(void *addr, size_t len, int inherit);

VM_INHERIT_ constants are neither documented nor declared in any user
header.

  NetBSD: synopsis:

	#include <sys/types.h>
	#include <sys/mman.h>

	int minherit(void *addr, size_t len, int inherit);

VM_INHERIT_ constants are not declared in any user header.

  OpenBSD: synopsis:

	#include <sys/types.h>
	#include <sys/mman.h>
	#include <vm/vm_inherit.h>

	int minherit(void *addr, size_t len, int inherit);

vm/vm_inherit.h does not declare the type vm_inherit_t (but uses it
for the definition of the VM_INHERIT_ constants); furthermore,
vm/vm_inherit.h is an internal kernel header.


I wasn't sure which FreeBSD mailing list is more appropriate, so I
took both. Please CC: any answers to the other lists, too.

Bye,
 Thomas Klausner

-- 
Thomas Klausner - wiz@netbsd.org
I wanted to emulate some of my heroes, but I didn't know their
op-codes. --dowe