summaryrefslogblamecommitdiffhomepage
path: root/src/nxt_sockaddr.h
blob: 382e8fcb728a8cf9f913438599c876fb3ea3250d (plain) (tree)






































































































































































                                                                                

/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) NGINX, Inc.
 */

#ifndef _NXT_SOCKADDR_H_INCLUDED_
#define _NXT_SOCKADDR_H_INCLUDED_


/*
 * The nxt_sockaddr_t should be allocated using nxt_sockaddr_alloc()
 * with actual "struct sockaddr_..." size:
 *    nxt_sockaddr_alloc(pool, sizeof(struct sockaddr_in))
 */

struct nxt_sockaddr_s {
    /*
     * A sockaddr textual representation is optional and may be in two forms:
     * with port or without port.  If a nxt_sockaddr_t is intended to listen(),
     * bind() or connect() then the textual representation must be present and
     * must include the port.  nxt_event_conn_accept() creates a textual
     * representation without the port.
     */
    u_char                        *text;

    /*
     * text_len, socket type and socklen are stored
     * together on 64-bit platforms without sockaddr.sa_len.
     */
    uint16_t                      text_len;
    uint16_t                      type;
#if !(NXT_SOCKADDR_SA_LEN)
    socklen_t                     _socklen;
#endif

    union {
        struct sockaddr           sockaddr;
        struct sockaddr_in        sockaddr_in;
#if (NXT_INET6)
        struct sockaddr_in6       sockaddr_in6;
#endif
#if (NXT_HAVE_UNIX_DOMAIN)
        struct sockaddr_un        sockaddr_un;
#endif
    } u;
};


typedef struct {
    nxt_job_resolve_t             resolve;
    nxt_str_t                     addr;

    uint8_t                       wildcard;   /* 1 bit */
    uint8_t                       no_port;    /* 1 bit */
} nxt_job_sockaddr_parse_t;


NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_alloc(nxt_mem_pool_t *mp, socklen_t len)
    NXT_MALLOC_LIKE;
NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_create(nxt_mem_pool_t *mp,
    struct sockaddr *sockaddr, socklen_t len)
    NXT_MALLOC_LIKE;
NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_copy(nxt_mem_pool_t *mp,
    nxt_sockaddr_t *src)
    NXT_MALLOC_LIKE;
NXT_EXPORT nxt_sockaddr_t *nxt_getsockname(nxt_mem_pool_t *mp, nxt_socket_t s)
    NXT_MALLOC_LIKE;
NXT_EXPORT nxt_int_t nxt_sockaddr_text(nxt_mem_pool_t *mp, nxt_sockaddr_t *sa,
    nxt_bool_t port);


#if (NXT_SOCKADDR_SA_LEN)

#define                                                                       \
nxt_socklen_set(sa, len)                                                      \
    (sa)->u.sockaddr.sa_len = (socklen_t) (len)


#define                                                                       \
nxt_socklen(sa)                                                               \
    ((sa)->u.sockaddr.sa_len)

#else

#define                                                                       \
nxt_socklen_set(sa, len)                                                      \
    (sa)->_socklen = (socklen_t) (len)


#define                                                                       \
nxt_socklen(sa)                                                               \
    ((sa)->_socklen)

#endif


NXT_EXPORT uint32_t nxt_sockaddr_port(nxt_sockaddr_t *sa);
NXT_EXPORT nxt_bool_t nxt_sockaddr_cmp(nxt_sockaddr_t *sa1,
    nxt_sockaddr_t *sa2);
NXT_EXPORT size_t nxt_sockaddr_ntop(nxt_sockaddr_t *sa, u_char *buf,
    u_char *end,
    nxt_bool_t port);
NXT_EXPORT void nxt_job_sockaddr_parse(nxt_job_sockaddr_parse_t *jbs);
NXT_EXPORT in_addr_t nxt_inet_addr(u_char *buf, size_t len);
#if (NXT_INET6)
NXT_EXPORT nxt_int_t nxt_inet6_addr(struct in6_addr *in6_addr, u_char *buf,
    size_t len);
#endif

#if (NXT_HAVE_UNIX_DOMAIN)
#define nxt_unix_addr_path_len(sa)                                            \
    (nxt_socklen(sa) - offsetof(struct sockaddr_un, sun_path))
#endif


#define NXT_INET_ADDR_STR_LEN     (sizeof("255.255.255.255") - 1)

#define NXT_INET6_ADDR_STR_LEN                                                \
    (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1)

#define NXT_UNIX_ADDR_STR_LEN                                                 \
    ((sizeof("unix:") - 1)                                                    \
     + (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path)))


#if (NXT_HAVE_UNIX_DOMAIN)
#define NXT_SOCKADDR_STR_LEN      NXT_UNIX_ADDR_STR_LEN

#elif (NXT_INET6)
#define NXT_SOCKADDR_STR_LEN      NXT_INET6_ADDR_STR_LEN

#else
#define NXT_SOCKADDR_STR_LEN      NXT_INET_ADDR_STR_LEN
#endif


#if (NXT_INET6)
#define NXT_SOCKPORT_STR_LEN      (sizeof("[]:65535") - 1)

#else
#define NXT_SOCKPORT_STR_LEN      (sizeof(":65535") - 1)
#endif


nxt_inline size_t
nxt_sockaddr_text_len(nxt_sockaddr_t *sa)
{
    switch (sa->u.sockaddr.sa_family) {

#if (NXT_INET6)
    case AF_INET6:
        return NXT_INET6_ADDR_STR_LEN;
#endif

#if (NXT_HAVE_UNIX_DOMAIN)
    case AF_UNIX:
        return NXT_UNIX_ADDR_STR_LEN;
#endif

    default:
        return NXT_INET_ADDR_STR_LEN;
    }
}


#endif /* _NXT_SOCKADDR_H_INCLUDED_ */