/contrib/bind9/lib/lwres/lwinetaton.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 205 lines · 87 code · 15 blank · 103 comment · 40 complexity · 84e27ee715e09beaeaaef7a4022ab224 MD5 · raw file

  1. /*
  2. * Portions Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
  3. * Portions Copyright (C) 1996-2001, 2003 Internet Software Consortium.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  10. * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  11. * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  12. * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  13. * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  14. * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  15. * PERFORMANCE OF THIS SOFTWARE.
  16. */
  17. /*
  18. * Copyright (c) 1983, 1990, 1993
  19. * The Regents of the University of California. All rights reserved.
  20. *
  21. * Redistribution and use in source and binary forms, with or without
  22. * modification, are permitted provided that the following conditions
  23. * are met:
  24. * 1. Redistributions of source code must retain the above copyright
  25. * notice, this list of conditions and the following disclaimer.
  26. * 2. Redistributions in binary form must reproduce the above copyright
  27. * notice, this list of conditions and the following disclaimer in the
  28. * documentation and/or other materials provided with the distribution.
  29. * 3. All advertising materials mentioning features or use of this software
  30. * must display the following acknowledgement:
  31. * This product includes software developed by the University of
  32. * California, Berkeley and its contributors.
  33. * 4. Neither the name of the University nor the names of its contributors
  34. * may be used to endorse or promote products derived from this software
  35. * without specific prior written permission.
  36. *
  37. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  38. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  39. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  40. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  41. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  42. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  43. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  44. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  45. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  46. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  47. * SUCH DAMAGE.
  48. */
  49. /*
  50. * Portions Copyright (c) 1993 by Digital Equipment Corporation.
  51. *
  52. * Permission to use, copy, modify, and distribute this software for any
  53. * purpose with or without fee is hereby granted, provided that the above
  54. * copyright notice and this permission notice appear in all copies, and that
  55. * the name of Digital Equipment Corporation not be used in advertising or
  56. * publicity pertaining to distribution of the document or software without
  57. * specific, written prior permission.
  58. *
  59. * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
  60. * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
  61. * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
  62. * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  63. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  64. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
  65. * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  66. * SOFTWARE.
  67. */
  68. /*! \file lwinetaton.c
  69. */
  70. #if defined(LIBC_SCCS) && !defined(lint)
  71. static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
  72. static char rcsid[] = "$Id: lwinetaton.c,v 1.16 2007/06/19 23:47:22 tbox Exp $";
  73. #endif /* LIBC_SCCS and not lint */
  74. #include <config.h>
  75. #include <ctype.h>
  76. #include <stddef.h>
  77. #include <lwres/int.h>
  78. #include <lwres/net.h>
  79. #include "assert_p.h"
  80. /*!
  81. * Check whether "cp" is a valid ascii representation
  82. * of an Internet address and convert to a binary address.
  83. * Returns 1 if the address is valid, 0 if not.
  84. * This replaces inet_addr, the return value from which
  85. * cannot distinguish between failure and a local broadcast address.
  86. */
  87. int
  88. lwres_net_aton(const char *cp, struct in_addr *addr) {
  89. unsigned long val;
  90. int base, n;
  91. unsigned char c;
  92. lwres_uint8_t parts[4];
  93. lwres_uint8_t *pp = parts;
  94. int digit;
  95. REQUIRE(cp != NULL);
  96. c = *cp;
  97. for (;;) {
  98. /*
  99. * Collect number up to ``.''.
  100. * Values are specified as for C:
  101. * 0x=hex, 0=octal, isdigit=decimal.
  102. */
  103. if (!isdigit(c & 0xff))
  104. return (0);
  105. val = 0;
  106. base = 10;
  107. digit = 0;
  108. if (c == '0') {
  109. c = *++cp;
  110. if (c == 'x' || c == 'X') {
  111. base = 16;
  112. c = *++cp;
  113. } else {
  114. base = 8;
  115. digit = 1;
  116. }
  117. }
  118. for (;;) {
  119. /*
  120. * isascii() is valid for all integer values, and
  121. * when it is true, c is known to be in scope
  122. * for isdigit(). No cast necessary. Similar
  123. * comment applies for later ctype uses.
  124. */
  125. if (isascii(c) && isdigit(c)) {
  126. if (base == 8 && (c == '8' || c == '9'))
  127. return (0);
  128. val = (val * base) + (c - '0');
  129. c = *++cp;
  130. digit = 1;
  131. } else if (base == 16 && isascii(c) && isxdigit(c)) {
  132. val = (val << 4) |
  133. (c + 10 - (islower(c) ? 'a' : 'A'));
  134. c = *++cp;
  135. digit = 1;
  136. } else
  137. break;
  138. }
  139. if (c == '.') {
  140. /*
  141. * Internet format:
  142. * a.b.c.d
  143. * a.b.c (with c treated as 16 bits)
  144. * a.b (with b treated as 24 bits)
  145. */
  146. if (pp >= parts + 3 || val > 0xffU)
  147. return (0);
  148. *pp++ = (lwres_uint8_t)val;
  149. c = *++cp;
  150. } else
  151. break;
  152. }
  153. /*
  154. * Check for trailing characters.
  155. */
  156. if (c != '\0' && (!isascii(c) || !isspace(c)))
  157. return (0);
  158. /*
  159. * Did we get a valid digit?
  160. */
  161. if (!digit)
  162. return (0);
  163. /*
  164. * Concoct the address according to
  165. * the number of parts specified.
  166. */
  167. n = pp - parts + 1;
  168. switch (n) {
  169. case 1: /* a -- 32 bits */
  170. break;
  171. case 2: /* a.b -- 8.24 bits */
  172. if (val > 0xffffffU)
  173. return (0);
  174. val |= parts[0] << 24;
  175. break;
  176. case 3: /* a.b.c -- 8.8.16 bits */
  177. if (val > 0xffffU)
  178. return (0);
  179. val |= (parts[0] << 24) | (parts[1] << 16);
  180. break;
  181. case 4: /* a.b.c.d -- 8.8.8.8 bits */
  182. if (val > 0xffU)
  183. return (0);
  184. val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  185. break;
  186. }
  187. if (addr != NULL)
  188. addr->s_addr = htonl(val);
  189. return (1);
  190. }