xref: /freebsd/lib/libc/string/strndup.c (revision 559a218c9b257775fb249b67945fe4a05b7a6b9f)
1*cad56660SXin LI /*	$OpenBSD: strndup.c,v 1.1 2010/05/18 22:24:55 tedu Exp $	*/
2f0eca40aSKonstantin Belousov 
3f0eca40aSKonstantin Belousov /*
4*cad56660SXin LI  * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com>
5f0eca40aSKonstantin Belousov  *
6*cad56660SXin LI  * Permission to use, copy, modify, and distribute this software for any
7*cad56660SXin LI  * purpose with or without fee is hereby granted, provided that the above
8*cad56660SXin LI  * copyright notice and this permission notice appear in all copies.
9f0eca40aSKonstantin Belousov  *
10*cad56660SXin LI  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*cad56660SXin LI  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*cad56660SXin LI  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*cad56660SXin LI  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*cad56660SXin LI  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*cad56660SXin LI  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*cad56660SXin LI  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17f0eca40aSKonstantin Belousov  */
18f0eca40aSKonstantin Belousov 
19f0eca40aSKonstantin Belousov #include <stddef.h>
20f0eca40aSKonstantin Belousov #include <stdlib.h>
21f0eca40aSKonstantin Belousov #include <string.h>
22f0eca40aSKonstantin Belousov 
23f0eca40aSKonstantin Belousov char *
strndup(const char * str,size_t maxlen)24*cad56660SXin LI strndup(const char *str, size_t maxlen)
25f0eca40aSKonstantin Belousov {
26f0eca40aSKonstantin Belousov 	char *copy;
27*cad56660SXin LI 	size_t len;
28f0eca40aSKonstantin Belousov 
29*cad56660SXin LI 	len = strnlen(str, maxlen);
30*cad56660SXin LI 	copy = malloc(len + 1);
31*cad56660SXin LI 	if (copy != NULL) {
32*cad56660SXin LI 		(void)memcpy(copy, str, len);
33f0eca40aSKonstantin Belousov 		copy[len] = '\0';
34*cad56660SXin LI 	}
35*cad56660SXin LI 
36*cad56660SXin LI 	return copy;
37f0eca40aSKonstantin Belousov }
38