Annotation of embedaddon/ntp/libntp/decodenetnum.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * decodenetnum - return a net number (this is crude, but careful)
        !             3:  */
        !             4: #include <config.h>
        !             5: #include <sys/types.h>
        !             6: #include <ctype.h>
        !             7: #ifdef HAVE_SYS_SOCKET_H
        !             8: #include <sys/socket.h>
        !             9: #endif
        !            10: #ifdef HAVE_NETINET_IN_H
        !            11: #include <netinet/in.h>
        !            12: #endif
        !            13: 
        !            14: #include "ntp.h"
        !            15: #include "ntp_stdlib.h"
        !            16: #include "ntp_assert.h"
        !            17: 
        !            18: /*
        !            19:  * decodenetnum                convert text IP address and port to sockaddr_u
        !            20:  *
        !            21:  * Returns 0 for failure, 1 for success.
        !            22:  */
        !            23: int
        !            24: decodenetnum(
        !            25:        const char *num,
        !            26:        sockaddr_u *netnum
        !            27:        )
        !            28: {
        !            29:        struct addrinfo hints, *ai = NULL;
        !            30:        int err;
        !            31:        u_short port;
        !            32:        const char *cp;
        !            33:        const char *port_str;
        !            34:        char *pp;
        !            35:        char *np;
        !            36:        char name[80];
        !            37: 
        !            38:        NTP_REQUIRE(num != NULL);
        !            39:        NTP_REQUIRE(strlen(num) < sizeof(name));
        !            40: 
        !            41:        port_str = NULL;
        !            42:        if ('[' != num[0]) {
        !            43:                /*
        !            44:                 * to distinguish IPv6 embedded colons from a port
        !            45:                 * specification on an IPv4 address, assume all 
        !            46:                 * legal IPv6 addresses have at least two colons.
        !            47:                 */
        !            48:                pp = strchr(num, ':');
        !            49:                if (NULL == pp)
        !            50:                        cp = num;       /* no colons */
        !            51:                else if (NULL != strchr(pp + 1, ':'))
        !            52:                        cp = num;       /* two or more colons */
        !            53:                else {                  /* one colon */
        !            54:                        strncpy(name, num, sizeof(name));
        !            55:                        name[sizeof(name) - 1] = '\0';
        !            56:                        cp = name;
        !            57:                        pp = strchr(cp, ':');
        !            58:                        *pp = '\0';
        !            59:                        port_str = pp + 1;
        !            60:                }
        !            61:        } else {
        !            62:                cp = num + 1;
        !            63:                np = name; 
        !            64:                while (*cp && ']' != *cp)
        !            65:                        *np++ = *cp++;
        !            66:                *np = 0;
        !            67:                if (']' == cp[0] && ':' == cp[1] && '\0' != cp[2])
        !            68:                        port_str = &cp[2];
        !            69:                cp = name; 
        !            70:        }
        !            71:        ZERO(hints);
        !            72:        hints.ai_flags = Z_AI_NUMERICHOST;
        !            73:        err = getaddrinfo(cp, "ntp", &hints, &ai);
        !            74:        if (err != 0)
        !            75:                return 0;
        !            76:        NTP_INSIST(ai->ai_addrlen <= sizeof(*netnum));
        !            77:        memcpy(netnum, ai->ai_addr, ai->ai_addrlen);
        !            78:        freeaddrinfo(ai);
        !            79:        if (NULL == port_str || 1 != sscanf(port_str, "%hu", &port))
        !            80:                port = NTP_PORT;
        !            81:        SET_PORT(netnum, port);
        !            82:        return 1;
        !            83: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>