ACCEPT(2) ACCEPT(2) NAME accept - accept a connection on a socket SYNOPSIS #include <sys/types.h> #include <sys/socket.h> int accept (int s, struct sockaddr *addr, socklen_t *addrlen); #if _XOPEN_SOURCE >= 500 int accept (int s, struct sockaddr *addr, socklen_t *addrlen); #elif _XOPEN_SOURCE < 500 int accept (int s, struct sockaddr *addr, size_t *addrlen); #endif DESCRIPTION The argument s is a socket that has been created with socket(2), bound to an address with bind(2), and is listening for connections after a listen(2). Accept extracts the first connection on the queue of pending connections, creates a new socket with the same properties of s and allocates a new file descriptor for the socket. If no pending connections are present on the queue, and the socket is not marked as non-blocking, accept blocks the caller until a connection is present. If the socket is marked non-blocking and no pending connections are present on the queue, accept returns an error as described below. The accepted socket may not be used to accept more connections. The original socket s remains open. If addr is non-zero, it is 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 addr parameter is determined by the domain in which the communication is occurring. The addrlen is a value-result parameter. It should initially contain the amount of space pointed to by addr; on return it will contain the actual length (in bytes) of the address returned. If addr is zero, addrlen is ignored. This call is used with connection-based socket types, currently with SOCK_STREAM. It is possible to select(2) a socket for the purposes of doing an accept by selecting it for read. RETURN VALUE The call returns -1 on error. If it succeeds, it returns a non-negative integer that is a descriptor for the accepted socket. ERRORS The accept will fail if: [EBADF] The descriptor is invalid. [ENOTSOCK] The descriptor references a file, not a socket. [EOPNOTSUPP] The referenced socket is not of type SOCK_STREAM. [EFAULT] The addr or addrlen parameter is not in a writable part of the user address space. [EWOULDBLOCK] The socket is marked non-blocking and no connections are present to be accepted. [EMFILE] The per-process descriptor table is full. [ENFILE] The system file table is full. SEE ALSO bind(2), connect(2), listen(2), select(2), socket(2) NOTES ABI-compliant versions of the above call can be obtained from libsocket.so. When used with a socket of type AF_UNIX, this call does not return a valid remote address, unless the remote end was explicitly bound to a pathname. There are three types of accept functions in n32 and 64 bit C libraries for IRIX 6.5.19 and later versions. One is the normal type when _XOPEN_SOURCE is not defined; the second is XPG5 type when _XOPEN_SOURCE is set to >= 500; and the third is XPG4 type when _XOPEN_SOURCE set to < 500. The difference between these functions is in the third argument type to accept. Refer <sys/socket.h> for alternate definitions of socklen_t type. 1. For the normal case when _XOPEN_SOURCE is not defined, third argument type, a pointer to a socklen_t type, will be an integer pointer and the normal accept is used. 2. When _XOPEN_SOURCE is set to >= 500, third argument type, a pointer to a socklen_t type, will actually be a pointer to an u_int32_t type and xpg5 type function will be used. 3. When _XOPEN_SOURCE is set to < 500, third argument type will be a pointer to a size_t type and xpg4 type function will be used. XPG5 type function is not supported in o32 C library. The XPG5 type accept function is actually defined as a static inline function in <sys/socket.h>, and it calls a new function _xpg5_accept which is specific to IRIX 6.5.19 and later. Therefore applications that call XPG5 type accept should check the existence of the new symbol. #include <sys/socket.h> #include <optional_sym.h> if (_MIPS_SYMBOL_PRESENT(_xpg5_accept)) { accept(s, &addr, &addrlen); } else { ... } Because the static inline function is defined in each source file that includes <sys/socket.h>, these static functions will have different addresses in any cases that inline expansion is not performed. This may cause problems if the address of the function is examined in programs. To avoid this problem, use -D_XPG5_ACCEPT_USER_DEFINED compile option to disable the static inline definition in <sys/socket.h>, and define a user defined function with below definition: int * accept(int _s, struct sockaddr *_addr, socklen_t *_addrlen) { return(_xpg5_accept(_s, _addr, _addrlen)); } Use the compile option always, when a user defined XPG5 accept function is required. Page 3