strlcpy: add strlcpy() implementation

parent db421960
...@@ -672,6 +672,10 @@ AC_CHECK_FUNCS([fgetln], ...@@ -672,6 +672,10 @@ AC_CHECK_FUNCS([fgetln],
AM_CONDITIONAL(HAVE_FGETLN, true) AM_CONDITIONAL(HAVE_FGETLN, true)
AC_DEFINE(HAVE_FGETLN,1,[Have fgetln]), AC_DEFINE(HAVE_FGETLN,1,[Have fgetln]),
AM_CONDITIONAL(HAVE_FGETLN, false)) 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 # Check for some libraries
AX_PTHREAD AX_PTHREAD
......
/* liblxcapi
*
* Copyright © 2018 Christian Brauner <christian@brauner.io>.
* 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 <limits.h>
#include <stdint.h>
#include <string.h>
#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);
}
/* liblxcapi
*
* Copyright © 2018 Christian Brauner <christian@brauner.io>.
* 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 <stdio.h>
extern size_t strlcpy(char *, const char *, size_t);
#endif
...@@ -144,6 +144,10 @@ liblxc_la_SOURCES += ../include/getline.c ../include/getline.h ...@@ -144,6 +144,10 @@ liblxc_la_SOURCES += ../include/getline.c ../include/getline.h
endif endif
endif endif
if !HAVE_STRLCPY
liblxc_la_SOURCES += ../include/strlcpy.c ../include/strlcpy.h
endif
AM_CFLAGS=-DLXCROOTFSMOUNT=\"$(LXCROOTFSMOUNT)\" \ AM_CFLAGS=-DLXCROOTFSMOUNT=\"$(LXCROOTFSMOUNT)\" \
-DLXCPATH=\"$(LXCPATH)\" \ -DLXCPATH=\"$(LXCPATH)\" \
-DLXC_GLOBAL_CONF=\"$(LXC_GLOBAL_CONF)\" \ -DLXC_GLOBAL_CONF=\"$(LXC_GLOBAL_CONF)\" \
...@@ -296,6 +300,10 @@ init_lxc_static_SOURCES += ../include/getline.c ...@@ -296,6 +300,10 @@ init_lxc_static_SOURCES += ../include/getline.c
endif endif
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_LDFLAGS = -all-static
init_lxc_static_LDADD = @CAP_LIBS@ init_lxc_static_LDADD = @CAP_LIBS@
init_lxc_static_CFLAGS = $(AM_CFLAGS) -DNO_LXC_CONF init_lxc_static_CFLAGS = $(AM_CFLAGS) -DNO_LXC_CONF
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment