(linenum→info "unix/slp.c:2238")

glibc/2.7/resolv/inet_addr.c

    1: /*
    2:  * Copyright (c) 1983, 1990, 1993
    3:  *    The Regents of the University of California.  All rights reserved.
    4:  *
    5:  * Redistribution and use in source and binary forms, with or without
    6:  * modification, are permitted provided that the following conditions
    7:  * are met:
    8:  * 1. Redistributions of source code must retain the above copyright
    9:  *    notice, this list of conditions and the following disclaimer.
   10:  * 2. Redistributions in binary form must reproduce the above copyright
   11:  *    notice, this list of conditions and the following disclaimer in the
   12:  *    documentation and/or other materials provided with the distribution.
   13:  * 4. Neither the name of the University nor the names of its contributors
   14:  *    may be used to endorse or promote products derived from this software
   15:  *    without specific prior written permission.
   16:  *
   17:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   18:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   19:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   20:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   21:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   22:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   23:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   25:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27:  * SUCH DAMAGE.
   28:  */
   29: 
   30: /*
   31:  * Portions Copyright (c) 1993 by Digital Equipment Corporation.
   32:  *
   33:  * Permission to use, copy, modify, and distribute this software for any
   34:  * purpose with or without fee is hereby granted, provided that the above
   35:  * copyright notice and this permission notice appear in all copies, and that
   36:  * the name of Digital Equipment Corporation not be used in advertising or
   37:  * publicity pertaining to distribution of the document or software without
   38:  * specific, written prior permission.
   39:  *
   40:  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
   41:  * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
   42:  * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
   43:  * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
   44:  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
   45:  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
   46:  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
   47:  * SOFTWARE.
   48:  */
   49: 
   50: /*
   51:  * Portions Copyright (c) 1996-1999 by Internet Software Consortium.
   52:  *
   53:  * Permission to use, copy, modify, and distribute this software for any
   54:  * purpose with or without fee is hereby granted, provided that the above
   55:  * copyright notice and this permission notice appear in all copies.
   56:  *
   57:  * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
   58:  * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
   59:  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
   60:  * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
   61:  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
   62:  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
   63:  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
   64:  * SOFTWARE.
   65:  */
   66: 
   67: #if defined(LIBC_SCCS) && !defined(lint)
   68: static const char sccsid[] = "@(#)inet_addr.c   8.1 (Berkeley) 6/17/93";
   69: static const char rcsid[] = "$BINDId: inet_addr.c,v 8.11 1999/10/13 16:39:25 vixie Exp $";
   70: #endif /* LIBC_SCCS and not lint */
   71: 
   72: #include <sys/types.h>
   73: #include <sys/param.h>
   74: 
   75: #include <netinet/in.h>
   76: #include <arpa/inet.h>
   77: 
   78: #include <ctype.h>
   79: 
   80: #ifdef _LIBC
   81: # include <endian.h>
   82: # include <stdint.h>
   83: # include <stdlib.h>
   84: # include <limits.h>
   85: # include <errno.h>
   86: #endif
   87: 
   88: /*
   89:  * Ascii internet address interpretation routine.
   90:  * The value returned is in network order.
   91:  */
   92: in_addr_t
   93: inet_addr(const char *cp) {
   94:         struct in_addr val;
   95: 
   96:         if (__inet_aton(cp, &val))
   97:                 return (val.s_addr);
   98:         return (INADDR_NONE);
   99: }
  100: 
  101: /*
  102:  * Check whether "cp" is a valid ascii representation
  103:  * of an Internet address and convert to a binary address.
  104:  * Returns 1 if the address is valid, 0 if not.
  105:  * This replaces inet_addr, the return value from which
  106:  * cannot distinguish between failure and a local broadcast address.
  107:  */
  108: int
  109: __inet_aton(const char *cp, struct in_addr *addr)
  110: {
  111:         static const in_addr_t max[4] = { 0xffffffff, 0xffffff, 0xffff, 0xff };
  112:         in_addr_t val;
  113: #ifndef _LIBC
  114:         int base;
  115: #endif
  116:         char c;
  117:         union iaddr {
  118:           uint8_t bytes[4];
  119:           uint32_t word;
  120:         } res;
  121:         uint8_t *pp = res.bytes;
  122:         int digit;
  123: 
  124: #ifdef _LIBC
  125:         int saved_errno = errno;
  126:         __set_errno (0);
  127: #endif
  128: 
  129:         res.word = 0;
  130: 
  131:         c = *cp;
  132:         for (;;) {
  133:                 /*
  134:                  * Collect number up to ``.''.
  135:                  * Values are specified as for C:
  136:                  * 0x=hex, 0=octal, isdigit=decimal.
  137:                  */
  138:                 if (!isdigit(c))
  139:                         goto ret_0;
  140: #ifdef _LIBC
  141:                 {
  142:                         char *endp;
  143:                         unsigned long ul = strtoul (cp, (char **) &endp, 0);
  144:                         if (ul == ULONG_MAX && errno == ERANGE)
  145:                                 goto ret_0;
  146:                         if (ul > 0xfffffffful)
  147:                                 goto ret_0;
  148:                         val = ul;
  149:                         digit = cp != endp;
  150:                         cp = endp;
  151:                 }
  152:                 c = *cp;
  153: #else
  154:                 val = 0; base = 10; digit = 0;
  155:                 if (c == '0') {
  156:                         c = *++cp;
  157:                         if (c == 'x' || c == 'X')
  158:                                 base = 16, c = *++cp;
  159:                         else {
  160:                                 base = 8;
  161:                                 digit = 1 ;
  162:                         }
  163:                 }
  164:                 for (;;) {
  165:                         if (isascii(c) && isdigit(c)) {
  166:                                 if (base == 8 && (c == '8' || c == '9'))
  167:                                         return (0);
  168:                                 val = (val * base) + (c - '0');
  169:                                 c = *++cp;
  170:                                 digit = 1;
  171:                         } else if (base == 16 && isascii(c) && isxdigit(c)) {
  172:                                 val = (val << 4) |
  173:                                         (c + 10 - (islower(c) ? 'a' : 'A'));
  174:                                 c = *++cp;
  175:                                 digit = 1;
  176:                         } else
  177:                                 break;
  178:                 }
  179: #endif
  180:                 if (c == '.') {
  181:                         /*
  182:                          * Internet format:
  183:                          *   a.b.c.d
  184:                          *   a.b.c     (with c treated as 16 bits)
  185:                          *   a.b       (with b treated as 24 bits)
  186:                          */
  187:                         if (pp > res.bytes + 2 || val > 0xff)
  188:                                 goto ret_0;
  189:                         *pp++ = val;
  190:                         c = *++cp;
  191:                 } else
  192:                         break;
  193:         }
  194:         /*
  195:          * Check for trailing characters.
  196:          */
  197:         if (c != '\0' && (!isascii(c) || !isspace(c)))
  198:                 goto ret_0;
  199:         /*
  200:          * Did we get a valid digit?
  201:          */
  202:         if (!digit)
  203:                 goto ret_0;
  204: 
  205:         /* Check whether the last part is in its limits depending on
  206:            the number of parts in total.  */
  207:         if (val > max[pp - res.bytes])
  208:           goto ret_0;
  209: 
  210:         if (addr != NULL)
  211:                 addr->s_addr = res.word | htonl (val);
  212: 
  213: #ifdef _LIBC
  214:         __set_errno (saved_errno);
  215: #endif
  216:         return (1);
  217: 
  218: ret_0:
  219: #ifdef _LIBC
  220:         __set_errno (saved_errno);
  221: #endif
  222:         return (0);
  223: }
  224: weak_alias (__inet_aton, inet_aton)
  225: libc_hidden_def (__inet_aton)
  226: libc_hidden_weak (inet_aton)
Syntax (Markdown)