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