]> git.proxmox.com Git - mirror_lxc.git/commitdiff
strlcpy: add strlcpy() implementation
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 11 May 2018 10:57:51 +0000 (12:57 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sat, 12 May 2018 14:53:54 +0000 (16:53 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
configure.ac
src/include/strlcpy.c [new file with mode: 0644]
src/include/strlcpy.h [new file with mode: 0644]
src/lxc/Makefile.am

index 2467bb54d23aa7248ae5147bdb4344a660905613..91e51d3245ee2ff8ae2564d6a14ec0379d829810 100644 (file)
@@ -620,6 +620,10 @@ AC_CHECK_FUNCS([prlimit64],
        AM_CONDITIONAL(HAVE_PRLIMIT64, true)
        AC_DEFINE(HAVE_PRLIMIT64,1,[Have prlimit64]),
        AM_CONDITIONAL(HAVE_PRLIMIT64, 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 (file)
index 0000000..7be64c8
--- /dev/null
@@ -0,0 +1,61 @@
+/* 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);
+}
diff --git a/src/include/strlcpy.h b/src/include/strlcpy.h
new file mode 100644 (file)
index 0000000..419cecf
--- /dev/null
@@ -0,0 +1,29 @@
+/* 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
index f894b7925ebd9ddcefbda53705ccf4779ce5e53c..923c43cabe9818b18cdad9faa0b3a5c1f591e8b9 100644 (file)
@@ -151,6 +151,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)\" \
@@ -300,6 +304,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