[CRIU] [PATCH 3/6] criu: Add lib-bsd

Dmitry Safonov dima at arista.com
Sun Nov 24 02:46:24 MSK 2019


Provides strlcpy(), strlcat() and optionally setproctitle_init(),
setproctitle().

Get them from loaded in runtime libbsd.so or use home-made criu
versions.

Signed-off-by: Dmitry Safonov <dima at arista.com>
---
 criu/Makefile.crtools        |  2 +-
 criu/cgroup-props.c          |  1 -
 criu/cgroup.c                |  1 -
 criu/cr-dump.c               |  2 +-
 criu/cr-libs.c               |  1 +
 criu/cr-service.c            |  2 +-
 criu/crtools.c               |  2 +-
 criu/include/cr-libs.h       |  3 +-
 criu/include/lib-bsd.h       | 11 +++++++
 criu/include/setproctitle.h  | 19 -----------
 criu/include/string.h        | 20 ------------
 criu/{string.c => lib-bsd.c} | 63 ++++++++++++++++++++++++++++--------
 criu/log.c                   |  2 +-
 criu/net.c                   |  2 +-
 criu/proc_parse.c            |  2 +-
 criu/tun.c                   |  2 +-
 16 files changed, 72 insertions(+), 63 deletions(-)
 create mode 100644 criu/include/lib-bsd.h
 delete mode 100644 criu/include/setproctitle.h
 delete mode 100644 criu/include/string.h
 rename criu/{string.c => lib-bsd.c} (52%)

diff --git a/criu/Makefile.crtools b/criu/Makefile.crtools
index 1833ba77526d..55996c09775b 100644
--- a/criu/Makefile.crtools
+++ b/criu/Makefile.crtools
@@ -38,6 +38,7 @@ obj-y			+= irmap.o
 obj-y			+= kcmp-ids.o
 obj-y			+= kerndat.o
 obj-y			+= libnetlink.o
+obj-y			+= lib-bsd.o
 obj-y			+= log.o
 obj-y			+= lsm.o
 obj-y			+= mem.o
@@ -73,7 +74,6 @@ obj-y			+= sk-tcp.o
 obj-y			+= sk-unix.o
 obj-y			+= sockets.o
 obj-y			+= stats.o
-obj-y			+= string.o
 obj-y			+= sysctl.o
 obj-y			+= sysfs_parse.o
 obj-y			+= timerfd.o
diff --git a/criu/cgroup-props.c b/criu/cgroup-props.c
index ecd95935207b..7fe7196687c2 100644
--- a/criu/cgroup-props.c
+++ b/criu/cgroup-props.c
@@ -14,7 +14,6 @@
 #include "cgroup-props.h"
 #include "cr_options.h"
 #include "xmalloc.h"
-#include "string.h"
 #include "util.h"
 #include "common/list.h"
 #include "log.h"
diff --git a/criu/cgroup.c b/criu/cgroup.c
index a66fc960e6f5..4b7281eb7d2a 100644
--- a/criu/cgroup.c
+++ b/criu/cgroup.c
@@ -20,7 +20,6 @@
 #include "util-pie.h"
 #include "namespaces.h"
 #include "seize.h"
-#include "string.h"
 #include "protobuf.h"
 #include "images/core.pb-c.h"
 #include "images/cgroup.pb-c.h"
diff --git a/criu/cr-dump.c b/criu/cr-dump.c
index 6bdd28400d6b..b12d52f664da 100644
--- a/criu/cr-dump.c
+++ b/criu/cr-dump.c
@@ -38,7 +38,7 @@
 #include "crtools.h"
 #include "cr_options.h"
 #include "servicefd.h"
-#include "string.h"
+#include "lib-bsd.h"
 #include "ptrace-compat.h"
 #include "util.h"
 #include "namespaces.h"
diff --git a/criu/cr-libs.c b/criu/cr-libs.c
index b7da1f847afa..356d807dbb18 100644
--- a/criu/cr-libs.c
+++ b/criu/cr-libs.c
@@ -26,6 +26,7 @@ struct so_desc {
 	unsigned	loaded_major;
 };
 static struct so_desc crlibs[SHARED_LIB_LAST] = {
+{ "libbsd.so", "Can't set title and using self-made strlcpy()", 0 },
 };
 
 static void *try_load_name_version(const char *so_name, const unsigned major)
