1/* $NetBSD: inet_neta.c,v 1.15 2002/11/11 18:02:37 thorpej Exp $ */ 2 3/* 4 * Copyright (c) 1996 by Internet Software Consortium. 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS 11 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 12 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE 13 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 16 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 17 * SOFTWARE. 18 */ 19 20#include <sys/cdefs.h> 21#if defined(LIBC_SCCS) && !defined(lint) 22#if 0 23static const char rcsid[] = "Id: inet_neta.c,v 8.2 1996/08/08 06:54:44 vixie Exp "; 24#else 25__RCSID("$NetBSD: inet_neta.c,v 1.15 2002/11/11 18:02:37 thorpej Exp $"); 26#endif 27#endif 28 29#include "namespace.h" 30#include <sys/types.h> 31#include <sys/socket.h> 32#include <netinet/in.h> 33#include <arpa/inet.h> 34 35#include <assert.h> 36#include <errno.h> 37#include <stdio.h> 38#include <string.h> 39 40#ifdef __weak_alias 41__weak_alias(inet_neta,_inet_neta) 42#endif 43 44/* 45 * char * 46 * inet_neta(src, dst, size) 47 * format a u_long network number into presentation format. 48 * return: 49 * pointer to dst, or NULL if an error occurred (check errno). 50 * note: 51 * format of ``src'' is as for inet_network(). 52 * author: 53 * Paul Vixie (ISC), July 1996 54 */ 55char * 56inet_neta(src, dst, size) 57 u_long src; 58 char *dst; 59 size_t size; 60{ 61 char *odst = dst; 62 char *ep; 63 int advance; 64 65 _DIAGASSERT(dst != NULL); 66 67 if (src == 0x00000000) { 68 if (size < sizeof "0.0.0.0") 69 goto emsgsize; 70 strlcpy(dst, "0.0.0.0", size); 71 return dst; 72 } 73 ep = dst + size; 74 if (ep <= dst) 75 goto emsgsize; 76 while (src & 0xffffffff) { 77 u_char b = (u_char)((src & 0xff000000) >> 24); 78 79 src <<= 8; 80 if (b || src) { 81 advance = snprintf(dst, (size_t)(ep - dst), "%u", b); 82 if (advance <= 0 || advance >= ep - dst) 83 goto emsgsize; 84 dst += advance; 85 if (src != 0L) { 86 if (dst + 1 >= ep) 87 goto emsgsize; 88 *dst++ = '.'; 89 *dst = '\0'; 90 } 91 } 92 } 93 return (odst); 94 95 emsgsize: 96 errno = EMSGSIZE; 97 return (NULL); 98} 99