--- /dev/null	Sun Aug  5 23:41:09 2018
+++ new/usr/src/man/man3c/getsockopt.3c	Sun Aug  5 23:41:09 2018
@@ -0,0 +1,466 @@
+.\"
+.\" The contents of this file are subject to the terms of the
+.\" Common Development and Distribution License (the "License").
+.\" You may not use this file except in compliance with the License.
+.\"
+.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+.\" or http://www.opensolaris.org/os/licensing.
+.\" See the License for the specific language governing permissions
+.\" and limitations under the License.
+.\"
+.\" When distributing Covered Code, include this CDDL HEADER in each
+.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+.\" If applicable, add the following below this CDDL HEADER, with the
+.\" fields enclosed by brackets "[]" replaced with your own identifying
+.\" information: Portions Copyright [yyyy] [name of copyright owner]
+.\"
+.\"
+.\" Copyright 1989 AT&T
+.\" Copyright (C) 2009, Sun Microsystems, Inc. All Rights Reserved
+.\" Copyright 2018 Nexenta Systems, Inc.
+.\"
+.Dd August 2, 2018
+.Dt GETSOCKOPT 3C
+.Os
+.Sh NAME
+.Nm getsockopt ,
+.Nm setsockopt
+.Nd get and set options on sockets
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In sys/types.h
+.In sys/socket.h
+.Ft int
+.Fo getsockopt
+.Fa "int s"
+.Fa "int level"
+.Fa "int optname"
+.Fa "void *restrict optval"
+.Fa "socklen_t *optlen"
+.Fc
+.Ft int
+.Fo setsockopt
+.Fa "int s"
+.Fa "int level"
+.Fa "int optname"
+.Fa "const void *optval"
+.Fa "socklen_t optlen"
+.Fc
+.Sh DESCRIPTION
+The
+.Fn getsockopt
+and
+.Fn setsockopt
+functions manipulate options associated with a socket.
+Options may exist at multiple protocol levels; they are always present at the
+uppermost "socket" level.
+.Pp
+The
+.Fa level
+argument specifies the protocol level at which the option resides.
+To manipulate options at the socket level, specify the
+.Fa level
+argument as
+.Dv SOL_SOCKET .
+To manipulate options at the protocol level, supply the appropriate protocol
+number for the protocol controlling the option.
+For example, to indicate that an option will be interpreted by the TCP, set
+.Fa level
+to the protocol number of TCP, as defined in the
+.In netinet/in.h
+header, or as determined by using
+.Xr getprotobyname 3SOCKET .
+Some socket protocol families may also define additional levels, such as
+.Dv SOL_ROUTE .
+Only socket-level options are described here.
+.Pp
+The parameters
+.Fa optval
+and
+.Fa optlen
+are used to access option values for
+.Fn setsockopt .
+For
+.Fn getsockopt ,
+they identify a buffer in which the value(s) for the requested option(s) are to
+be returned.
+For
+.Fn getsockopt ,
+.Fa optlen
+is a value-result parameter, initially containing the size of the buffer pointed
+to by
+.Fa optval ,
+and modified on return to indicate the actual size of the value returned.
+Use a 0
+.Fa optval
+if no option value is to be supplied or returned.
+.Pp
+The
+.Fa optname
+and any specified options are passed uninterpreted to the appropriate protocol
+module for interpretation.
+The include file
+.In sys/socket.h
+contains definitions for the socket-level options described below.
+Options at other protocol levels vary in format and name.
+.Pp
+Most socket-level options take an
+.Vt int
+for
+.Fa optval .
+For
+.Fn setsockopt ,
+the
+.Fa optval
+parameter should be non-zero to enable a boolean option, or zero if the option
+is to be disabled.
+.Dv SO_LINGER
+uses a
+.Vt "struct linger"
+parameter that specifies the desired state of the option and the linger
+interval.
+.Vt "struct linger"
+is defined in
+.In sys/socket.h .
+.Vt "struct linger"
+contains the following members:
+.Bl -tag -width "l_linger"
+.It Va l_onoff
+on = 1/off = 0
+.It Va l_linger
+linger time, in seconds
+.El
+.Pp
+The following options are recognized at the socket level.
+Except as noted, each may be examined with
+.Fn getsockopt
+and set with
+.Fn setsockopt .
+.Bl -tag -width "SO_DGRAM_ERRIND"
+.It Dv SO_DEBUG
+enable/disable recording of debugging information
+.It Dv SO_REUSEADDR
+enable/disable local address reuse
+.It Dv SO_KEEPALIVE
+enable/disable keep connections alive
+.It Dv SO_DONTROUTE
+enable/disable routing bypass for outgoing messages
+.It Dv SO_LINGER
+linger on close if data is present
+.It Dv SO_BROADCAST
+enable/disable permission to transmit broadcast messages
+.It Dv SO_OOBINLINE
+enable/disable reception of out-of-band data in band
+.It Dv SO_SNDBUF
+set buffer size for output
+.It Dv SO_RCVBUF
+set buffer size for input
+.It Dv SO_DGRAM_ERRIND
+application wants delayed error
+.It Dv SO_TIMESTAMP
+enable/disable reception of timestamp with datagrams
+.It Dv SO_EXCLBIND
+enable/disable exclusive binding of the socket
+.It Dv SO_TYPE
+get the type of the socket (get only)
+.It Dv SO_ERROR
+get and clear error on the socket (get only)
+.It Dv SO_MAC_EXEMPT
+get or set mandatory access control on the socket.
+This option is available only when the system is configured with Trusted
+Extensions.
+.It Dv SO_ALLZONES
+bypass zone boundaries (privileged).
+.It Dv SO_DOMAIN
+get the domain used in the socket (get only)
+.It Dv SO_PROTOTYPE
+for socket in domains
+.Dv PF_INET
+and
+.Dv PF_INET6 ,
+get the underlying protocol number used in the socket.
+For socket in domain
+.Dv PF_ROUTE ,
+get the address family used in the socket.
+.El
+.Pp
+The
+.Dv SO_DEBUG
+option enables debugging in the underlying protocol modules.
+The
+.Dv SO_REUSEADDR
+option indicates that the rules used in validating addresses supplied in a
+.Xr bind 3C
+call should allow reuse of local addresses.
+The
+.Dv SO_KEEPALIVE
+option enables the periodic transmission of messages on a connected socket.
+If the connected party fails to respond to these messages, the connection is
+considered broken and threads using the socket are notified using a
+.Dv SIGPIPE
+signal.
+The
+.Dv SO_DONTROUTE
+option indicates that outgoing messages should bypass the standard routing
+facilities.
+Instead, messages are directed to the appropriate network interface according
+to the network portion of the destination address.
+.Pp
+The
+.Dv SO_LINGER
+option controls the action taken when unsent messages are queued on a socket and
+a
+.Xr close 2
+is performed.
+If the socket promises reliable delivery of data and
+.Dv SO_LINGER
+is set, the system will block the thread on the
+.Xr close 2
+attempt until it is able to transmit the data or until it decides it is unable
+to deliver the information (a timeout period, termed the linger interval, is
+specified in the
+.Fn setsockopt
+call when
+.Dv SO_LINGER
+is requested).
+If
+.Dv SO_LINGER
+is disabled and a
+.Xr close 2
+is issued, the system will process the
+.Xr close 2
+in a manner that allows the thread to continue as quickly as possible.
+.Pp
+The option
+.Dv SO_BROADCAST
+requests permission to send broadcast datagrams on the socket.
+With protocols that support out-of-band data, the
+.Dv SO_OOBINLINE
+option requests that out-of-band data be placed in the normal data input queue
+as received; it will then be accessible with
+.Xr recv 3C
+or
+.Xr read 2
+calls without the
+.Dv MSG_OOB
+flag.
+.Pp
+The
+.Dv SO_SNDBUF
+and
+.Dv SO_RCVBUF
+options adjust the normal buffer sizes allocated for output and input buffers,
+respectively.
+The buffer size may be increased for high-volume connections or may be decreased
+to limit the possible backlog of incoming data.
+The maximum buffer size for UDP is determined by the value of the
+.Xr ndd 1M
+variable
+.Cm udp_max_buf .
+The maximum buffer size for TCP is determined the value of the
+.Xr ndd 1M
+variable
+.Cm tcp_max_buf .
+Use the
+.Xr ndd 1M
+utility to determine the current default values.
+At present, lowering
+.Dv SO_RCVBUF
+on a TCP connection after it has been established has no effect.
+.Pp
+By default, delayed errors (such as ICMP
+.Dq Port Unreachable
+packets) are returned only for connected datagram sockets.
+The
+.Dv SO_DGRAM_ERRIND
+option makes it possible to receive errors for datagram sockets that are not
+connected.
+When this option is set, certain delayed errors received after completion of a
+.Xr sendto 3C
+or
+.Xr sendmsg 3C
+operation will cause a subsequent
+.Xr sendto 3C
+or
+.Xr sendmsg 3C
+operation using the same destination address
+.Po Fa to
+parameter
+.Pc
+to fail with the appropriate error.
+See
+.Xr send 3C .
+.Pp
+If the
+.Dv SO_TIMESTAMP
+option is enabled on a
+.Dv SO_DGRAM
+or a
+.Dv SO_RAW
+socket, the
+.Xr recvmsg 3XNET
+call will return a timestamp in the native data format, corresponding to when
+the datagram was received.
+.Pp
+The
+.Dv SO_EXCLBIND
+option is used to enable or disable the exclusive binding of a socket.
+It overrides the use of the
+.Dv SO_REUSEADDR
+option to reuse an address on
+.Xr bind 3C .
+The actual semantics of the
+.Dv SO_EXCLBIND
+option depend on the underlying protocol.
+See
+.Xr tcp 7P
+or
+.Xr udp 7P
+for more information.
+.Pp
+The
+.Dv SO_TYPE
+and
+.Dv SO_ERROR
+options are used only with
+.Fn getsockopt .
+The
+.Dv SO_TYPE
+option returns the type of the socket, for example,
+.Dv SOCK_STREAM .
+It is useful for servers that inherit sockets on startup.
+The
+.Dv SO_ERROR
+option returns any pending error on the socket and clears the error status.
+It may be used to check for asynchronous errors on connected datagram sockets or
+for other asynchronous errors.
+.Pp
+The
+.Dv SO_MAC_EXEMPT
+option is used to toggle socket behavior with unlabeled peers.
+A socket that has this option enabled can communicate with an unlabeled peer if
+it is in the global zone or has a label that dominates the default label of the
+peer.
+Otherwise, the socket must have a label that is equal to the default label of
+the unlabeled peer.
+Calling
+.Fn setsockopt
+with this option returns an
+.Er EACCES
+error if the process lacks the
+.Dv NET_MAC_AWARE
+privilege or if the socket is bound.
+The
+.Dv SO_MAC_EXEMPT
+option is available only when the system is configured with Trusted Extensions.
+.Pp
+The
+.Dv SO_ALLZONES
+option can be used to bypass zone boundaries between shared-IP zones.
+Normally, the system prevents a socket from being bound to an address that is
+not assigned to the current zone.
+It also prevents a socket that is bound to a wildcard address from receiving
+traffic for other zones.
+However, some daemons which run in the global zone might need to send and
+receive traffic using addresses that belong to other shared-IP zones.
+If set before a socket is bound,
+.Dv SO_ALLZONES
+causes the socket to ignore zone boundaries between shared-IP zones and permits
+the socket to be bound to any address assigned to the shared-IP zones.
+If the socket is bound to a wildcard address, it receives traffic intended for
+all shared-IP zones and behaves as if an equivalent socket were bound in each
+active shared-IP zone.
+Applications that use the
+.Dv SO_ALLZONES
+option to initiate connections or send datagram traffic should specify the
+source address for outbound traffic by binding to a specific address.
+There is no effect from setting this option in an exclusive-IP zone.
+Setting this option requires the
+.Em sys_net_config
+privilege.
+See
+.Xr zones 5 .
+.Sh RETURN VALUES
+If successful,
+.Fn getsockopt
+and
+.Fn setsockopt
+return 0.
+Otherwise, the functions return -1 and set
+.Va errno
+to indicate the error.
+.Sh ERRORS
+The
+.Fn getsockopt
+and
+.Fn setsockopt
+calls succeed unless:
+.Bl -tag -width Er
+.It Bq Er EBADF
+The argument
+.Fa s
+is not a valid file descriptor.
+.It Bq Er ENOMEM
+There was insufficient memory available for the operation to complete.
+.It Bq Er ENOPROTOOPT
+The option is unknown at the level indicated.
+.It Bq Er ENOSR
+There were insufficient STREAMS resources available for the operation to
+complete.
+.It Bq Er ENOTSOCK
+The argument
+.Fa s
+is not a socket.
+.It Bq Er ENOBUFS
+.Dv SO_SNDBUF
+or
+.Dv SO_RCVBUF
+exceeds a system limit.
+.It Bq Er EINVAL
+Invalid length for a given socket option.
+.It Bq Er EHOSTUNREACH
+Invalid address for
+.Dv IP_MULTICAST_IF .
+.It Bq Er EINVAL
+Not a multicast address for
+.Dv IP_ADD_MEMBERSHIP
+and
+.Dv IP_DROP_MEMBERSHIP .
+.It Bq Er EADDRNOTAVAIL
+Bad interface address for
+.Dv IP_ADD_MEMBERSHIP
+and
+.Dv IP_DROP_MEMBERSHIP .
+.It Bq Er EADDRINUSE
+Address already joined for
+.Dv IP_ADD_MEMBERSHIP .
+.It Bq Er ENOENT
+Address not joined for
+.Dv IP_DROP_MEMBERSHIP .
+.It Bq Er EPERM
+No permissions.
+.It Bq Er EACCES
+Permission denied.
+.It Bq Er EINVAL
+The specified option is invalid at the specified socket level, or the socket
+has been shut down.
+.El
+.Sh MT-LEVEL
+.Sy Safe
+.Sh SEE ALSO
+.Xr ndd 1M ,
+.Xr close 2 ,
+.Xr ioctl 2 ,
+.Xr read 2 ,
+.Xr bind 3C ,
+.Xr recv 3C ,
+.Xr send 3C ,
+.Xr socket 3C ,
+.Xr socket.h 3HEAD ,
+.Xr getprotobyname 3SOCKET ,
+.Xr recvmsg 3XNET ,
+.Xr attributes 5 ,
+.Xr zones 5 ,
+.Xr tcp 7P ,
+.Xr udp 7P
