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