.NH 2
Ioctl requests
.XL yG
.NH 3
Changed requests
.NH 4
ioctl(d, FIORCVFD, r)
.XL y3
.PP
An extra field added to the
.CW passfd
structure pointed to by $r$ returns
the capabilities $T(q)$ of the sending process $q$.
.NH 4
ioctl(d, TIOCSPGRP, r)
.XL y4
.LP
If the third argument is not a null pointer (the stream
is to be associated with the process group pointed to by $r$):
.IP
If userid of $p$ is not superuser then error
.CW EPERM .
.IP
Otherwise, if $not Tuarea (p)$ then $error$.
.SP
The process group of a stream, being readable and writable,
is subject to the security policy.  
As the practical uses of this system call are akin to those of
.I setpgrp,
it is protected in the same way; see \*(yj.
.NH 3
New requests for process-exclusive access
.XL zP
.PP
In these requests
$f$ is the file $f(d)$; $f sup prime$ is the other end when
$f$ is a pipe end; and $r$ is a pointer, which,
if nonzero, points to a
structure that is filled in on non-error returns as follows:
.IP
.TS
lfCW lfCW lfCW.
struct	pexclude {
	int oldnear;	/* $roman "previous value of"~X(f)$ */
	int newnear;	/* new value of $X(f)$ */
	int farpid;	/* $0~if~f~roman "not pipe or"~X(f sup prime )^=^UNPEXED$ */
		/* $roman otherwise~H(f sup prime )$ */
	int farcap;	/* $if~font CW farpid~!=~0,~Tvec (H(f sup prime ))$ */
	int faruid;	/* $if~font CW farpid~!=~0,~roman "userid~of"~H(f sup prime )$ */
};
.TE
.PP
Process-exclusive requests applied to streams
skip over line discipline modules;
neither the requests nor their return values can be forged
by using the message line discipline.
The process-exclusive state is inherited across
.I exec.
.PP
$FIOPX$ and $FIONPX$ affect the pexity of pipes 
as described by the following table.
Changes in response to a request on file descriptor
$d$ occur at both ends;
code pairs in the table represent $X(f)$ and $X(f sup prime )$.
.KS
.TS
center box;
c | cs
c | cfCW cfCW
cfCW | cfCW | cfCW.
old	new state
state	FIOPX	FIONPX	
_
00	10	00
01	11	01
02	ECONC	02
10	10	00
20	20	00
11	11	02
_
.T&
lss.
$font CW 0^=^UNPEXED$, $font CW 1^=^PEXED$, $font CW 2^=^UNPEXING$
.TE
.KE
.SP
The process-exclusive requests return
.I "bona fides
of the far process for use in establishing trust.
To help assure that such trust does not unwittingly persist
beyond the duration of exclusivity, a pipe goes into
an $UNPEXING$ state, state 2 in the table, when
one end goes from $PEXED$ to $UNPEXED$.
In this state the pipe is unusable and it remains so
until both ends reach the $UNPEXED$ state.
.NH 4
ioctl(d, FIOPX, r)
.XL yX
.LP
$FIOPX$ attempts to obtain for $p$ exclusive access to the
file $f~=~f(d)$.
.LP
If $APX(f)~=~false$
.IP
If $f$ is a directory then error
.CW EISDIR .
.IP
Otherwise, error
.CW EPERM .
.LP
Flush the stream $f$.
.LP
Set $H(f)~:=~p$.
.LP
If $f$ is not a pipe set $X(f)~=~PEXED$ and return 0.
.LP
Now $f$ is a pipe.
.LP
Set $X(f)$ and $X(f sup prime )$ according to the
table in \*(zP.
.LP
If process $H(f sup prime )$ is waiting in
.IP
.CW FIOPX ,
it awakens and returns 0.
.IP
.CW FIONPX ,
it awakens and returns 1.
.IP
.I select,
with $f sup prime$ among the enabled file
descriptors, $f sup prime$ becomes ready.
.IP
.I read
or
.I write
on $f sup prime$,
it awakens and returns error 
.CW ECONC .
.LP
If $X(f)~=~X(f sup prime )~=~PEXED$ return 0.
.LP
Otherwise wait, with timeout, for an answering $FIOPX$ or
$FIONPX$ at the other end.
.LP
If the wait times out, return 1.
.NH 4
ioctl(d, FIONPX, r)
.XL yn
.LP
This request is used to reject an exclusive-access request
at the other end of a pipe or to terminate exclusive
access on a stream $f~=~f(d)$.
.LP
Flush the stream $f$.
.LP
Set $H(f)~:=~0$.
.LP
If $f$ is not a pipe set $X(f)~:=~UNPEXED$ and return 0.
.LP
Now $f$ is a pipe.
.LP
Set $X(f)$ and $X(f sup prime )$ according to the
table in \*(zP.
.LP
If process $H(f sup prime )$ is waiting in
.IP
$FIOPX$, it awakens and returns 1.
.IP
$FIONPX$, it awakens and returns 0.
.IP
.I select
with $d(f sup prime )$ among the enabled file
descriptors, $d(f sup prime )$ becomes ready.
.IP
.I read
or
.I write
on $f sup prime$, it awakens and returns
.CW ECONC .
.LP
If $X(f)~=~X(f sup prime )~=~UNPEXED$ return 0.
.LP
Otherwise wait, with timeout, for an answering 
$FIOPX$ or $FIONPX$
at the other end.
.LP
If the wait times out, return 1.
.NH 4
ioctl(d, FIOQX, r)
.XL zp
.LP
This request queries pex state without changing it.
.LP
Return 0.
.NH 4
ioctl(d, FIOAPX, r), ioctl(d, FIOANPX, r)
.XL zx
.LP
These requests specify whether a stream will accept
process-exclusive access requests.
The accept pex indicator $APX(f)$ is initialized automatically
when stream $f~=~f(d)$
is first opened (\*(yp), and remains constant until changed by 
.CW FIOAPX
or
.CW FIOANPX
or until last close.
.LP
If $f$ is a pipe or is not a stream then error
.CW ENOTTY .
.LP
If $not Textern (p)$ then error
.CW ECONC .
.LP
If the request is 
.CW FIOAPX
set $APX(f)~:=~true$.
.LP
If the request is 
.CW FIOANPX
set $APX(f)~:=~false$.
.NH 3
New requests for stream identifiers
.XL zS
.LP
The requests
.CW FIOGSRC
and
.CW FIOSSRC
get and set stream identifiers, null-terminated
strings of at most 32 characters.
A stream identifier typically records security-related
information about the stream.
.NH 2
ioctl(d, FIOGSRC, s)
.XL z5
.LP
Copy the stream identifier of $d$ 
into the character array $s$.
.NH 2
ioctl(d, FIOSSRC, s)
.XL z6
.LP
If $not Textern$ then error $EPERM$.
.LP
Copy the null-terminated string pointed to by $s$
into the stream identifier of $d$.
.NH 3
Table of ioctl requests
.PP
Let $d$ be the first argument of
.I ioctl.
In default of more careful analysis,
requests should be checked with W($f(d)$); requests that return
values should also be checked with R($f(d)$).
.PP
This table of particular requests
is intended to be illustrative, not definitive.
It covers only new requests and requests that are documented
in the v10 manual,
and omits all requests pertinent to networking.
Being based on v10, it has little bearing on other versions of
.UX .
.PP
The action entries mean
.IP
.TS
ll.
(empty)	no security checks
R	check R($f(d)$), \*(zr
W	check W($f(d)$), \*(zw
.TE
.IP
.TS H
|c|cs|c|
|lfCW|lIe0l|l|.
_
Request	Man page	Action
=
.TH	
FIOCLEX	ioctl	(2)	
FIONCLEX	ioctl	(2)
FIOACCEPT	connld	(4)	
FIOREJECT	connld	(4)	
MTIOCEEOT	mt	(4)	
MTIOCGET	mt	(4)	R
MTIOCIEOT	mt	(4)	
MTIOCTOP	mt	(4)	W
FIOANPX	pex	(4)	\*(zx
FIOAPX	pex	(4)	\*(zx
FIONPX	pex	(4)	\*(yn
FIOPX	pex	(4)	\*(yX
FIOQX	pex	(4)	\*(zp
PIOCGETPR	proc	(4)	R
PIOCKILL	proc	(4)	like \fIkill\fR, \*(ye
PIOCNICE	proc	(4)	\*(z2
PIOCOPENT	proc	(4)	
PIOCREXEC	proc	(4)	
PIOCRUN	proc	(4)	
PIOCSEXEC	proc	(4)
PIOCSMASK	proc	(4)
PIOCSTOP	proc	(4)
PIOCWSTOP	proc	(4)
UIOCHAR	ra	(4)	R
UIOREPL	ra	(4)	W
UIORRCT	ra	(4)	R
UIOWRCT	ra	(4)	W
FIOGSRC	stream	(4)	R, \*(z5
FIOINSLD	stream	(4)	W
FIOLOOKLD	stream	(4)	R
FIONREAD	stream	(4)	R
FIOPOPLD	stream	(4)	W
FIOPUSHLD	stream	(4)	W
FIORCVFD	stream	(4)	R, \*(y3
FIOSNDFD	stream	(4)	W
FIOSSRC	stream	(4)	W, \*(z6
TIOCEXCL	stream	(4)
TIOCFLUSH	stream	(4)	W
TIOCGPGRP	stream	(4)
TIOCNXCL	stream	(4)
TIOCSBRK	stream	(4)	W
TIOCSPGRP	stream	(4)	\*(y4
TIOCGDEV	tty	(4)	R
TIOCSDEV	tty	(4)	W
TIOCGETC	ttyld	(4)	R
TIOCGETP	ttyld	(4)	R
TIOCSETC	ttyld	(4)	W
TIOCSETP	ttyld	(4)	W
.TE
.bp
.SH
References
.LP
.tr ~ 
|reference_placement