diff --git a/criu/cr-service.c b/criu/cr-service.c
index 549b3368b3c8..66ec93855d55 100644
--- a/criu/cr-service.c
+++ b/criu/cr-service.c
@@ -41,7 +41,7 @@
 #include "common/scm.h"
 #include "uffd.h"
 
-#include "setproctitle.h"
+#include "lib-bsd.h"
 
 #include "cr-errno.h"
 #include "namespaces.h"
diff --git a/criu/crtools.c b/criu/crtools.c
index 25cce4265cce..aad3da0887f5 100644
--- a/criu/crtools.c
+++ b/criu/crtools.c
@@ -45,7 +45,7 @@
 #include "proc_parse.h"
 #include "kerndat.h"
 
-#include "setproctitle.h"
+#include "lib-bsd.h"
 #include "sysctl.h"
 #include "img-remote.h"
 
diff --git a/criu/include/cr-libs.h b/criu/include/cr-libs.h
index ef6ceca1f64d..de42e4359cd3 100644
--- a/criu/include/cr-libs.h
+++ b/criu/include/cr-libs.h
@@ -6,7 +6,8 @@
 #endif
 
 enum shared_libs {
-	SHARED_LIB_LAST = 0,
+	LIB_BSD = 0,
+	SHARED_LIB_LAST,
 };
 
 /* Called on init to dlopen() all .so libraries */
diff --git a/criu/include/lib-bsd.h b/criu/include/lib-bsd.h
new file mode 100644
index 000000000000..19e593ac37e0
--- /dev/null
+++ b/criu/include/lib-bsd.h
@@ -0,0 +1,11 @@
+#ifndef __CR_LIB_BSD_H__
+#define __CR_LIB_BSD_H__
+
+#include <stddef.h> /* size_t */
+
+extern size_t strlcpy(char *dest, const char *src, size_t size);
+extern size_t strlcat(char *dest, const char *src, size_t count);
+extern void setproctitle_init(int argc, char *argv[], char *envp[]);
+extern void setproctitle(const char *fmt, ...);
+
+#endif /* __CR_LIB_BSD_H__ */
diff --git a/criu/include/setproctitle.h b/criu/include/setproctitle.h
deleted file mode 100644
index bc634331bde4..000000000000
--- a/criu/include/setproctitle.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef __CR_SETPROCTITLE_H__
-#define __CR_SETPROCTITLE_H__
-
-#ifdef CONFIG_HAS_LIBBSD
-#include <bsd/unistd.h>
-#else
-
-/*
- * setproctitle_init is in the libbsd since v0.6.0. This macro allows to
- * compile criu with libbsd<0.6.0.
- */
-#ifndef CONFIG_HAS_SETPROCTITLE_INIT
-#define setproctitle_init(argc, argv, envp)
-#endif
-
-#define setproctitle(fmt, ...)
-#endif
-
-#endif /* __CR_SETPROCTITLE_H__ */
diff --git a/criu/include/string.h b/criu/include/string.h
deleted file mode 100644
index bc5f9d21967a..000000000000
--- a/criu/include/string.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __CR_STRING_H__
-#define __CR_STRING_H__
-
-#include <sys/types.h>
-
-#ifdef CONFIG_HAS_LIBBSD
-# include <bsd/string.h>
-#endif
-
-#include "common/config.h"
-
-#ifndef CONFIG_HAS_STRLCPY
-extern size_t strlcpy(char *dest, const char *src, size_t size);
-#endif
-
-#ifndef CONFIG_HAS_STRLCAT
-extern size_t strlcat(char *dest, const char *src, size_t count);
-#endif
-
-#endif /* __CR_STRING_H__ */
diff --git a/criu/string.c b/criu/lib-bsd.c
similarity index 52%
rename from criu/string.c
rename to criu/lib-bsd.c
index 543c642912c6..0e3fcaf7d2bd 100644
--- a/criu/string.c
+++ b/criu/lib-bsd.c
@@ -1,14 +1,14 @@
-/*
- * Adopted from linux kernel
- */
-#include <sys/types.h>
+#include <stddef.h>
 #include <string.h>
 
-#include "string.h"
+#include "cr-libs.h"
+
+/*
+ * Adopted from Linux kernel
+ */
 
