inet_aton.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:4k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /* $Id: inet_aton.c,v 1.16 1999/02/07 22:07:02 tgl Exp $
  2.  *
  3.  * This inet_aton() function was taken from the GNU C library and
  4.  * incorporated into Postgres for those systems which do not have this
  5.  * routine in their standard C libraries.
  6.  *
  7.  * The function was been extracted whole from the file inet_aton.c in
  8.  * Release 5.3.12 of the Linux C library, which is derived from the
  9.  * GNU C library, by Bryan Henderson in October 1996. The copyright
  10.  * notice from that file is below.
  11.  */
  12. /*
  13.  * Copyright (c) 1983, 1990, 1993
  14.  * The Regents of the University of California.  All rights reserved.
  15.  *
  16.  * Redistribution and use in source and binary forms, with or without
  17.  * modification, are permitted provided that the following conditions
  18.  * are met:
  19.  * 1. Redistributions of source code must retain the above copyright
  20.  *   notice, this list of conditions and the following disclaimer.
  21.  * 2. Redistributions in binary form must reproduce the above copyright
  22.  *   notice, this list of conditions and the following disclaimer in the
  23.  *   documentation and/or other materials provided with the distribution.
  24.  * 3. All advertising materials mentioning features or use of this software
  25.  *   must display the following acknowledgement:
  26.  * This product includes software developed by the University of
  27.  * California, Berkeley and its contributors.
  28.  * 4. Neither the name of the University nor the names of its contributors
  29.  *   may be used to endorse or promote products derived from this software
  30.  *   without specific prior written permission.
  31.  *
  32.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  33.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  34.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  35.  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  36.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  37.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  38.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  39.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  40.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  41.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  42.  * SUCH DAMAGE.  */
  43. #include "config.h"
  44. #include <sys/types.h>
  45. #include <netinet/in.h>
  46. #include <ctype.h>
  47. /*
  48.  * Check whether "cp" is a valid ascii representation
  49.  * of an Internet address and convert to a binary address.
  50.  * Returns 1 if the address is valid, 0 if not.
  51.  * This replaces inet_addr, the return value from which
  52.  * cannot distinguish between failure and a local broadcast address.
  53.  */
  54. int
  55. inet_aton(const char *cp, struct in_addr * addr)
  56. {
  57. unsigned int val;
  58. int base,
  59. n;
  60. char c;
  61. u_int parts[4];
  62. u_int    *pp = parts;
  63. for (;;)
  64. {
  65. /*
  66.  * Collect number up to ``.''. Values are specified as for C:
  67.  * 0x=hex, 0=octal, other=decimal.
  68.  */
  69. val = 0;
  70. base = 10;
  71. if (*cp == '0')
  72. {
  73. if (*++cp == 'x' || *cp == 'X')
  74. base = 16, cp++;
  75. else
  76. base = 8;
  77. }
  78. while ((c = *cp) != '')
  79. {
  80. if (isascii(c) && isdigit(c))
  81. {
  82. val = (val * base) + (c - '0');
  83. cp++;
  84. continue;
  85. }
  86. if (base == 16 && isascii(c) && isxdigit(c))
  87. {
  88. val = (val << 4) +
  89. (c + 10 - (islower(c) ? 'a' : 'A'));
  90. cp++;
  91. continue;
  92. }
  93. break;
  94. }
  95. if (*cp == '.')
  96. {
  97. /*
  98.  * Internet format: a.b.c.d a.b.c (with c treated as
  99.  * 16-bits) a.b (with b treated as 24 bits)
  100.  */
  101. if (pp >= parts + 3 || val > 0xff)
  102. return 0;
  103. *pp++ = val, cp++;
  104. }
  105. else
  106. break;
  107. }
  108. /*
  109.  * Check for trailing characters.
  110.  */
  111. if (*cp && (!isascii(*cp) || !isspace(*cp)))
  112. return 0;
  113. /*
  114.  * Concoct the address according to the number of parts specified.
  115.  */
  116. n = pp - parts + 1;
  117. switch (n)
  118. {
  119. case 1: /* a -- 32 bits */
  120. break;
  121. case 2: /* a.b -- 8.24 bits */
  122. if (val > 0xffffff)
  123. return 0;
  124. val |= parts[0] << 24;
  125. break;
  126. case 3: /* a.b.c -- 8.8.16 bits */
  127. if (val > 0xffff)
  128. return 0;
  129. val |= (parts[0] << 24) | (parts[1] << 16);
  130. break;
  131. case 4: /* a.b.c.d -- 8.8.8.8 bits */
  132. if (val > 0xff)
  133. return 0;
  134. val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  135. break;
  136. }
  137. if (addr)
  138. addr->s_addr = htonl(val);
  139. return 1;
  140. }