Header And Logo

PostgreSQL
| The world's most advanced open source database.

Functions

inet_aton.c File Reference

#include "c.h"
#include <netinet/in.h>
#include <ctype.h>
Include dependency graph for inet_aton.c:

Go to the source code of this file.

Functions

int inet_aton (const char *cp, struct in_addr *addr)

Function Documentation

int inet_aton ( const char *  cp,
struct in_addr *  addr 
)

Definition at line 54 of file inet_aton.c.

References val.

Referenced by getaddrinfo().

{
    unsigned int val;
    int         base,
                n;
    char        c;
    u_int       parts[4];
    u_int      *pp = parts;

    for (;;)
    {
        /*
         * Collect number up to ``.''. Values are specified as for C: 0x=hex,
         * 0=octal, other=decimal.
         */
        val = 0;
        base = 10;
        if (*cp == '0')
        {
            if (*++cp == 'x' || *cp == 'X')
                base = 16, cp++;
            else
                base = 8;
        }
        while ((c = *cp) != '\0')
        {
            if (isdigit((unsigned char) c))
            {
                val = (val * base) + (c - '0');
                cp++;
                continue;
            }
            if (base == 16 && isxdigit((unsigned char) c))
            {
                val = (val << 4) +
                    (c + 10 - (islower((unsigned char) c) ? 'a' : 'A'));
                cp++;
                continue;
            }
            break;
        }
        if (*cp == '.')
        {
            /*
             * Internet format: a.b.c.d a.b.c   (with c treated as 16-bits)
             * a.b     (with b treated as 24 bits)
             */
            if (pp >= parts + 3 || val > 0xff)
                return 0;
            *pp++ = val, cp++;
        }
        else
            break;
    }

    /*
     * Check for trailing junk.
     */
    while (*cp)
        if (!isspace((unsigned char) *cp++))
            return 0;

    /*
     * Concoct the address according to the number of parts specified.
     */
    n = pp - parts + 1;
    switch (n)
    {

        case 1:         /* a -- 32 bits */
            break;

        case 2:         /* a.b -- 8.24 bits */
            if (val > 0xffffff)
                return 0;
            val |= parts[0] << 24;
            break;

        case 3:         /* a.b.c -- 8.8.16 bits */
            if (val > 0xffff)
                return 0;
            val |= (parts[0] << 24) | (parts[1] << 16);
            break;

        case 4:         /* a.b.c.d -- 8.8.8.8 bits */
            if (val > 0xff)
                return 0;
            val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
            break;
    }
    if (addr)
        addr->s_addr = htonl(val);
    return 1;
}