From: Christian Brauner Date: Fri, 11 May 2018 10:57:51 +0000 (+0200) Subject: strlcpy: add strlcpy() implementation X-Git-Tag: lxc-2.0.10~145 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e9d425abe2bffbf93ca44c0d441df4028833151e;p=thirdparty%2Flxc.git strlcpy: add strlcpy() implementation Signed-off-by: Christian Brauner --- diff --git a/configure.ac b/configure.ac index b0d7112e6..a0eeac84d 100644 --- a/configure.ac +++ b/configure.ac @@ -672,6 +672,10 @@ AC_CHECK_FUNCS([fgetln], AM_CONDITIONAL(HAVE_FGETLN, true) AC_DEFINE(HAVE_FGETLN,1,[Have fgetln]), AM_CONDITIONAL(HAVE_FGETLN, false)) +AC_CHECK_FUNCS([strlcpy], + AM_CONDITIONAL(HAVE_STRLCPY, true) + AC_DEFINE(HAVE_STRLCPY,1,[Have strlcpy]), + AM_CONDITIONAL(HAVE_STRLCPY, false)) # Check for some libraries AX_PTHREAD diff --git a/src/include/strlcpy.c b/src/include/strlcpy.c new file mode 100644 index 000000000..7be64c817 --- /dev/null +++ b/src/include/strlcpy.c @@ -0,0 +1,61 @@ +/* liblxcapi + * + * Copyright © 2018 Christian Brauner . + * Copyright © 2018 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This function has been copied from musl. + */ + +#include +#include +#include + +#define ALIGN (sizeof(size_t) - 1) +#define ONES ((size_t)-1 / UCHAR_MAX) +#define HIGHS (ONES * (UCHAR_MAX / 2 + 1)) +#define HASZERO(x) (((x)-ONES) & ~(x)&HIGHS) + +size_t strlcpy(char *d, const char *s, size_t n) +{ + char *d0 = d; + size_t *wd; + const size_t *ws; + + if (!n--) + goto finish; + + if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) { + for (; ((uintptr_t)s & ALIGN) && n && (*d = *s); n--, s++, d++) + ; + if (n && *s) { + wd = (void *)d; + ws = (const void *)s; + for (; n >= sizeof(size_t) && !HASZERO(*ws); + n -= sizeof(size_t), ws++, wd++) + *wd = *ws; + d = (void *)wd; + s = (const void *)ws; + } + } + + for (; n && (*d = *s); n--, s++, d++) + ; + + *d = 0; + +finish: + return d - d0 + strlen(s); +} diff --git a/src/include/strlcpy.h b/src/include/strlcpy.h new file mode 100644 index 000000000..419cecf38 --- /dev/null +++ b/src/include/strlcpy.h @@ -0,0 +1,29 @@ +/* liblxcapi + * + * Copyright © 2018 Christian Brauner . + * Copyright © 2018 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This function has been copied from musl. + */ + +#ifndef _STRLCPY_H +#define _STRLCPY_H + +#include + +extern size_t strlcpy(char *, const char *, size_t); + +#endif diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am index a8abe67a9..1b10d6f63 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -144,6 +144,10 @@ liblxc_la_SOURCES += ../include/getline.c ../include/getline.h endif endif +if !HAVE_STRLCPY +liblxc_la_SOURCES += ../include/strlcpy.c ../include/strlcpy.h +endif + AM_CFLAGS=-DLXCROOTFSMOUNT=\"$(LXCROOTFSMOUNT)\" \ -DLXCPATH=\"$(LXCPATH)\" \ -DLXC_GLOBAL_CONF=\"$(LXC_GLOBAL_CONF)\" \ @@ -296,6 +300,10 @@ init_lxc_static_SOURCES += ../include/getline.c endif endif +if !HAVE_STRLCPY +init_lxc_static_SOURCES += ../include/strlcpy.c ../include/strlcpy.h +endif + init_lxc_static_LDFLAGS = -all-static init_lxc_static_LDADD = @CAP_LIBS@ init_lxc_static_CFLAGS = $(AM_CFLAGS) -DNO_LXC_CONF