NAME
t_rcvudata() — receive a data unit from remote transport provider user
SYNOPSIS
#include <xti.h> /* for X/OPEN Transport Interface - XTI */
/* or */
#include <tiuser.h> /* for Transport Layer Interface - TLI */
int t_rcvudata (fd, unitdata, flags);
inf fd;
struct t_unitdata *unitdata;
int *flags;
DESCRIPTION
The
t_rcvudata()
function is used in connectionless-mode to receive a data unit
from a remote transport provider user. The argument
fd
identifies the local
transport endpoint through which data will be received.
unitdata
holds information associated with the received data unit.
flags
is set on return to indicate that the complete data unit was not
received. The argument
unitdata
points to a
t_unitdata
structure containing the following members:
struct netbuf addr;
struct netbuf opt;
struct netbuf udata;
The type
netbuf
structure is defined in the
<xti.h>
or
<tiuser.h>
header file. This structure, which is used to define buffer parameters,
has the following members:
- unsigned int maxlen
maximum byte length of the data buffer
- unsigned int len
actual byte length of data written to buffer
- char *buf
points to buffer location
The
maxlen
field of
addr,
opt
and
udata
must be set before
calling this function to indicate the maximum size of the buffer
for each.
On return from this call,
addr
specifies the protocol address of the
sending user,
opt
identifies protocol-specific options that were
associated with this data unit, and
udata
specifies the user data that was received.
By default,
t_rcvudata()
executes in the synchronous operating mode. The
t_rcvudata()
function waits for data to arrive at the transport
endpoint specified by
fd
before returning control to the transport user
who called this function. However, when the transport endpoint,
specified by the
fd
parameter, has the
O_NONBLOCK
option set by
t_open()
or
fcntl()
function, the
t_rcvudata()
function executes in asynchronous mode. In asynchronous mode, when
a data
unit is unavailable, control is immediately returned to the caller.
If the buffer defined in the
udata
field of
unitdata
is not large
enough to hold the current data unit, the buffer will be filled and
T_MORE will be set in
flags
on return to indicate that another
t_rcvudata()
should be called to retrieve the rest of the data unit.
Subsequent calls to
t_rcvudata()
will return zero for the length of the
address and options until the full data unit has been received.
Fork Safety
t_rcvudata
is not fork-safe.
RETURN VALUE
Upon successful completion, a value of 0 is returned. Otherwise, a value of -1
is returned and
t_errno
is set to indicate the error.
ERRORS
On failure,
t_errno
is set to one of the following:
- [TBADF]
The specified file descriptor does not refer to a transport endpoint.
- [TNODATA]
O_NONBLOCK
was set, but no data units are currently available from the transport provider.
- [TBUFOVFLW]
The number of bytes allocated for the incoming protocol address or protocol
options is not sufficient to store the information. The unit data information
normally returned in
unitdata
is discarded.
- [TLOOK]
An asynchronous event has occurred on this transport endpoint required
immediate attention.
- [TNOTSUPPORT]
This function is not supported by the underlying transport provider.
- [TOUTSTATE]
(XTI only) The function was issued in the wrong sequence on the transport
endpoint referenced by
fd.
- [TSYSERR]
A system error occurred during execution of this function.
- [TPROTO]
(XTI only) This error indicates that a communication problem has been
detected between XTI and the transport provider for which there is no
other suitable XTI (t_errno).
STANDARDS CONFORMANCE
t_rcvudata(): SVID2, XPG3, XPG4