third-party-mirror / GRTEv4 / 262be5abc585813b1766119db73641d44ba3741e / . / google3 / third_party / grte / v4_src / glibc-2.19 / inet / inet_net.c

/* | |

* Copyright (c) 1983, 1993 | |

* The Regents of the University of California. All rights reserved. | |

* | |

* Redistribution and use in source and binary forms, with or without | |

* modification, are permitted provided that the following conditions | |

* are met: | |

* 1. Redistributions of source code must retain the above copyright | |

* notice, this list of conditions and the following disclaimer. | |

* 2. Redistributions in binary form must reproduce the above copyright | |

* notice, this list of conditions and the following disclaimer in the | |

* documentation and/or other materials provided with the distribution. | |

* 4. Neither the name of the University nor the names of its contributors | |

* may be used to endorse or promote products derived from this software | |

* without specific prior written permission. | |

* | |

* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |

* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |

* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |

* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |

* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |

* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |

* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |

* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |

* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |

* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |

* SUCH DAMAGE. | |

*/ | |

/* Copyright (C) 2013-2014 Free Software Foundation, Inc. | |

This file is part of the GNU C Library. | |

The GNU C Library is free software; you can redistribute it and/or | |

modify it under the terms of the GNU Lesser General Public | |

License as published by the Free Software Foundation; either | |

version 2.1 of the License, or (at your option) any later version. | |

The GNU C Library is distributed in the hope that it will be useful, | |

but WITHOUT ANY WARRANTY; without even the implied warranty of | |

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |

Lesser General Public License for more details. | |

You should have received a copy of the GNU Lesser General Public | |

License along with the GNU C Library; if not, see | |

<http://www.gnu.org/licenses/>. */ | |

#if defined(LIBC_SCCS) && !defined(lint) | |

static char sccsid[] = "@(#)inet_network.c 8.1 (Berkeley) 6/4/93"; | |

#endif /* LIBC_SCCS and not lint */ | |

#include <sys/types.h> | |

#include <netinet/in.h> | |

#include <arpa/inet.h> | |

#include <ctype.h> | |

/* | |

* Internet network address interpretation routine. | |

* The library routines call this routine to interpret | |

* network numbers. | |

*/ | |

u_int32_t | |

inet_network(cp) | |

const char *cp; | |

{ | |

u_int32_t val, base, n, i; | |

char c; | |

u_int32_t parts[4], *pp = parts; | |

int digit; | |

again: | |

val = 0; base = 10; digit = 0; | |

if (*cp == '0') | |

digit = 1, base = 8, cp++; | |

if (*cp == 'x' || *cp == 'X') | |

digit = 0, base = 16, cp++; | |

while ((c = *cp) != 0) { | |

if (isdigit(c)) { | |

if (base == 8 && (c == '8' || c == '9')) | |

return (INADDR_NONE); | |

val = (val * base) + (c - '0'); | |

cp++; | |

digit = 1; | |

continue; | |

} | |

if (base == 16 && isxdigit(c)) { | |

val = (val << 4) + (tolower (c) + 10 - 'a'); | |

cp++; | |

digit = 1; | |

continue; | |

} | |

break; | |

} | |

if (!digit) | |

return (INADDR_NONE); | |

if (pp >= parts + 4 || val > 0xff) | |

return (INADDR_NONE); | |

if (*cp == '.') { | |

*pp++ = val, cp++; | |

goto again; | |

} | |

while (isspace(*cp)) | |

cp++; | |

if (*cp) | |

return (INADDR_NONE); | |

if (pp >= parts + 4 || val > 0xff) | |

return (INADDR_NONE); | |

*pp++ = val; | |

n = pp - parts; | |

for (val = 0, i = 0; i < n; i++) { | |

val <<= 8; | |

val |= parts[i] & 0xff; | |

} | |

return (val); | |

} |