147dd1d1bSDag-Erling Smørgrav /* $OpenBSD: strndup.c,v 1.2 2015/08/31 02:53:57 guenther Exp $ */
247dd1d1bSDag-Erling Smørgrav
347dd1d1bSDag-Erling Smørgrav /*
447dd1d1bSDag-Erling Smørgrav * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com>
547dd1d1bSDag-Erling Smørgrav *
647dd1d1bSDag-Erling Smørgrav * Permission to use, copy, modify, and distribute this software for any
747dd1d1bSDag-Erling Smørgrav * purpose with or without fee is hereby granted, provided that the above
847dd1d1bSDag-Erling Smørgrav * copyright notice and this permission notice appear in all copies.
947dd1d1bSDag-Erling Smørgrav *
1047dd1d1bSDag-Erling Smørgrav * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1147dd1d1bSDag-Erling Smørgrav * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1247dd1d1bSDag-Erling Smørgrav * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1347dd1d1bSDag-Erling Smørgrav * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1447dd1d1bSDag-Erling Smørgrav * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1547dd1d1bSDag-Erling Smørgrav * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1647dd1d1bSDag-Erling Smørgrav * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1747dd1d1bSDag-Erling Smørgrav */
1847dd1d1bSDag-Erling Smørgrav
19*190cef3dSDag-Erling Smørgrav #include "includes.h"
2047dd1d1bSDag-Erling Smørgrav #if !defined(HAVE_STRNDUP) || defined(BROKEN_STRNDUP)
2147dd1d1bSDag-Erling Smørgrav #include <sys/types.h>
2247dd1d1bSDag-Erling Smørgrav
2347dd1d1bSDag-Erling Smørgrav #include <stddef.h>
2447dd1d1bSDag-Erling Smørgrav #include <stdlib.h>
2547dd1d1bSDag-Erling Smørgrav #include <string.h>
2647dd1d1bSDag-Erling Smørgrav
2747dd1d1bSDag-Erling Smørgrav char *
strndup(const char * str,size_t maxlen)2847dd1d1bSDag-Erling Smørgrav strndup(const char *str, size_t maxlen)
2947dd1d1bSDag-Erling Smørgrav {
3047dd1d1bSDag-Erling Smørgrav char *copy;
3147dd1d1bSDag-Erling Smørgrav size_t len;
3247dd1d1bSDag-Erling Smørgrav
3347dd1d1bSDag-Erling Smørgrav len = strnlen(str, maxlen);
3447dd1d1bSDag-Erling Smørgrav copy = malloc(len + 1);
3547dd1d1bSDag-Erling Smørgrav if (copy != NULL) {
3647dd1d1bSDag-Erling Smørgrav (void)memcpy(copy, str, len);
3747dd1d1bSDag-Erling Smørgrav copy[len] = '\0';
3847dd1d1bSDag-Erling Smørgrav }
3947dd1d1bSDag-Erling Smørgrav
4047dd1d1bSDag-Erling Smørgrav return copy;
4147dd1d1bSDag-Erling Smørgrav }
4247dd1d1bSDag-Erling Smørgrav DEF_WEAK(strndup);
4347dd1d1bSDag-Erling Smørgrav #endif /* HAVE_STRNDUP */
44