diff --git a/Makefile b/Makefile
index afdbcafbc156521dd3e6117c0b9da29d862142fe..ba0912feb5d5395d52aee999af37ecb3e19a250b 100755
--- a/Makefile
+++ b/Makefile
@@ -249,7 +249,7 @@ LIBS+=-lresolv
 CFLAGS+=-D__Darwin__
 endif
 ifeq (${OSARCH},FreeBSD)
-LIBS+=-lcrypto -lstrfunc
+LIBS+=-lcrypto
 endif
 ifeq (${OSARCH},NetBSD)
 LIBS+=-lpthread -lcrypto -lm -L$(CROSS_COMPILE_TARGET)/usr/local/lib -L$(CROSS_COMPILE_TARGET)/usr/pkg/lib -lncurses
diff --git a/channel.c b/channel.c
index 2bfe485e226b89d43aa16f5018b021f968b814d0..ae9d98f6b4cb56df75c818f3b66335e5ce40c12f 100755
--- a/channel.c
+++ b/channel.c
@@ -31,12 +31,6 @@
 #error "You need newer zaptel!  Please cvs update zaptel"
 #endif
 #endif
-#ifdef __FreeBSD__
-#include <strfunc.h>
-#if (!defined(__STRFUNC_H__) && (!defined(STRFUNC_H)))
-#error "Please install the strfunc library located in the ports collection at /usr/ports/devel/libstrfunc"
-#endif
-#endif
 
 #include "asterisk.h"
 
@@ -1759,8 +1753,8 @@ char *ast_recvtext(struct ast_channel *chan, int timeout)
 			break; /* no frame */
 		if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP)
 			done = 1;	/* force a break */
-		else if (f->frametype == AST_FRAME_TEXT) {	/* what we want */
-			buf = strndup((char *)f->data, f->datalen);	/* dup and break */
+		else if (f->frametype == AST_FRAME_TEXT) {			/* what we want */
+			buf = ast_strndup((char *) f->data, f->datalen);	/* dup and break */
 			done = 1;
 		}
 		ast_frfree(f);
diff --git a/include/asterisk/strings.h b/include/asterisk/strings.h
index 2b845a8374bc90ed2a771d5180538e7fa07b9a8c..f6902ef1b3fbb27b9baaff795a3d67fcd859a555 100755
--- a/include/asterisk/strings.h
+++ b/include/asterisk/strings.h
@@ -199,8 +199,12 @@ struct ast_realloca {
 
 #ifdef __linux__
 #define ast_strcasestr strcasestr
-#else
-extern char *ast_strcasestr(const char *, const char *);
-#endif /* __linux__ */
+#define ast_strndup	strndup
+#define ast_strnlen	strnlen
+#else /* !__linux__ */
+char *ast_strcasestr(const char *, const char *);
+char *ast_strndup(const char *, size_t);
+size_t ast_strnlen(const char *, size_t);
+#endif /* !__linux__ */
 
 #endif /* _ASTERISK_STRINGS_H */
diff --git a/utils.c b/utils.c
index 1319f71b92d1a44db97a64941cdb816e6dfd9101..72b7f9be61910e6a3388255afbac0461c5b46241 100755
--- a/utils.c
+++ b/utils.c
@@ -535,4 +535,28 @@ char *ast_strcasestr(const char *haystack, const char *needle)
 		return NULL;
 	}
 }
-#endif /* LINUX */
+
+size_t ast_strnlen(const char *s, size_t n)
+{
+	size_t len;
+
+	for (len=0; len < n; len++)
+		if (s[len] == '\0')
+			break;
+
+	return len;
+}
+
+char *ast_strndup(const char *s, size_t n)
+{
+	size_t len = ast_strnlen(s, n);
+	char *new = malloc(len + 1);
+
+	if (!new)
+		return NULL;
+
+	new[len] = '\0';
+	return memcpy(new, s, len);
+}
+
+#endif /* !LINUX */