xref: /freebsd/lib/libc/string/strndup.c (revision cad56660e5b68fc0a7eb6b0e19ca78d8decf6c44)
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 <sys/cdefs.h>
20f0eca40aSKonstantin Belousov __FBSDID("$FreeBSD$");
21f0eca40aSKonstantin Belousov 
22f0eca40aSKonstantin Belousov #include <stddef.h>
23f0eca40aSKonstantin Belousov #include <stdlib.h>
24f0eca40aSKonstantin Belousov #include <string.h>
25f0eca40aSKonstantin Belousov 
26f0eca40aSKonstantin Belousov char *
27*cad56660SXin LI strndup(const char *str, size_t maxlen)
28f0eca40aSKonstantin Belousov {
29f0eca40aSKonstantin Belousov 	char *copy;
30*cad56660SXin LI 	size_t len;
31f0eca40aSKonstantin Belousov 
32*cad56660SXin LI 	len = strnlen(str, maxlen);
33*cad56660SXin LI 	copy = malloc(len + 1);
34*cad56660SXin LI 	if (copy != NULL) {
35*cad56660SXin LI 		(void)memcpy(copy, str, len);
36f0eca40aSKonstantin Belousov 		copy[len] = '\0';
37*cad56660SXin LI 	}
38*cad56660SXin LI 
39*cad56660SXin LI 	return copy;
40f0eca40aSKonstantin Belousov }
41