Print this page
inet_pton

*** 21,32 **** */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ ! ! #pragma ident "%Z%%M% %I% %E% SMI" #include <sys/types.h> #include <sys/cmn_err.h> #include <sys/systm.h> #include <sys/socket.h> --- 21,33 ---- */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ ! /* ! * Copyright 2012 Nexenta Systems, Inc. All rights reserved. ! */ #include <sys/types.h> #include <sys/cmn_err.h> #include <sys/systm.h> #include <sys/socket.h>
*** 231,259 **** str2inet_addr(char *cp, ipaddr_t *addrp) { char *end; long byte; int i; ! ipaddr_t addr = 0; for (i = 0; i < 4; i++) { if (ddi_strtol(cp, &end, 10, &byte) != 0 || byte < 0 || byte > 255) { return (0); } ! addr = (addr << 8) | (uint8_t)byte; if (i < 3) { if (*end != '.') { return (0); } else { cp = end + 1; } } else { cp = end; } } ! *addrp = addr; return (1); } /* * inet_pton: This function takes string format IPv4 or IPv6 address and --- 232,262 ---- str2inet_addr(char *cp, ipaddr_t *addrp) { char *end; long byte; int i; ! uint8_t *addr = (uint8_t *)addrp; ! ! *addrp = 0; for (i = 0; i < 4; i++) { if (ddi_strtol(cp, &end, 10, &byte) != 0 || byte < 0 || byte > 255) { return (0); } ! addr[i] = (uint8_t)byte; if (i < 3) { if (*end != '.') { return (0); } else { cp = end + 1; } } else { cp = end; } } ! return (1); } /* * inet_pton: This function takes string format IPv4 or IPv6 address and
*** 262,280 **** * It returns 0 for invalid IPv4 and IPv6 address * 1 when successfully converts ascii to binary * -1 when af is not AF_INET or AF_INET6 */ int ! inet_pton(int af, char *inp, void *outp) { int i; long byte; char *end; switch (af) { case AF_INET: ! return (str2inet_addr(inp, (ipaddr_t *)outp)); case AF_INET6: { union v6buf_u { uint16_t v6words_u[8]; in6_addr_t v6addr_u; } v6buf, *v6outp; --- 265,289 ---- * It returns 0 for invalid IPv4 and IPv6 address * 1 when successfully converts ascii to binary * -1 when af is not AF_INET or AF_INET6 */ int ! m_inet_pton(int af, char *inp, void *outp, int revert) { int i; long byte; char *end; switch (af) { case AF_INET: ! if (str2inet_addr(inp, (ipaddr_t *)outp)) { ! if (! revert) ! *(uint32_t *)outp = ntohl(*(uint32_t *)outp); ! return (1); ! } else { ! return (0); ! } case AF_INET6: { union v6buf_u { uint16_t v6words_u[8]; in6_addr_t v6addr_u; } v6buf, *v6outp;
*** 314,324 **** --- 323,337 ---- byte = 0; } if (byte < 0 || byte > 0x0ffff) { return (0); } + if (revert) { + v6buf.v6words_u[i] = htons((uint16_t)byte); + } else { v6buf.v6words_u[i] = (uint16_t)byte; + } if (*end == NULL || i == 7) { inp = end; break; } if (inp == end) { /* not a number must be */
*** 386,390 **** --- 399,424 ---- return (1); /* Success */ } } /* switch */ return (-1); /* return -1 for default case */ } + + + int + _inet_pton(int af, char *inp, void *outp) + { + return (m_inet_pton(af, inp, outp, 1)); + } + + /* + * We need this inet_pton to preserve compatibility with old closed binaries. + * Earlier, inet_pton returned address in hardware native order, + * not in network one. (See http://www.illumos.org/issue/3105). + * Having fixed that, we still need to support binaries, that use bad inet_pton + * and reverse returned address manually. All new inet_pton calls will be + * redirected to _inet_pton with #define in the header file. + */ + int + inet_pton(int af, char *inp, void *outp) + { + return (m_inet_pton(af, inp, outp, 0)); + }