xref: /unit/src/nxt_socket.h (revision 1263)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru  */
60Sigor@sysoev.ru 
713Sigor@sysoev.ru #ifndef _NXT_SOCKET_H_INCLUDED_
813Sigor@sysoev.ru #define _NXT_SOCKET_H_INCLUDED_
90Sigor@sysoev.ru 
100Sigor@sysoev.ru 
110Sigor@sysoev.ru typedef int  nxt_socket_t;
120Sigor@sysoev.ru 
130Sigor@sysoev.ru #define NXT_NONBLOCK  1
140Sigor@sysoev.ru 
150Sigor@sysoev.ru 
160Sigor@sysoev.ru /*
170Sigor@sysoev.ru  * struct sockaddr and struct sockaddr_in are 16 bytes.
180Sigor@sysoev.ru  *
190Sigor@sysoev.ru  * struct sockaddr_in6 is:
200Sigor@sysoev.ru  *     28 bytes on Linux, FreeBSD, MacOSX, NetBSD, OpenBSD, AIX, HP-UX;
210Sigor@sysoev.ru  *     32 bytes on Solaris.
220Sigor@sysoev.ru  *
230Sigor@sysoev.ru  *
240Sigor@sysoev.ru  * struct sockaddr_un is:
250Sigor@sysoev.ru  *     94 bytes on HP-UX;
260Sigor@sysoev.ru  *    106 bytes on FreeBSD, MacOSX, NetBSD, OpenBSD;
270Sigor@sysoev.ru  *    110 bytes on Linux, Solaris;
280Sigor@sysoev.ru  *   1025 bytes on AIX.
290Sigor@sysoev.ru  *
300Sigor@sysoev.ru  * The real maximum sockaddr_un length however different from defined length:
310Sigor@sysoev.ru  *     OpenBSD can accept and return 105 bytes if address is not
320Sigor@sysoev.ru  *         zero-terminated;
330Sigor@sysoev.ru  *     Linux can accept 110 bytes and return 111 bytes;
340Sigor@sysoev.ru  *     MacOSX and NetBSD can accept and return 255 bytes;
350Sigor@sysoev.ru  *     Solaris can accept 257 bytes and return 258 bytes;
360Sigor@sysoev.ru  * FreeBSD maximum sockaddr_un length is equal to defined length.
370Sigor@sysoev.ru  *
380Sigor@sysoev.ru  * POSIX.1g renamed AF_UNIX to AF_LOCAL, however, Solaris up to 10
390Sigor@sysoev.ru  * version lacks AF_LOCAL.  AF_UNIX is defined even on Windows although
400Sigor@sysoev.ru  * struct sockaddr_un is not.
410Sigor@sysoev.ru  *
420Sigor@sysoev.ru  * Unix domain socket address without a trailing zero is accepted at least by:
430Sigor@sysoev.ru  *     Linux, FreeBSD, Solaris, MacOSX, NetBSD, and OpenBSD.
440Sigor@sysoev.ru  * Linux and Solaris add the trailing zero and return sockaddr_un length
450Sigor@sysoev.ru  * increased by one.  Others return sockaddr_un without the trailing zero.
460Sigor@sysoev.ru  *
470Sigor@sysoev.ru  * For unspecified Unix domain socket address
480Sigor@sysoev.ru  *     NetBSD returns sockaddr_un length equal to 106 and fills sun_path[]
490Sigor@sysoev.ru  *         with zeros;
500Sigor@sysoev.ru  *     FreeBSD, Solaris, MacOSX, and OpenBSD return sockaddr_un length
510Sigor@sysoev.ru  *         equal to 16 and fill sun_path[] with zeros;
520Sigor@sysoev.ru  *     Linux returns sockaddr_un length equal to 2 without sun_path[];
530Sigor@sysoev.ru  *
540Sigor@sysoev.ru  *     4.4BSD getsockname() and getpeername() returned zero length.
550Sigor@sysoev.ru  *     This behaviour has been inherited by BSD flavours and has been
560Sigor@sysoev.ru  *     eventually changed in NetBSD 1.2, FreeBSD 3.0, and OpenBSD 5.3.
570Sigor@sysoev.ru  *
580Sigor@sysoev.ru  *
590Sigor@sysoev.ru  * struct sockaddr_storage is:
600Sigor@sysoev.ru  *    128 bytes on Linux, FreeBSD, MacOSX, NetBSD;
610Sigor@sysoev.ru  *    256 bytes on Solaris, OpenBSD, and HP-UX;
620Sigor@sysoev.ru  *   1288 bytes on AIX.
630Sigor@sysoev.ru  *
640Sigor@sysoev.ru  * struct sockaddr_storage is too large on some platforms
650Sigor@sysoev.ru  * or less than real maximum struct sockaddr_un length.
660Sigor@sysoev.ru  */
670Sigor@sysoev.ru 
680Sigor@sysoev.ru #if (NXT_HAVE_UNIX_DOMAIN)
690Sigor@sysoev.ru #define NXT_SOCKADDR_LEN     sizeof(struct sockaddr_un)
700Sigor@sysoev.ru 
710Sigor@sysoev.ru #elif (NXT_HAVE_SOCKADDR_IN6)
720Sigor@sysoev.ru #define NXT_SOCKADDR_LEN     sizeof(struct sockaddr_in6)
730Sigor@sysoev.ru 
740Sigor@sysoev.ru #else
750Sigor@sysoev.ru #define NXT_SOCKADDR_LEN     sizeof(struct sockaddr_in)
760Sigor@sysoev.ru #endif
770Sigor@sysoev.ru 
780Sigor@sysoev.ru 
790Sigor@sysoev.ru typedef union {
800Sigor@sysoev.ru     struct sockaddr          buf;
810Sigor@sysoev.ru     uint64_t                 alignment;
820Sigor@sysoev.ru     char                     space[NXT_SOCKADDR_LEN];
830Sigor@sysoev.ru } nxt_sockaddr_buf_t;
840Sigor@sysoev.ru 
850Sigor@sysoev.ru 
860Sigor@sysoev.ru /*
870Sigor@sysoev.ru  * MAXHOSTNAMELEN is:
880Sigor@sysoev.ru  *    64 on Linux;
890Sigor@sysoev.ru  *   256 on FreeBSD, Solaris, MacOSX, NetBSD, OpenBSD.
900Sigor@sysoev.ru  */
910Sigor@sysoev.ru #define NXT_MAXHOSTNAMELEN  MAXHOSTNAMELEN
920Sigor@sysoev.ru 
930Sigor@sysoev.ru 
9413Sigor@sysoev.ru NXT_EXPORT nxt_socket_t nxt_socket_create(nxt_task_t *task, nxt_uint_t family,
9513Sigor@sysoev.ru     nxt_uint_t type, nxt_uint_t protocol, nxt_uint_t flags);
9613Sigor@sysoev.ru NXT_EXPORT void nxt_socket_close(nxt_task_t *task, nxt_socket_t s);
97229Sigor@sysoev.ru NXT_EXPORT void nxt_socket_defer_accept(nxt_task_t *task, nxt_socket_t s,
98229Sigor@sysoev.ru     nxt_sockaddr_t *sa);
9913Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_socket_getsockopt(nxt_task_t *task, nxt_socket_t s,
10013Sigor@sysoev.ru     nxt_uint_t level, nxt_uint_t sockopt);
10113Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_socket_setsockopt(nxt_task_t *task, nxt_socket_t s,
10213Sigor@sysoev.ru     nxt_uint_t level, nxt_uint_t sockopt, int val);
10313Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_socket_bind(nxt_task_t *task, nxt_socket_t s,
10413Sigor@sysoev.ru     nxt_sockaddr_t *sa, nxt_bool_t test);
10513Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_socket_connect(nxt_task_t *task, nxt_socket_t s,
10613Sigor@sysoev.ru     nxt_sockaddr_t *sa);
10713Sigor@sysoev.ru NXT_EXPORT void nxt_socket_shutdown(nxt_task_t *task, nxt_socket_t s,
10813Sigor@sysoev.ru     nxt_uint_t how);
109*1263Sigor@sysoev.ru nxt_err_t nxt_socket_error(nxt_socket_t s);
11013Sigor@sysoev.ru nxt_uint_t nxt_socket_error_level(nxt_err_t err);
1110Sigor@sysoev.ru 
11213Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_socketpair_create(nxt_task_t *task,
11313Sigor@sysoev.ru     nxt_socket_t *pair);
11413Sigor@sysoev.ru NXT_EXPORT void nxt_socketpair_close(nxt_task_t *task, nxt_socket_t *pair);
11512Sigor@sysoev.ru NXT_EXPORT ssize_t nxt_socketpair_send(nxt_fd_event_t *ev, nxt_fd_t fd,
1161008Szelenkov@nginx.com     nxt_iobuf_t *iob, nxt_uint_t niob);
11712Sigor@sysoev.ru NXT_EXPORT ssize_t nxt_socketpair_recv(nxt_fd_event_t *ev, nxt_fd_t *fd,
1181008Szelenkov@nginx.com     nxt_iobuf_t *iob, nxt_uint_t niob);
1190Sigor@sysoev.ru 
1200Sigor@sysoev.ru 
1210Sigor@sysoev.ru #define                                                                       \
12213Sigor@sysoev.ru nxt_socket_nonblocking(task, fd)                                              \
12313Sigor@sysoev.ru     nxt_fd_nonblocking(task, fd)
1240Sigor@sysoev.ru 
1250Sigor@sysoev.ru #define                                                                       \
12613Sigor@sysoev.ru nxt_socket_blocking(task, fd)                                                 \
12713Sigor@sysoev.ru     nxt_fd_blocking(task, fd)
1280Sigor@sysoev.ru 
1290Sigor@sysoev.ru 
13013Sigor@sysoev.ru #endif /* _NXT_SOCKET_H_INCLUDED_ */
131