Back to index

python3.2  3.2.2
Classes | Defines | Functions | Variables
getnameinfo.c File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  gni_afd
struct  gni_sockinet

Defines

#define SUCCESS   0
#define YES   1
#define NO   0
#define ENI_NOSOCKET   0
#define ENI_NOSERVNAME   1
#define ENI_NOHOSTNAME   2
#define ENI_MEMORY   3
#define ENI_SYSTEM   4
#define ENI_FAMILY   5
#define ENI_SALEN   6

Functions

int getnameinfo (const struct sockaddr *, size_t, char *, size_t, char *, size_t, int)
int getnameinfo (struct sockaddr *sa, size_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags) const

Variables

static struct gni_afd gni_afdl []

Class Documentation

struct gni_afd

Definition at line 55 of file getnameinfo.c.

Class Members
int a_addrlen
int a_af
int a_off
int a_socklen
struct gni_sockinet

Definition at line 70 of file getnameinfo.c.

Class Members
u_char si_family
u_char si_len
u_short si_port

Define Documentation

#define ENI_FAMILY   5

Definition at line 81 of file getnameinfo.c.

#define ENI_MEMORY   3

Definition at line 79 of file getnameinfo.c.

#define ENI_NOHOSTNAME   2

Definition at line 78 of file getnameinfo.c.

#define ENI_NOSERVNAME   1

Definition at line 77 of file getnameinfo.c.

#define ENI_NOSOCKET   0

Definition at line 76 of file getnameinfo.c.

#define ENI_SALEN   6

Definition at line 82 of file getnameinfo.c.

#define ENI_SYSTEM   4

Definition at line 80 of file getnameinfo.c.

#define NO   0

Definition at line 53 of file getnameinfo.c.

#define SUCCESS   0

Definition at line 51 of file getnameinfo.c.

#define YES   1

Definition at line 52 of file getnameinfo.c.


Function Documentation

int getnameinfo ( const struct sockaddr *  ,
size_t  ,
char *  ,
size_t  ,
char *  ,
size_t  ,
int   
)
int getnameinfo ( struct sockaddr *  sa,
size_t  salen,
char *  host,
size_t  hostlen,
char *  serv,
size_t  servlen,
int  flags 
) const

Definition at line 89 of file getnameinfo.c.

{
    struct gni_afd *gni_afd;
    struct servent *sp;
    struct hostent *hp;
    u_short port;
    int family, len, i;
    char *addr, *p;
    u_long v4a;
#ifdef ENABLE_IPV6
    u_char pfx;
#endif
    int h_error;
    char numserv[512];
    char numaddr[512];

    if (sa == NULL)
        return ENI_NOSOCKET;

#ifdef HAVE_SOCKADDR_SA_LEN
    len = sa->sa_len;
    if (len != salen) return ENI_SALEN;
#else
    len = salen;
#endif

    family = sa->sa_family;
    for (i = 0; gni_afdl[i].a_af; i++)
        if (gni_afdl[i].a_af == family) {
            gni_afd = &gni_afdl[i];
            goto found;
        }
    return ENI_FAMILY;

 found:
    if (len != gni_afd->a_socklen) return ENI_SALEN;

    port = ((struct gni_sockinet *)sa)->si_port; /* network byte order */
    addr = (char *)sa + gni_afd->a_off;

    if (serv == NULL || servlen == 0) {
        /* what we should do? */
    } else if (flags & NI_NUMERICSERV) {
        sprintf(numserv, "%d", ntohs(port));
        if (strlen(numserv) > servlen)
            return ENI_MEMORY;
        strcpy(serv, numserv);
    } else {
        sp = getservbyport(port, (flags & NI_DGRAM) ? "udp" : "tcp");
        if (sp) {
            if (strlen(sp->s_name) > servlen)
                return ENI_MEMORY;
            strcpy(serv, sp->s_name);
        } else
            return ENI_NOSERVNAME;
    }

    switch (sa->sa_family) {
    case AF_INET:
        v4a = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
        if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
            flags |= NI_NUMERICHOST;
        v4a >>= IN_CLASSA_NSHIFT;
        if (v4a == 0 || v4a == IN_LOOPBACKNET)
            flags |= NI_NUMERICHOST;
        break;
#ifdef ENABLE_IPV6
    case AF_INET6:
        pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr8[0];
        if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
            flags |= NI_NUMERICHOST;
        break;
#endif
    }
    if (host == NULL || hostlen == 0) {
        /* what should we do? */
    } else if (flags & NI_NUMERICHOST) {
        if (inet_ntop(gni_afd->a_af, addr, numaddr, sizeof(numaddr))
            == NULL)
            return ENI_SYSTEM;
        if (strlen(numaddr) > hostlen)
            return ENI_MEMORY;
        strcpy(host, numaddr);
    } else {
#ifdef ENABLE_IPV6
        hp = getipnodebyaddr(addr, gni_afd->a_addrlen, gni_afd->a_af, &h_error);
#else
        hp = gethostbyaddr(addr, gni_afd->a_addrlen, gni_afd->a_af);
        h_error = h_errno;
#endif

        if (hp) {
            if (flags & NI_NOFQDN) {
                p = strchr(hp->h_name, '.');
                if (p) *p = '\0';
            }
            if (strlen(hp->h_name) > hostlen) {
#ifdef ENABLE_IPV6
                freehostent(hp);
#endif
                return ENI_MEMORY;
            }
            strcpy(host, hp->h_name);
#ifdef ENABLE_IPV6
            freehostent(hp);
#endif
        } else {
            if (flags & NI_NAMEREQD)
                return ENI_NOHOSTNAME;
            if (inet_ntop(gni_afd->a_af, addr, numaddr, sizeof(numaddr))
                == NULL)
                return ENI_NOHOSTNAME;
            if (strlen(numaddr) > hostlen)
                return ENI_MEMORY;
            strcpy(host, numaddr);
        }
    }
    return SUCCESS;
}

Here is the call graph for this function:


Variable Documentation

struct gni_afd gni_afdl[] [static]