]>
git.saurik.com Git - apple/libc.git/blob - net/FreeBSD/inet_addr.c
   2  * Copyright (c) 1983, 1990, 1993 
   3  *    The Regents of the University of California.  All rights reserved. 
   5  * Redistribution and use in source and binary forms, with or without 
   6  * modification, are permitted provided that the following conditions 
   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. 
  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 
  31  * Portions Copyright (c) 1993 by Digital Equipment Corporation. 
  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. 
  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 
  51  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 
  52  * Portions Copyright (c) 1996-1999 by Internet Software Consortium. 
  54  * Permission to use, copy, modify, and distribute this software for any 
  55  * purpose with or without fee is hereby granted, provided that the above 
  56  * copyright notice and this permission notice appear in all copies. 
  58  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 
  59  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
  60  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR 
  61  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
  62  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
  63  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 
  64  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
  67 #pragma clang diagnostic push 
  68 #pragma clang diagnostic ignored "-Wcomma" 
  70 #if defined(LIBC_SCCS) && !defined(lint) 
  71 static const char sccsid
[] = "@(#)inet_addr.c   8.1 (Berkeley) 6/17/93"; 
  72 static const char rcsid
[] = "$Id: inet_addr.c,v 1.4.18.1 2005/04/27 05:00:52 sra Exp $"; 
  73 #endif /* LIBC_SCCS and not lint */ 
  75 /* the algorithms only can deal with ASCII, so we optimize for it */ 
  78 #include <sys/cdefs.h> 
  79 __FBSDID("$FreeBSD: src/lib/libc/inet/inet_addr.c,v 1.4 2007/06/03 17:20:26 ume Exp $"); 
  81 #include "port_before.h" 
  83 #include <sys/types.h> 
  84 #include <sys/param.h> 
  86 #include <netinet/in.h> 
  87 #include <arpa/inet.h> 
  91 #include "port_after.h" 
  94  * Ascii internet address interpretation routine. 
  95  * The value returned is in network order. 
  97 in_addr_t               
/* XXX should be struct in_addr :( */ 
  98 inet_addr(const char *cp
) { 
 101         if (inet_aton(cp
, &val
)) 
 103         return (INADDR_NONE
); 
 107  * Check whether "cp" is a valid ascii representation 
 108  * of an Internet address and convert to a binary address. 
 109  * Returns 1 if the address is valid, 0 if not. 
 110  * This replaces inet_addr, the return value from which 
 111  * cannot distinguish between failure and a local broadcast address. 
 112  * strict == 1 disallows trailing characters. 
 115 _inet_aton_check(const char *cp
, struct in_addr 
*addr
, int strict
) 
 121         u_int8_t 
*pp 
= parts
; 
 127                  * Collect number up to ``.''. 
 128                  * Values are specified as for C: 
 129                  * 0x=hex, 0=octal, isdigit=decimal. 
 131                 if (!isdigit((unsigned char)c
)) 
 133                 val 
= 0; base 
= 10; digit 
= 0; 
 136                         if (c 
== 'x' || c 
== 'X') 
 137                                 base 
= 16, c 
= *++cp
; 
 144                         if (isascii(c
) && isdigit((unsigned char)c
)) { 
 145                                 if (base 
== 8 && (c 
== '8' || c 
== '9')) 
 147                                 val 
= (val 
* base
) + (c 
- '0'); 
 150                         } else if (base 
== 16 && isascii(c
) &&  
 151                                    isxdigit((unsigned char)c
)) { 
 153                                         (c 
+ 10 - (islower((unsigned char)c
) ? 'a' : 'A')); 
 163                          *      a.b.c   (with c treated as 16 bits) 
 164                          *      a.b     (with b treated as 24 bits) 
 166                         if (pp 
>= parts 
+ 3 || val 
> 0xffU
) 
 174          * Check for trailing characters. 
 177                 if (strict
) return (0); 
 178                 if (!isascii(c
) || !isspace(c
)) return (0); 
 181          * Did we get a valid digit? 
 186          * Concoct the address according to 
 187          * the number of parts specified. 
 191         case 1:                         /*%< a -- 32 bits */ 
 194         case 2:                         /*%< a.b -- 8.24 bits */ 
 197                 val 
|= parts
[0] << 24; 
 200         case 3:                         /*%< a.b.c -- 8.8.16 bits */ 
 203                 val 
|= (parts
[0] << 24) | (parts
[1] << 16); 
 206         case 4:                         /*%< a.b.c.d -- 8.8.8.8 bits */ 
 209                 val 
|= (parts
[0] << 24) | (parts
[1] << 16) | (parts
[2] << 8); 
 213                 addr
->s_addr 
= htonl(val
); 
 218 inet_aton(const char *cp
, struct in_addr 
*addr
) 
 220         return _inet_aton_check(cp
, addr
, 0); 
 224  * Weak aliases for applications that use certain private entry points, 
 225  * and fail to include <arpa/inet.h>. 
 228 __weak_reference(__inet_addr
, inet_addr
); 
 230 __weak_reference(__inet_aton
, inet_aton
); 
 232 #pragma clang diagnostic pop