xref: /freebsd/lib/libc/inet/inet_neta.c (revision dc36d6f9bb1753f3808552f3afd30eda9a7b206a)
1*6e778a7eSPedro F. Giffuni /*-
2*6e778a7eSPedro F. Giffuni  * SPDX-License-Identifier: ISC
3*6e778a7eSPedro F. Giffuni  *
465e96449SHajimu UMEMOTO  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
565e96449SHajimu UMEMOTO  * Copyright (c) 1996,1999 by Internet Software Consortium.
665e96449SHajimu UMEMOTO  *
765e96449SHajimu UMEMOTO  * Permission to use, copy, modify, and distribute this software for any
865e96449SHajimu UMEMOTO  * purpose with or without fee is hereby granted, provided that the above
965e96449SHajimu UMEMOTO  * copyright notice and this permission notice appear in all copies.
1065e96449SHajimu UMEMOTO  *
1165e96449SHajimu UMEMOTO  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
1265e96449SHajimu UMEMOTO  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1365e96449SHajimu UMEMOTO  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
1465e96449SHajimu UMEMOTO  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1565e96449SHajimu UMEMOTO  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1665e96449SHajimu UMEMOTO  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
1765e96449SHajimu UMEMOTO  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1865e96449SHajimu UMEMOTO  */
1965e96449SHajimu UMEMOTO 
2065e96449SHajimu UMEMOTO #include "port_before.h"
2165e96449SHajimu UMEMOTO 
2265e96449SHajimu UMEMOTO #include <sys/types.h>
2365e96449SHajimu UMEMOTO #include <sys/socket.h>
2465e96449SHajimu UMEMOTO #include <netinet/in.h>
2565e96449SHajimu UMEMOTO #include <arpa/inet.h>
2665e96449SHajimu UMEMOTO 
2765e96449SHajimu UMEMOTO #include <errno.h>
2865e96449SHajimu UMEMOTO #include <stdio.h>
2965e96449SHajimu UMEMOTO #include <string.h>
3065e96449SHajimu UMEMOTO 
3165e96449SHajimu UMEMOTO #include "port_after.h"
3265e96449SHajimu UMEMOTO 
3365e96449SHajimu UMEMOTO #ifdef SPRINTF_CHAR
3465e96449SHajimu UMEMOTO # define SPRINTF(x) strlen(sprintf/**/x)
3565e96449SHajimu UMEMOTO #else
3665e96449SHajimu UMEMOTO # define SPRINTF(x) ((size_t)sprintf x)
3765e96449SHajimu UMEMOTO #endif
3865e96449SHajimu UMEMOTO 
39dde4a85dSHajimu UMEMOTO /*%
4065e96449SHajimu UMEMOTO  * char *
4165e96449SHajimu UMEMOTO  * inet_neta(src, dst, size)
42ab96eeabSHajimu UMEMOTO  *	format an in_addr_t network number into presentation format.
4365e96449SHajimu UMEMOTO  * return:
4465e96449SHajimu UMEMOTO  *	pointer to dst, or NULL if an error occurred (check errno).
4565e96449SHajimu UMEMOTO  * note:
4665e96449SHajimu UMEMOTO  *	format of ``src'' is as for inet_network().
4765e96449SHajimu UMEMOTO  * author:
4865e96449SHajimu UMEMOTO  *	Paul Vixie (ISC), July 1996
4965e96449SHajimu UMEMOTO  */
5065e96449SHajimu UMEMOTO char *
inet_neta(in_addr_t src,char * dst,size_t size)51060e5496SCraig Rodrigues inet_neta(in_addr_t src, char *dst, size_t size)
5265e96449SHajimu UMEMOTO {
5365e96449SHajimu UMEMOTO 	char *odst = dst;
5465e96449SHajimu UMEMOTO 	char *tp;
5565e96449SHajimu UMEMOTO 
5665e96449SHajimu UMEMOTO 	while (src & 0xffffffff) {
5765e96449SHajimu UMEMOTO 		u_char b = (src & 0xff000000) >> 24;
5865e96449SHajimu UMEMOTO 
5965e96449SHajimu UMEMOTO 		src <<= 8;
6065e96449SHajimu UMEMOTO 		if (b) {
6165e96449SHajimu UMEMOTO 			if (size < sizeof "255.")
6265e96449SHajimu UMEMOTO 				goto emsgsize;
6365e96449SHajimu UMEMOTO 			tp = dst;
6465e96449SHajimu UMEMOTO 			dst += SPRINTF((dst, "%u", b));
6565e96449SHajimu UMEMOTO 			if (src != 0L) {
6665e96449SHajimu UMEMOTO 				*dst++ = '.';
6765e96449SHajimu UMEMOTO 				*dst = '\0';
6865e96449SHajimu UMEMOTO 			}
6965e96449SHajimu UMEMOTO 			size -= (size_t)(dst - tp);
7065e96449SHajimu UMEMOTO 		}
7165e96449SHajimu UMEMOTO 	}
7265e96449SHajimu UMEMOTO 	if (dst == odst) {
7365e96449SHajimu UMEMOTO 		if (size < sizeof "0.0.0.0")
7465e96449SHajimu UMEMOTO 			goto emsgsize;
7565e96449SHajimu UMEMOTO 		strcpy(dst, "0.0.0.0");
7665e96449SHajimu UMEMOTO 	}
7765e96449SHajimu UMEMOTO 	return (odst);
7865e96449SHajimu UMEMOTO 
7965e96449SHajimu UMEMOTO  emsgsize:
8065e96449SHajimu UMEMOTO 	errno = EMSGSIZE;
8165e96449SHajimu UMEMOTO 	return (NULL);
8265e96449SHajimu UMEMOTO }
83ab96eeabSHajimu UMEMOTO 
84ab96eeabSHajimu UMEMOTO /*
85ab96eeabSHajimu UMEMOTO  * Weak aliases for applications that use certain private entry points,
86ab96eeabSHajimu UMEMOTO  * and fail to include <arpa/inet.h>.
87ab96eeabSHajimu UMEMOTO  */
88ab96eeabSHajimu UMEMOTO #undef inet_neta
89ab96eeabSHajimu UMEMOTO __weak_reference(__inet_neta, inet_neta);
90dde4a85dSHajimu UMEMOTO 
91dde4a85dSHajimu UMEMOTO /*! \file */
92