1d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 2d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Copyright (c) 1996 by Internet Software Consortium. 3d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 4d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Permission to use, copy, modify, and distribute this software for any 5d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * purpose with or without fee is hereby granted, provided that the above 6d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * copyright notice and this permission notice appear in all copies. 7d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 8d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS 9d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 10d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE 11d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 12d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 13d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 14d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 15d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SOFTWARE. 16d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 17d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 18d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 19d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions copyright (c) 1999, 2000 20d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Intel Corporation. 21d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * All rights reserved. 22d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 23d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Redistribution and use in source and binary forms, with or without 24d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * modification, are permitted provided that the following conditions 25d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * are met: 26d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 27d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 1. Redistributions of source code must retain the above copyright 28d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * notice, this list of conditions and the following disclaimer. 29d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 30d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 2. Redistributions in binary form must reproduce the above copyright 31d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * notice, this list of conditions and the following disclaimer in the 32d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * documentation and/or other materials provided with the distribution. 33d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 34d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 3. All advertising materials mentioning features or use of this software 35d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * must display the following acknowledgement: 36d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 37d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * This product includes software developed by Intel Corporation and 38d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * its contributors. 39d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 40d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 4. Neither the name of Intel Corporation or its contributors may be 41d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * used to endorse or promote products derived from this software 42d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * without specific prior written permission. 43d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 44d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS'' 45d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 46d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 47d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE 48d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 49d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 50d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 51d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 52d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 53d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 54d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE POSSIBILITY OF SUCH DAMAGE. 55d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 56d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 57d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 58d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#if defined(LIBC_SCCS) && !defined(lint) 59d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic const char orig_rcsid[] = "From Id: inet_net_pton.c,v 1.8 1996/11/21 10:28:12 vixie Exp $"; 60d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic const char rcsid[] = "$Id: inet_net_pton.c,v 1.1.1.1 2003/11/19 01:51:29 kyu3 Exp $"; 61d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 62d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 63d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/types.h> 64d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/socket.h> 65d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <netinet/in.h> 66d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <arpa/inet.h> 67d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 68d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <assert.h> 69d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <ctype.h> 70d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <errno.h> 71d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdio.h> 72d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <string.h> 73d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdlib.h> 74d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 75d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef SPRINTF_CHAR 76d7ce700605e1af0e455e31ec11f19ff21d26b525darylm# define SPRINTF(x) strlen(sprintf/**/x) 77d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#else 78d7ce700605e1af0e455e31ec11f19ff21d26b525darylm# define SPRINTF(x) ((size_t)sprintf x) 79d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif 80d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 81d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic int inet_net_pton_ipv4 (const char *src, u_char *dst, 82d7ce700605e1af0e455e31ec11f19ff21d26b525darylm size_t size); 83d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 84d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 85d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * static int 86d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * inet_net_pton(af, src, dst, size) 87d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * convert network number from presentation to network format. 88d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * accepts hex octets, hex strings, decimal octets, and /CIDR. 89d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * "size" is in bytes and describes "dst". 90d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * return: 91d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * number of bits, either imputed classfully or specified with /CIDR, 92d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * or -1 if some failure occurred (check errno). ENOENT means it was 93d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * not a valid network specification. 94d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * author: 95d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Paul Vixie (ISC), June 1996 96d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 97d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint 98d7ce700605e1af0e455e31ec11f19ff21d26b525darylminet_net_pton( 99d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int af, 100d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const char *src, 101d7ce700605e1af0e455e31ec11f19ff21d26b525darylm void *dst, 102d7ce700605e1af0e455e31ec11f19ff21d26b525darylm size_t size 103d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ) 104d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 105d7ce700605e1af0e455e31ec11f19ff21d26b525darylm switch (af) { 106d7ce700605e1af0e455e31ec11f19ff21d26b525darylm case AF_INET: 107d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (inet_net_pton_ipv4(src, dst, size)); 108d7ce700605e1af0e455e31ec11f19ff21d26b525darylm default: 109d7ce700605e1af0e455e31ec11f19ff21d26b525darylm errno = EAFNOSUPPORT; 110d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (-1); 111d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 112d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 113d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 114d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* 115d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * static int 116d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * inet_net_pton_ipv4(src, dst, size) 117d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * convert IPv4 network number from presentation to network format. 118d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * accepts hex octets, hex strings, decimal octets, and /CIDR. 119d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * "size" is in bytes and describes "dst". 120d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * return: 121d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * number of bits, either imputed classfully or specified with /CIDR, 122d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * or -1 if some failure occurred (check errno). ENOENT means it was 123d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * not an IPv4 network specification. 124d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * note: 125d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * network byte order assumed. this means 192.5.5.240/28 has 126d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 0x11110000 in its fourth octet. 127d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * author: 128d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Paul Vixie (ISC), June 1996 129d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */ 130d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic int 131d7ce700605e1af0e455e31ec11f19ff21d26b525darylminet_net_pton_ipv4( 132d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const char *src, 133d7ce700605e1af0e455e31ec11f19ff21d26b525darylm u_char *dst, 134d7ce700605e1af0e455e31ec11f19ff21d26b525darylm size_t size 135d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ) 136d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 137d7ce700605e1af0e455e31ec11f19ff21d26b525darylm static const char xdigits[] = "0123456789abcdef"; 138d7ce700605e1af0e455e31ec11f19ff21d26b525darylm static const char digits[] = "0123456789"; 139d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int n; 140d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int ch; 141d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int tmp; 142d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int dirty; 143d7ce700605e1af0e455e31ec11f19ff21d26b525darylm int bits; 144d7ce700605e1af0e455e31ec11f19ff21d26b525darylm const u_char *odst = dst; 145d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 146d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ch = *src++; 147d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (ch == '0' && (src[0] == 'x' || src[0] == 'X') 148d7ce700605e1af0e455e31ec11f19ff21d26b525darylm && isascii(src[1]) && isxdigit(src[1])) { 149d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* Hexadecimal: Eat nybble string. */ 150d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (size <= 0) 151d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto emsgsize; 152d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *dst = 0, dirty = 0; 153d7ce700605e1af0e455e31ec11f19ff21d26b525darylm src++; /* skip x or X. */ 154d7ce700605e1af0e455e31ec11f19ff21d26b525darylm while ((ch = *src++) != '\0' && 155d7ce700605e1af0e455e31ec11f19ff21d26b525darylm isascii(ch) && isxdigit(ch)) { 156d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (isupper(ch)) 157d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ch = tolower(ch); 158d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = (int)(strchr(xdigits, ch) - xdigits); 159d7ce700605e1af0e455e31ec11f19ff21d26b525darylm assert(n >= 0 && n <= 15); 160d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *dst |= n; 161d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!dirty++) 162d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *dst <<= 4; 163d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else if (size-- > 0) 164d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *++dst = 0, dirty = 0; 165d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else 166d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto emsgsize; 167d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 168d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (dirty) 169d7ce700605e1af0e455e31ec11f19ff21d26b525darylm size--; 170d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } else if (isascii(ch) && isdigit(ch)) { 171d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* Decimal: eat dotted digit string. */ 172d7ce700605e1af0e455e31ec11f19ff21d26b525darylm for (;;) { 173d7ce700605e1af0e455e31ec11f19ff21d26b525darylm tmp = 0; 174d7ce700605e1af0e455e31ec11f19ff21d26b525darylm do { 175d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = (int)(strchr(digits, ch) - digits); 176d7ce700605e1af0e455e31ec11f19ff21d26b525darylm assert(n >= 0 && n <= 9); 177d7ce700605e1af0e455e31ec11f19ff21d26b525darylm tmp *= 10; 178d7ce700605e1af0e455e31ec11f19ff21d26b525darylm tmp += n; 179d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (tmp > 255) 180d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto enoent; 181d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } while ((ch = *src++) != '\0' && 182d7ce700605e1af0e455e31ec11f19ff21d26b525darylm isascii(ch) && isdigit(ch)); 183d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (size-- <= 0) 184d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto emsgsize; 185d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *dst++ = (u_char) tmp; 186d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (ch == '\0' || ch == '/') 187d7ce700605e1af0e455e31ec11f19ff21d26b525darylm break; 188d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (ch != '.') 189d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto enoent; 190d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ch = *src++; 191d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (!isascii(ch) || !isdigit(ch)) 192d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto enoent; 193d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 194d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } else 195d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto enoent; 196d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 197d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits = -1; 198d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (ch == '/' && isascii(src[0]) && isdigit(src[0]) && dst > odst) { 199d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* CIDR width specifier. Nothing can follow it. */ 200d7ce700605e1af0e455e31ec11f19ff21d26b525darylm ch = *src++; /* Skip over the /. */ 201d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits = 0; 202d7ce700605e1af0e455e31ec11f19ff21d26b525darylm do { 203d7ce700605e1af0e455e31ec11f19ff21d26b525darylm n = (int)(strchr(digits, ch) - digits); 204d7ce700605e1af0e455e31ec11f19ff21d26b525darylm assert(n >= 0 && n <= 9); 205d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits *= 10; 206d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits += n; 207d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); 208d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (ch != '\0') 209d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto enoent; 210d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (bits > 32) 211d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto emsgsize; 212d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 213d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 214d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* Firey death and destruction unless we prefetched EOS. */ 215d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (ch != '\0') 216d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto enoent; 217d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 218d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* If nothing was written to the destination, we found no address. */ 219d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (dst == odst) 220d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto enoent; 221d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* If no CIDR spec was given, infer width from net class. */ 222d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (bits == -1) { 223d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (*odst >= 240) /* Class E */ 224d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits = 32; 225d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else if (*odst >= 224) /* Class D */ 226d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits = 4; 227d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else if (*odst >= 192) /* Class C */ 228d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits = 24; 229d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else if (*odst >= 128) /* Class B */ 230d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits = 16; 231d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else /* Class A */ 232d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits = 8; 233d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* If imputed mask is narrower than specified octets, widen. */ 234d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (bits >= 8 && bits < ((dst - odst) * 8)) 235d7ce700605e1af0e455e31ec11f19ff21d26b525darylm bits = (int)(dst - odst) * 8; 236d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 237d7ce700605e1af0e455e31ec11f19ff21d26b525darylm /* Extend network to cover the actual mask. */ 238d7ce700605e1af0e455e31ec11f19ff21d26b525darylm while (bits > ((dst - odst) * 8)) { 239d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (size-- <= 0) 240d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto emsgsize; 241d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *dst++ = '\0'; 242d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 243d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (bits); 244d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 245d7ce700605e1af0e455e31ec11f19ff21d26b525darylm enoent: 246d7ce700605e1af0e455e31ec11f19ff21d26b525darylm errno = ENOENT; 247d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (-1); 248d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 249d7ce700605e1af0e455e31ec11f19ff21d26b525darylm emsgsize: 250d7ce700605e1af0e455e31ec11f19ff21d26b525darylm errno = EMSGSIZE; 251d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (-1); 252d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 253