private strndup() implementation in case libc does not provide it

This commit is contained in:
Federico G. Schwindt 2013-08-26 10:47:04 +01:00
parent 086cf3a272
commit 6ac5a82eec
4 changed files with 43 additions and 2 deletions

View File

@ -188,7 +188,7 @@ AC_CHECK_FUNCS([ \
# Optional functions
AC_CHECK_FUNCS_ONCE([ \
gai_strerror getaddrinfo getnameinfo inet_aton sigaction sigprocmask \
snprintf vsnprintf strdup strlcpy strlcat strtok_r waitpid])
snprintf vsnprintf strdup strndup strlcpy strlcat strtok_r waitpid])
# -- Configuration options --

View File

@ -15,7 +15,7 @@ EXTRA_DIST = Makefile.ng
noinst_LIBRARIES = libngportab.a
libngportab_a_SOURCES = strdup.c strlcpy.c strtok_r.c vsnprintf.c waitpid.c
libngportab_a_SOURCES = strdup.c strndup.c strlcpy.c strtok_r.c vsnprintf.c waitpid.c
check_PROGRAMS = portabtest

View File

@ -157,6 +157,10 @@ extern size_t strlcpy PARAMS(( char *dst, const char *src, size_t size ));
extern char * strdup PARAMS(( const char *s ));
#endif
#ifndef HAVE_STRNDUP
extern char * strndup PARAMS((const char *s, size_t maxlen));
#endif
#ifndef HAVE_STRTOK_R
extern char * strtok_r PARAMS((char *str, const char *delim, char **saveptr));
#endif

37
src/portab/strndup.c Normal file
View File

@ -0,0 +1,37 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
*/
#include "portab.h"
/**
* @file
* strndup() implementation. Public domain.
*/
#ifndef HAVE_STRNDUP
#include "imp.h"
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include "exp.h"
GLOBAL char *
strndup(const char *s, size_t maxlen)
{
char *dup;
size_t len = strlen(s);
if (len > maxlen)
len = maxlen;
len++;
dup = malloc(len);
if (dup)
strlcpy(dup, s, len);
return dup;
}
#endif