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