-#ifndef CONFIG_HAS_STRLCPY
 /**
- * strlcpy - Copy a %NUL terminated string into a sized buffer
+ * criu_strlcpy - Copy a %NULL terminated string into a sized buffer
  * @dest: Where to copy the string to
  * @src: Where to copy the string from
  * @size: size of destination buffer
@@ -18,7 +18,7 @@
  * of course, the buffer size is zero). It does not pad
  * out the result like strncpy() does.
  */
-size_t strlcpy(char *dest, const char *src, size_t size)
+static size_t criu_strlcpy(char *dest, const char *src, size_t size)
 {
 	size_t ret = strlen(src);
 
@@ -29,16 +29,14 @@ size_t strlcpy(char *dest, const char *src, size_t size)
 	}
 	return ret;
 }
-#endif
 
-#ifndef CONFIG_HAS_STRLCAT
 /**
- * strlcat - Append a length-limited, %NUL-terminated string to another
+ * criu_strlcat - Append a length-limited, %NULL-terminated string to another
  * @dest: The string to be appended to
  * @src: The string to append to it
  * @count: The size of the destination buffer.
  */
-size_t strlcat(char *dest, const char *src, size_t count)
+static size_t criu_strlcat(char *dest, const char *src, size_t count)
 {
 	size_t dsize = strlen(dest);
 	size_t len = strlen(src);
@@ -57,4 +55,43 @@ size_t strlcat(char *dest, const char *src, size_t count)
 	dest[len] = 0;
 	return res;
 }
-#endif
+
+size_t strlcpy(char *dest, const char *src, size_t size)
+{
+	__typeof__(strlcpy) *f;
+
+	f = shared_libs_lookup_once(LIB_BSD, __func__);
+	if (f)
+		return f(dest, src, size);
+	else
+		return criu_strlcpy(dest, src, size);
+}
+
+size_t strlcat(char *dest, const char *src, size_t count)
+{
+	__typeof__(strlcat) *f;
+
+	f = shared_libs_lookup_once(LIB_BSD, __func__);
+	if (f)
+		return f(dest, src, count);
+	else
+		return criu_strlcat(dest, src, count);
+}
+
+void setproctitle_init(int argc, char *argv[], char *envp[])
+{
+	__typeof__(setproctitle_init) *f;
+
+	f = shared_libs_lookup_once(LIB_BSD, __func__);
+	if (f)
+		f(argc, argv, envp);
+}
+
+void setproctitle(const char *fmt, ...)
+{
+	__typeof__(setproctitle) *f;
+
+	f = shared_libs_lookup_once(LIB_BSD, __func__);
+	if (f)
+		f(fmt);
+}
diff --git a/criu/log.c b/criu/log.c
index 0ee113b91ac2..d259ac2ecb5d 100644
--- a/criu/log.c
+++ b/criu/log.c
@@ -20,7 +20,7 @@
 #include "servicefd.h"
 #include "rst-malloc.h"
 #include "common/lock.h"
-#include "string.h"
+#include "lib-bsd.h"
 #include "version.h"
 
 #include "../soccr/soccr.h"
diff --git a/criu/net.c b/criu/net.c
index 2285ae4032c0..758bac9d9119 100644
--- a/criu/net.c
+++ b/criu/net.c
@@ -35,7 +35,7 @@
 #include "action-scripts.h"
 #include "sockets.h"
 #include "pstree.h"
-#include "string.h"
+#include "lib-bsd.h"
 #include "sysctl.h"
 #include "kerndat.h"
 #include "util.h"
diff --git a/criu/proc_parse.c b/criu/proc_parse.c
index fa7644992b5e..88b0bd8a45ee 100644
--- a/criu/proc_parse.c
+++ b/criu/proc_parse.c
@@ -33,7 +33,7 @@
 #include "cr_options.h"
 #include "sysfs_parse.h"
 #include "seccomp.h"
-#include "string.h"
+#include "lib-bsd.h"
 #include "namespaces.h"
 #include "files-reg.h"
 #include "cgroup.h"
diff --git a/criu/tun.c b/criu/tun.c
index b13148b0b912..0433178b4756 100644
--- a/criu/tun.c
+++ b/criu/tun.c
@@ -12,7 +12,7 @@
 #include "cr_options.h"
 #include "imgset.h"
 #include "protobuf.h"
-#include "string.h"
+#include "lib-bsd.h"
 #include "files.h"
 #include "files-reg.h"
 #include "tun.h"
-- 
2.24.0



More information about the CRIU mailing list