1f51d3e87671110c508f0f71d9bcb1bf54c22ca3bElliott Hughes/*	$OpenBSD: inet_ntop.c,v 1.10 2014/05/17 18:16:14 tedu Exp $	*/
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
36a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes/* Copyright (c) 1996 by Internet Software Consortium.
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies.
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
96a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
106a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
116a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
126a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
136a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
146a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
156a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
166a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes * SOFTWARE.
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/param.h>
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h>
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/socket.h>
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h>
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <arpa/inet.h>
24e8bcca3a2ca4a70156c72239d62bb68eeb2929fdElliott Hughes#include <arpa/nameser.h>
256a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes#include <string.h>
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h>
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdio.h>
28e8bcca3a2ca4a70156c72239d62bb68eeb2929fdElliott Hughes
296a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes/*
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WARNING: Don't even consider trying to compile this on a system where
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX.
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
346a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughesstatic const char *inet_ntop4(const u_char *src, char *dst, size_t size);
356a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughesstatic const char *inet_ntop6(const u_char *src, char *dst, size_t size);
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
376a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes/* const char *
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * inet_ntop(af, src, dst, size)
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	convert a network format address to presentation format.
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return:
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	pointer to presentation format address (`dst'), or NULL (see errno).
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * author:
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Paul Vixie, 1996.
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char *
46e8bcca3a2ca4a70156c72239d62bb68eeb2929fdElliott Hughesinet_ntop(int af, const void *src, char *dst, socklen_t size)
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	switch (af) {
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case AF_INET:
506a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes		return (inet_ntop4(src, dst, (size_t)size));
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case AF_INET6:
526a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes		return (inet_ntop6(src, dst, (size_t)size));
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	default:
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		errno = EAFNOSUPPORT;
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (NULL);
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* NOTREACHED */
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* const char *
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * inet_ntop4(src, dst, size)
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	format an IPv4 address, more or less like inet_ntoa()
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return:
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	`dst' (as a const)
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notes:
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	(1) uses no statics
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	(2) takes a u_char* not an in_addr as input
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * author:
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Paul Vixie, 1996.
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char *
726a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughesinet_ntop4(const u_char *src, char *dst, size_t size)
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char tmp[sizeof "255.255.255.255"];
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int l;
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
77f51d3e87671110c508f0f71d9bcb1bf54c22ca3bElliott Hughes	l = snprintf(tmp, sizeof(tmp), "%u.%u.%u.%u",
78f51d3e87671110c508f0f71d9bcb1bf54c22ca3bElliott Hughes	    src[0], src[1], src[2], src[3]);
796a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes	if (l <= 0 || l >= size) {
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		errno = ENOSPC;
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (NULL);
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	strlcpy(dst, tmp, size);
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (dst);
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* const char *
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * inet_ntop6(src, dst, size)
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	convert IPv6 binary address into presentation (printable) format
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * author:
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Paul Vixie, 1996.
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char *
946a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughesinet_ntop6(const u_char *src, char *dst, size_t size)
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Note that int32_t and int16_t need only be "at least" large enough
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * to contain a value of the specified size.  On some systems, like
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Crays, there is no such thing as an integer variable with 16 bits.
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Keep this in mind if you think this function should have been coded
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * to use pointer overlays.  All the world's not a VAX.
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char *tp, *ep;
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct { int base, len; } best, cur;
1066a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes	u_int words[IN6ADDRSZ / INT16SZ];
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int i;
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int advance;
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Preprocess:
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 *	Copy the input (bytewise) array into a wordwise array.
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 *	Find the longest run of 0x00's in src[] for :: shorthanding.
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	memset(words, '\0', sizeof words);
1166a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes	for (i = 0; i < IN6ADDRSZ; i++)
1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	best.base = -1;
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cur.base = -1;
1206a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes	for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (words[i] == 0) {
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (cur.base == -1)
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				cur.base = i, cur.len = 1;
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			else
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				cur.len++;
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} else {
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (cur.base != -1) {
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				if (best.base == -1 || cur.len > best.len)
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					best = cur;
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				cur.base = -1;
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (cur.base != -1) {
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (best.base == -1 || cur.len > best.len)
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			best = cur;
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (best.base != -1 && best.len < 2)
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		best.base = -1;
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Format the result.
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tp = tmp;
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ep = tmp + sizeof(tmp);
1466a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes	for (i = 0; i < (IN6ADDRSZ / INT16SZ) && tp < ep; i++) {
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Are we inside the best run of 0x00's? */
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (best.base != -1 && i >= best.base &&
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    i < (best.base + best.len)) {
1506a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes			if (i == best.base) {
1516a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes				if (tp + 1 >= ep) {
1526a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes					errno = ENOSPC;
1536a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes					return (NULL);
1546a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes				}
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				*tp++ = ':';
1566a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes			}
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			continue;
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Are we following an initial run of 0x00s or any real hex? */
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (i != 0) {
1616a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes			if (tp + 1 >= ep) {
1626a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes				errno = ENOSPC;
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				return (NULL);
1646a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes			}
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			*tp++ = ':';
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Is this address an encapsulated IPv4? */
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (i == 6 && best.base == 0 &&
1696a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes		    (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {
1706a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes			if (!inet_ntop4(src+12, tp, (size_t)(ep - tp)))
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				return (NULL);
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			tp += strlen(tp);
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			break;
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
1756a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes		advance = snprintf(tp, ep - tp, "%x", words[i]);
1766a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes		if (advance <= 0 || advance >= ep - tp) {
1776a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes			errno = ENOSPC;
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (NULL);
1796a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes		}
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		tp += advance;
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* Was it a trailing run of 0x00's? */
1836a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes	if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) {
1846a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes		if (tp + 1 >= ep) {
1856a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes			errno = ENOSPC;
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (NULL);
1876a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes		}
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		*tp++ = ':';
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1906a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes	if (tp + 1 >= ep) {
1916a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes		errno = ENOSPC;
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (NULL);
1936a41b0fb0e589c4afc4ecbcf7c425f0aa40eaea4Elliott Hughes	}
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*tp++ = '\0';
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Check for overflow, copy, and we're done.
1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if ((size_t)(tp - tmp) > size) {
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		errno = ENOSPC;
2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (NULL);
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	strlcpy(dst, tmp, size);
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (dst);
2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
206