Compaq C
Compaq C Run-Time Library Reference Manual for 
OpenVMS Systems
 
 
A.6 Relationship Between errno and h_errno
Since the routines that set
h_errno
 can also set
errno
, this section explains the relationship between the two variables.
 
A given routine failure does not set both
h_errno
 and
errno
 for the same failure. A routine failure sets either
h_errno
 or
errno
 depending on which is appropriate for the failing condition.
 
For example, consider the following program:
 
 
  
    
       
      
/* Demonstrate relationship between errno and h_errno   */ 
/* from Appendix A of the reference manual              */ 
 
#include   <errno.h> 
#include   <stdio.h> 
#include   <netdb.h> 
 
main() 
{ 
    static char hostname[256]; 
    struct hostent *hostentptr; 
 
    errno = 0; 
    h_errno = 0; 
    if ((hostentptr = gethostbyname("hndy")) == NULL) { 
        printf("unknown host name errno is: %d h_errno is: %d\n", errno, h_errn 
        perror("p_gethostbyname"); 
        herror("h_gethostbyname"); 
    } 
 
    errno = 0; 
    h_errno = 0; 
    if ((hostentptr = gethostbyname(0)) == NULL) { 
        printf("illegal host name errno is: %d h_errno is: %d\n", errno, h_errn 
        perror("p_gethostbyname"); 
        herror("h_gethostbyname"); 
    } 
}       
 |   
In the first call to
gethostbyname
, the host name parameter "hndy" does not represent a known 
host. In this case,
gethostbyname
 sets
h_errno
 to
HOST_NOT_FOUND
, but does not set
errno
.
 
The call to
perror
 in this example would output:
 
 
The call to
herror
 in this example would print a message describing the failure:
 
 
In the second call to
gethostbyname
, the host name parameter is 0 (zero), an invalid argument. In 
this case,
gethostbyname
 sets
errno
 to
EINVAL
, but does not set
h_errno
.
 
A call to
perror
 would print a message describing the failure:
 
 
A call to
herror
 would print:
 
 
A.7 TCP/IP Interface Enhancements
The Compaq C RTL provides the language bindings for a 
4.4BSD-compatible TCP/IP implementation. The underlying 4.4BSD 
semantics for the specific TCP/IP routines are the responsibility of 
the TCP/IP back-end vendors.
 
With 4.4BSD semantics,
gethostbyname
 and
gethostbyaddr
 set the external variable
h_errno
. Other routines (see Table A-3) deal with 4.4BSD versions of the
sockaddr
 and
msghdr
 data structures. See the
<socket.h>
 header file for a description of these structures.
 
The TCP/IP backend routines need to know the following:
 
  - Whether
gethostbyname
 and
gethostbyaddr
should set
h_errno
.
  
 - What type of
sockaddr
 and
msghdr
structures the Compaq C RTL is passing them---those defined by 
4.4BSD systems, or those defined by pre-4.4BSD systems).
  
This information is controlled by the
_SOCKADDR_LEN
feature-test macro (see Section 1.5).
 
Compiling with
_SOCKADDR_LEN
 defined will enable the entry points that have 4.4BSD semantics. See 
 Table A-3. Otherwise, entry points expecting pre-4.4BSD semantics 
 are enabled.  
 
  Table A-3 4.4BSD Entry Points
  
    | 
      
      __bsd44_accept
      
     | 
    
      
      __bsd44_gethostbyaddr
      
     | 
    
      
      __bsd44_recvfrom
      
     | 
   
  
    | 
      
      __bsd44_bind
      
     | 
    
      
      __bsd44_gethostbyname
      
     | 
    
      
      __bsd44_recvmsg
      
     | 
   
  
    | 
      
      __bsd44_connect
      
     | 
    
      
      __bsd44_getpeername
      
     | 
    
      
      __bsd44_sendto
      
     | 
   
  
    | 
       
     | 
    
      
      __bsd44_getsockname
      
     | 
    
      
      __bsd44_sendmsg
      
     | 
   
 
A.8 Summary of Socket Routines
This section groups and briefly describes the socket routines. For 
complete descriptions, see the routine reference section that follows 
in this appendix.
A.8.1 Basic Communication Routines
 
Table A-4 lists the basic communication routines that make up the 
building blocks of Internet programs.  
 
  Table A-4 Basic Communication Routines
  
    | Routine  | 
    Description  | 
   
  
    | 
      
      accept
      
     | 
    
      Accepts a connection on a socket.
     | 
   
  
    | 
      
      bind
      
     | 
    
      Binds a name to a socket.
     | 
   
  
    | 
      
      close
      
     | 
    
      Closes a connection and deletes a socket descriptor.
     | 
   
  
    | 
      
      connect
      
     | 
    
      Initiates a connection on a socket.
     | 
   
  
    | 
      
      ioctl
      
     | 
    
      Controls socket operations only.
     | 
   
  
    | 
      
      listen
      
     | 
    
      Sets the maximum limit of outstanding connection requests for a socket.
     | 
   
  
    | 
      
      read
      
     | 
    
      Reads bytes from a file or socket and places them into a buffer.
     | 
   
  
    | 
      
      readv
      
     | 
    
      Not implemented.
     | 
   
  
    | 
      
      recv
      
     | 
    
      Receives bytes from a socket and places them into a buffer.
     | 
   
  
    | 
      
      recvfrom
      
     | 
    
      Receives bytes for a socket from any source.
     | 
   
  
    | 
      
      recvmsg
      
     | 
    
      Receives bytes from a socket and places them into scattered buffers.
     | 
   
  
    | 
      
      select
      
     | 
    
      Allows the polling or checking of a group of sockets.
     | 
   
  
    | 
      
      send
      
     | 
    
      Sends bytes through a socket to a connected peer.
     | 
   
  
    | 
      
      sendmsg
      
     | 
    
      Sends gathered bytes through a socket to any other socket.
     | 
   
  
    | 
      
      sendto
      
     | 
    
      Sends bytes through a socket to any other socket.
     | 
   
  
    | 
      
      shutdown
      
     | 
    
      Shuts down all or part of a bidirectional socket.
     | 
   
  
    | 
      
      socket
      
     | 
    
      Creates an endpoint for communication by returning a socket descriptor.
     | 
   
  
    | 
      write
     | 
    
      Writes bytes from a buffer to a file or socket.
     | 
   
  
    | 
      writev
     | 
    
      Not implemented.
     | 
   
 
A.8.2 Auxiliary Communication Routines
Table A-5 lists the auxiliary communication routines. These 
routines are used to provide information about a socket and to set the 
options on a socket.  
 
  Table A-5 Auxiliary Communication Routines
  
    | Routine  | 
    Description  | 
   
  
    | 
      
      getpeername
      
     | 
    
      Returns the name of the connected peer.
     | 
   
  
    | 
      
      getsockname
      
     | 
    
      Returns the name associated with a socket.
     | 
   
  
    | 
      
      getsockopt
      
     | 
    
      Returns the options set on a socket.
     | 
   
  
    | 
      
      setsockopt
      
     | 
    
      Sets options on a socket.
     | 
   
 
A.8.3 h_errno Support Routines
Table A-6 lists the
h_errno
 support routines. These routines map and write error-message strings 
 generated by the external integer
h_errno
.
 
 
A.8.4 Communication Support Routines
Table A-7 lists the communication support routines. These routines 
perform operations such as searching databases, converting byte order 
of network and host addresses, reading records, and returning Internet 
addresses.  
 
  Table A-7 Supported Communication Routines
  
    | Routine  | 
    Description  | 
   
  
    | 
      
      decc$get_sdc
      
     | 
    
      Returns the socket device's OpenVMS I/O channel associated with a 
      socket descriptor. vaxc$get_sdc and decc$get_sdc are synonyms for the 
      same routine.
     | 
   
  
    | 
      
      endhostent
      
     | 
    
      Closes retrieval of network host entries and closes the network host 
      file.
     | 
   
  
    | 
      
      endnetent
      
     | 
    
      Closes the networks database file.
     | 
   
  
    | 
      
      endprotoent
      
     | 
    
      Closes the protocols database file.
     | 
   
  
    | 
      
      endservent
      
     | 
    
      Closes the network services database file.
     | 
   
  
    | 
      
      gethostaddr
      
     | 
    
      Returns the standard host address for the processor.
     | 
   
  
    | 
      
      gethostbyaddr
      
     | 
    
      Searches the host database for a host record with a given address.
     | 
   
  
    | 
      
      gethostbyname
      
     | 
    
      Searches the host database for a host record with a given name or alias.
     | 
   
  
    | 
      
      gethostname
      
     | 
    
      Returns the name of the current host.
     | 
   
  
    | 
      
      gethostent
      
     | 
    
      Opens the network host entry by name from the network host database 
      file.
     | 
   
  
    | 
      
      getnetbyaddr
      
     | 
    
      Searches the network database for a network record with a given address.
     | 
   
  
    | 
      
      getnetbyname
      
     | 
    
      Searches the network database for a network record with a given name or 
      alias.
     | 
   
  
    | 
      
      getnetent
      
     | 
    
      Gets a network file entry from the networks database file.
     | 
   
  
    | 
      
      getprotobyname
      
     | 
    
      Searches the protocols database until a matching protocol name is found 
      or until EOF is encountered.
     | 
   
  
    | 
      
      getprotobynumber
      
     | 
    
      Searches the protocols database until a matching protocol number is 
      found or until EOF is encountered.
     | 
   
  
    | 
      
      getprotoent
      
     | 
    
      Gets a protocol database entry from the protocols database file.
     | 
   
  
    | 
      
      getservbyname
      
     | 
    
      Gets information on the named service from the network services 
      database.
     | 
   
  
    | 
      
      getservbyport
      
     | 
    
      Gets information on the named port from the network services database.
     | 
   
  
    | 
      
      getservent
      
     | 
    
      Gets a services file entry from the network services database file.
     | 
   
  
    | 
      
      hostalias
      
     | 
    
      Searches for host aliases associated with a name.
     | 
   
  
    | 
      
      htonl
      
     | 
    
      Converts longwords from network to host byte order.
     | 
   
  
    | 
      
      htons
      
     | 
    
      Converts short integers from network to host byte order.
     | 
   
  
    | 
      
      inet_addr
      
     | 
    
      Converts Internet addresses in text form into numeric Internet 
      addresses.
     | 
   
  
    | 
      
      inet_lnaof
      
     | 
    
      Returns the local network address portion of an Internet address.
     | 
   
  
    | 
      
      inet_makeaddr
      
     | 
    
      Returns an Internet address given a network address and a local address 
      on that network.
     | 
   
  
    | 
      
      inet_netof
      
     | 
    
      Returns the Internet network address portion of an Internet address.
     | 
   
  
    | 
      
      inet_network
      
     | 
    
      Converts a null-terminated text string representing an Internet network 
      address into a network address in network byte order.
     | 
   
  
    | 
      
      inet_ntoa
      
     | 
    
      Converts an Internet address into an ASCIZ (null-terminated) string.
     | 
   
  
    | 
      
      ntohl
      
     | 
    
      Converts longwords from host to network byte order.
     | 
   
  
    | 
      
      ntohs
      
     | 
    
      Converts short integers from host to network byte order.
     | 
   
  
    | 
      
      sethostent
      
     | 
    
      Opens, rewinds, and closes the network host database file.
     | 
   
  
    | 
      
      setnetent
      
     | 
    
      Opens, rewinds, and closes the networks database file.
     | 
   
  
    | 
      
      setprotoent
      
     | 
    
      Opens, rewinds, and closes the protocols database file.
     | 
   
  
    | 
      
      setservent
      
     | 
    
      Opens, rewinds, and closes the network services database file.
     | 
   
  
    | 
      
      decc$socket_fd
      
     | 
    
      Returns the socket descriptor associated with a Socket Device Channel 
      for direct use with the Compaq C RTL.
     | 
   
  
    | 
      
      vaxc$get_sdc
      
     | 
    
      Returns the socket device's OpenVMS I/O channel associated with a 
      socket descriptor. vaxc$get_sdc and decc$get_sdc are synonyms for the 
      same routine.
     | 
   
 
  
accept
 
Accepts a connection on a socket.
 
 
Format
#include <socket.h>
int accept (int s, struct sockaddr *addr, int 
*addrlen);
 
 (_DECC_V4_SOURCE)
int accept (int s, struct sockaddr *addr, size_t 
*addrlen);
 
 (NOT _DECC_V4_SOURCE)
  
Routine Variants This socket routine has a variant named
__bsd44_accept
. Enabled by defining
_SOCKADDR_LEN
, this variant implements 4.4BSD-compatible semantics. See 
Section A.7 for more information.
 
Arguments
s
A socket descriptor that has been returned by
socket
, subsequently bound to an address with
bind
, and that is listening for connections after a
listen
.
addr
A result parameter that is filled in with the address of the connecting 
entity, as known to the communications layer. The exact format of the 
structure to which the address parameter points is determined by the 
domain in which the communication is occurring. This version of 
Compaq C supports only the Internet domain (AF_INET).
addrlen
A value-result parameter; it should initially contain the size of the 
structure pointed to by addr. On return it will contain the 
actual length, in bytes, of the structure that has been filled in by 
the communication layer. See
<socket.h>
 for a description of the
sockaddr
 structure.
 
 
Description
This routine completes the first connection on the queue of pending 
connections, creates a new socket with the same properties as 
s, and allocates and returns a new descriptor for the socket. 
If no pending connections are present on the queue, and the socket is 
not marked as nonblocking,
accept
 blocks the caller until a connection request is present. If the socket 
 is marked nonblocking by using a
setsockopt
 call and no pending connections are present on the queue,
accept
 returns an error. The accepted socket may not be used to accept 
 connections. The original socket s remains open (listening) 
 for other connection requests. This call is used with connection-based 
 socket types, currently with SOCK_STREAM.
It is possible to
select
 a socket for the purposes of performing an
accept
 by selecting it for read.
 
See also
bind
,
connect
,
listen
,
select
, and
socket
 in this section.
  
 
Return Values
  
    | 
      x
     | 
    
      A nonnegative integer that is a descriptor for the accepted socket.
     | 
   
  
    | 
      --1
     | 
    
      Indicates an error;
      
      errno
      
               is set to one of the following:
      
      - EBADF -- The socket descriptor is invalid.
      
 - ENOTSOCK -- The socket descriptor references a file, not a socket.
      
 - EOPNOTSUPP -- The reference socket is not of type SOCK_STREAM.
      
 - EFAULT -- The
      addr parameter is not in a writable part of the user address 
      space.
      
 - EWOULDBLOCK -- The socket is marked nonblocking and no connections 
      are present to be accepted.
      
  
     | 
   
 
 
 
bind
 
Binds a name to a socket.
 
 
Format
#include <socket.h>
int bind (int s, struct sockaddr *name, int 
namelen);
 
 (_DECC_V4_SOURCE)
int bind (int s, const struct sockaddr *name, size_t 
namelen);
 
 (NOT _DECC_V4_SOURCE)
  
Routine Variants This socket routine has a variant named
__bsd44_bind
. Enabled by defining
_SOCKADDR_LEN
, this variant implements 4.4BSD-compatible semantics. See 
Section A.7 for more information.
 
Arguments
s
A socket descriptor that has been created with
socket
.
name
Address of a structure used to assign a name to the socket in the 
format specific to the family (AF_INET) socket address. See
<socket.h>
 for a description of the
sockaddr
 structure.
namelen
The size, in bytes, of the structure pointed to by name.
 
 
Description
This routine assigns a name to an unnamed socket. When a socket is 
created with
socket
it exists in a name space (address family) but has no name assigned. The
bind
 routine requests that a name be assigned to the socket.
See also
connect
,
getsockname
,
listen
, and
socket
 in this appendix.
  
 
Return Values
  
    | 
      0
     | 
    
      Indicates success.
     | 
   
  
    | 
      --1
     | 
    
      Indicates an error;
      
      errno
      
               is set to one of the following values:
      
      - EBADF -- The socket descriptor is invalid.
      
 - ENOTSOCK -- The socket descriptor references a file, not a socket.
      
 - EADDRNOTAVAIL -- specified address is not available from the local 
      machine.
      
 - EADDRINUSE -- The specified Internet address and ports are already 
      in use.
      
 - EINVAL -- The socket is already bound to an address.
      
 - EACCESS -- The requested address is protected, and the current user 
      has inadequate permission to access it.
      
 - EFAULT -- The
      name parameter is not a valid part of the user address space.
      
  
     | 
   
 
 
  
         |