RCMD(3SOCKET)             Sockets Library Functions            RCMD(3SOCKET)
NAME
       rcmd, rcmd_af, rresvport, rresvport_af, ruserok - routines for
       returning a stream to a remote command
SYNOPSIS
       cc [ 
flag ... ] 
file... 
-lsocket  -lnsl  [ 
library... ]
       #include <netdb.h>
       #include <unistd.h>       
int rcmd(
char **ahost, 
unsigned short inport, 
const char *luser,            
const char *ruser, 
const char *cmd, 
int *fd2p);       
int rcmd_af(
char **ahost, 
unsigned short inport, 
const char *luser,            
const char *ruser, 
const char *cmd, 
int *fd2p, 
int af);       
int rresvport(
int *port);       
int rresvport_af(
int *port, 
int af);       
int ruserok(
const char *rhost, 
int suser, 
const char *ruser,            
const char *luser);
DESCRIPTION
       The 
rcmd() function is used by the superuser to execute a command on
       a remote machine with an authentication scheme based on reserved port
       numbers. An 
AF_INET socket is returned with 
rcmd(). The 
rcmd_af()       function supports 
AF_INET, 
AF_INET6 or 
AF_UNSPEC for the address
       family. An application can choose which type of socket is returned by
       passing 
AF_INET or 
AF_INET6 as the address family. The use of       
AF_UNSPEC means that the caller will accept any address family.
       Choosing 
AF_UNSPEC provides a socket that best suits the connectivity
       to the remote host.
       The 
rresvport() function returns a descriptor to a socket with an
       address in the privileged port space. The 
rresvport_af() function is
       the equivalent to 
rresvport(), except that you can choose 
AF_INET or       
AF_INET6 as the socket address family to be returned by       
rresvport_af(). 
AF_UNSPEC does not apply to the 
rresvport() function.
       The 
ruserok() function is a routine used by servers to authenticate
       clients that request as service with 
rcmd.
       All of these functions are present in the same file and are used by
       the 
in.rshd(8) server among others.
       The 
rcmd() and 
rcmd_af() functions look up the host 
*ahost using       
getaddrinfo(3SOCKET) and return 
-1 if the host does not exist.
       Otherwise, *
ahost is set to the standard name of the host and a
       connection is established to a server residing at the Internet port       
inport.
       If the connection succeeds, a socket in the Internet domain of type       
SOCK_STREAM is returned to the caller. The socket is given to the
       remote command as standard input (file descriptor 0) and standard
       output (file descriptor 1). If 
fd2p is non-zero, an auxiliary channel
       to a control process is set up and a descriptor for it is placed in       
*fd2p. The control process returns diagnostic output file (descriptor
       2) from the command on the auxiliary channel. The control process
       also accepts bytes on this channel as signal numbers to be forwarded
       to the process group of the command. If 
fd2p is 0, the standard error
       (file descriptor 2) of the remote command is made the same as its
       standard output. No provision is made for sending arbitrary signals
       to the remote process, other than possibly sending out-of-band data.
       The protocol is described in detail in 
in.rshd(8).
       The 
rresvport() and 
rresvport_af() functions are used to obtain a
       socket bound to a privileged port number. The socket is suitable for
       use by 
rcmd() and 
rresvport_af() and several other routines.
       Privileged Internet ports are those in the range 1 to 1023. Only the
       superuser is allowed to bind a socket to a privileged port number.
       The application must pass in 
port, which must be in the range 512 to
       1023. The system first tries to bind to that port number.  If it
       fails, the system then tries to bind to another unused privileged
       port, if one is available.
       The 
ruserok() function takes a remote host name returned by the       
gethostbyaddr() function with two user names and a flag to indicate
       whether the local user's name is that of the superuser. See       
gethostbyname(3NSL). The 
ruserok() function then checks the files       
/etc/hosts.equiv and possibly 
.rhosts in the local user's home
       directory to see if the request for service is allowed. A 
0 value is
       returned if the machine name is listed in the 
/etc/hosts.equiv file,
       or if the host and remote user name are found in the 
.rhosts file.
       Otherwise, the 
ruserok() function returns 
-1. If the superuser flag
       is 
1, the 
/etc/hosts.equiv is not checked.
       The error code 
EAGAIN is overloaded to mean "All network ports in
       use."
RETURN VALUES
       The 
rcmd() and 
rcmd_af() functions return a valid socket descriptor
       upon success. The functions returns 
-1 upon error and print a
       diagnostic message to standard error.
       The 
rresvport() and 
rresvport_af() functions return a valid, bound
       socket descriptor upon success. The functions return 
-1 upon error
       with the global value 
errno set according to the reason for failure.
FILES
       /etc/hosts.equiv                           system trusted hosts and users       
~/.rhosts                           user's trusted hosts and users
ATTRIBUTES
       See 
attributes(7) for descriptions of the following attributes:
       +---------------+-----------------+
       |ATTRIBUTE TYPE | ATTRIBUTE VALUE |
       +---------------+-----------------+
       |MT-Level       | Unsafe          |
       +---------------+-----------------+
       This interface is Unsafe in multithreaded applications. Unsafe
       interfaces should be called only from the main thread.
SEE ALSO
       rlogin(1), 
rsh(1), 
Intro(2), 
gethostbyname(3NSL),       
getaddrinfo(3SOCKET), 
rexec(3SOCKET), 
attributes(7), 
in.rexecd(8),       
in.rshd(8)                              February 10, 2004                RCMD(3SOCKET)