xref: /openbsd-src/lib/libc/net/inet_neta.c (revision 0038de2c7a95ab6cde30035b4c13f3d21c8a1310)
1*0038de2cSespie /*	$OpenBSD: inet_neta.c,v 1.7 2005/08/06 20:30:03 espie Exp $	*/
27949d54bSdownsj 
37949d54bSdownsj /*
47949d54bSdownsj  * Copyright (c) 1996 by Internet Software Consortium.
57949d54bSdownsj  *
67949d54bSdownsj  * Permission to use, copy, modify, and distribute this software for any
77949d54bSdownsj  * purpose with or without fee is hereby granted, provided that the above
87949d54bSdownsj  * copyright notice and this permission notice appear in all copies.
97949d54bSdownsj  *
107949d54bSdownsj  * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
117949d54bSdownsj  * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
127949d54bSdownsj  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
137949d54bSdownsj  * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
147949d54bSdownsj  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
157949d54bSdownsj  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
167949d54bSdownsj  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
177949d54bSdownsj  * SOFTWARE.
187949d54bSdownsj  */
197949d54bSdownsj 
207949d54bSdownsj #include <sys/types.h>
217949d54bSdownsj #include <sys/socket.h>
227949d54bSdownsj #include <netinet/in.h>
237949d54bSdownsj #include <arpa/inet.h>
247949d54bSdownsj 
257949d54bSdownsj #include <errno.h>
267949d54bSdownsj #include <stdio.h>
2732210aa3Smillert #include <string.h>
287949d54bSdownsj 
297949d54bSdownsj /*
307949d54bSdownsj  * char *
317949d54bSdownsj  * inet_neta(src, dst, size)
3232210aa3Smillert  *	format an in_addr_t network number into presentation format.
337949d54bSdownsj  * return:
347949d54bSdownsj  *	pointer to dst, or NULL if an error occurred (check errno).
357949d54bSdownsj  * note:
367949d54bSdownsj  *	format of ``src'' is as for inet_network().
377949d54bSdownsj  * author:
387949d54bSdownsj  *	Paul Vixie (ISC), July 1996
397949d54bSdownsj  */
407949d54bSdownsj char *
inet_neta(in_addr_t src,char * dst,size_t size)41db5b349cSotto inet_neta(in_addr_t src, char *dst, size_t size)
427949d54bSdownsj {
437949d54bSdownsj 	char *odst = dst;
4473bbab47Sitojun 	char *ep;
4573bbab47Sitojun 	int advance;
467949d54bSdownsj 
4773bbab47Sitojun 	if (src == 0x00000000) {
4873bbab47Sitojun 		if (size < sizeof "0.0.0.0")
4973bbab47Sitojun 			goto emsgsize;
5073bbab47Sitojun 		strlcpy(dst, "0.0.0.0", size);
5173bbab47Sitojun 		return dst;
5273bbab47Sitojun 	}
5373bbab47Sitojun 	ep = dst + size;
5473bbab47Sitojun 	if (ep <= dst)
5573bbab47Sitojun 		goto emsgsize;
567949d54bSdownsj 	while (src & 0xffffffff) {
577949d54bSdownsj 		u_char b = (src & 0xff000000) >> 24;
587949d54bSdownsj 
597949d54bSdownsj 		src <<= 8;
6073bbab47Sitojun 		if (b || src) {
6173bbab47Sitojun 			if (ep - dst < sizeof "255.")
627949d54bSdownsj 				goto emsgsize;
6373bbab47Sitojun 			advance = snprintf(dst, ep - dst, "%u", b);
6473bbab47Sitojun 			if (advance <= 0 || advance >= ep - dst)
6573bbab47Sitojun 				goto emsgsize;
6673bbab47Sitojun 			dst += advance;
677949d54bSdownsj 			if (src != 0L) {
6873bbab47Sitojun 				if (dst + 1 >= ep)
6973bbab47Sitojun 					goto emsgsize;
707949d54bSdownsj 				*dst++ = '.';
717949d54bSdownsj 				*dst = '\0';
727949d54bSdownsj 			}
737949d54bSdownsj 		}
747949d54bSdownsj 	}
757949d54bSdownsj 	return (odst);
767949d54bSdownsj 
777949d54bSdownsj  emsgsize:
787949d54bSdownsj 	errno = EMSGSIZE;
797949d54bSdownsj 	return (NULL);
807949d54bSdownsj }
81