PageRenderTime 66ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/pvpgn/src/compat/inet_aton.cpp

https://github.com/icharge/pvpgn
C++ | 188 lines | 94 code | 13 blank | 81 comment | 29 complexity | 345b395b0d61a8ce1b1b691f67a4ad8a MD5 | raw file
Possible License(s): GPL-2.0
  1. /*
  2. * ++Copyright++ 1983, 1990, 1993
  3. * -
  4. * Copyright (c) 1983, 1990, 1993
  5. * The Regents of the University of California. All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. * 3. All advertising materials mentioning features or use of this software
  16. * must display the following acknowledgement:
  17. * This product includes software developed by the University of
  18. * California, Berkeley and its contributors.
  19. * 4. Neither the name of the University nor the names of its contributors
  20. * may be used to endorse or promote products derived from this software
  21. * without specific prior written permission.
  22. *
  23. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  24. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  27. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33. * SUCH DAMAGE.
  34. * -
  35. * Portions Copyright (c) 1993 by Digital Equipment Corporation.
  36. *
  37. * Permission to use, copy, modify, and distribute this software for any
  38. * purpose with or without fee is hereby granted, provided that the above
  39. * copyright notice and this permission notice appear in all copies, and that
  40. * the name of Digital Equipment Corporation not be used in advertising or
  41. * publicity pertaining to distribution of the document or software without
  42. * specific, written prior permission.
  43. *
  44. * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
  45. * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
  46. * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
  47. * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  48. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  49. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
  50. * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  51. * SOFTWARE.
  52. * -
  53. * --Copyright--
  54. */
  55. #include "common/setup_before.h"
  56. #ifndef HAVE_INET_ATON
  57. #include <ctype.h>
  58. #ifdef HAVE_SYS_TYPES_H
  59. # include <sys/types.h>
  60. #endif
  61. #ifdef HAVE_SYS_PARAM_H
  62. # include <sys/param.h>
  63. #endif
  64. #ifdef HAVE_NETINET_IN_H
  65. # include <netinet/in.h>
  66. #endif
  67. #ifdef HAVE_ARPA_INET_H
  68. # include <arpa/inet.h>
  69. #endif
  70. #include "compat/socket.h" /* for Win32 address types, maybe there should be compat/netinet_in.h */
  71. #include "inet_aton.h"
  72. #include "common/setup_after.h"
  73. namespace pvpgn
  74. {
  75. #if defined(LIBC_SCCS) && !defined(lint)
  76. static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
  77. static char rcsid[] = "$Id: inet_aton.c,v 1.1.1.1 2002/12/27 08:45:08 dizzy Exp $";
  78. #endif /* LIBC_SCCS and not lint */
  79. /*
  80. * Check whether "cp" is a valid ASCII representation
  81. * of an Internet address and convert to a binary address.
  82. * Returns 1 if the address is valid, 0 if not.
  83. * This replaces inet_addr, the return value from which
  84. * cannot distinguish between failure and a local wildcard address.
  85. * Only handles IPv4.
  86. * Assumes 32-bit ints.
  87. */
  88. extern int inet_aton(char const * cp, struct in_addr * addr)
  89. {
  90. unsigned int val;
  91. int base, n;
  92. char c;
  93. unsigned int parts[4];
  94. unsigned int *pp = parts;
  95. c = *cp;
  96. for (;;) {
  97. /*
  98. * Collect number up to ``.''.
  99. * Values are specified as for C:
  100. * 0x=hex, 0=octal, isdigit=decimal.
  101. */
  102. if (!isdigit((int)c))
  103. return (0);
  104. val = 0; base = 10;
  105. if (c == '0') {
  106. c = *++cp;
  107. if (c == 'x' || c == 'X')
  108. base = 16, c = *++cp;
  109. else
  110. base = 8;
  111. }
  112. for (;;) {
  113. if (isascii((int)c) && isdigit((int)c)) {
  114. val = (val * base) + (c - '0');
  115. c = *++cp;
  116. } else if (base == 16 && isascii((int)c) && isxdigit((int)c)) {
  117. val = (val << 4) |
  118. (c + 10 - (islower((int)c) ? 'a' : 'A'));
  119. c = *++cp;
  120. } else
  121. break;
  122. }
  123. if (c == '.') {
  124. /*
  125. * Internet format:
  126. * a.b.c.d
  127. * a.b.c (with c treated as 16 bits)
  128. * a.b (with b treated as 24 bits)
  129. */
  130. if (pp >= parts + 3)
  131. return (0);
  132. *pp++ = val;
  133. c = *++cp;
  134. } else
  135. break;
  136. }
  137. /*
  138. * Check for trailing characters.
  139. */
  140. if (c != '\0' && (!isascii((int)c) || !isspace((int)c)))
  141. return (0);
  142. /*
  143. * Concoct the address according to
  144. * the number of parts specified.
  145. */
  146. n = pp - parts + 1;
  147. switch (n) {
  148. case 0:
  149. return (0); /* initial nondigit */
  150. case 1: /* a -- 32 bits */
  151. break;
  152. case 2: /* a.b -- 8.24 bits */
  153. if (val > 0xffffff)
  154. return (0);
  155. val |= parts[0] << 24;
  156. break;
  157. case 3: /* a.b.c -- 8.8.16 bits */
  158. if (val > 0xffff)
  159. return (0);
  160. val |= (parts[0] << 24) | (parts[1] << 16);
  161. break;
  162. case 4: /* a.b.c.d -- 8.8.8.8 bits */
  163. if (val > 0xff)
  164. return (0);
  165. val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  166. break;
  167. }
  168. if (addr)
  169. addr->s_addr = htonl(val);
  170. return (1);
  171. }
  172. }
  173. #else
  174. typedef int filenotempty; /* make ISO standard happy */
  175. #endif