[CRIU] [PATCH 1/7] util: new string helpers introduced

Stanislav Kinsburskiy skinsbursky at virtuozzo.com
Wed Dec 16 07:33:03 PST 2015


This patch brings add_to_string() and construct_string() helpers.
They allow to create a string with variable amount of parameters in sprintf()
manner, but supporting string allocation (and reallocation if necessary)

Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
 include/util.h |    4 ++++
 util.c         |   61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+)

diff --git a/include/util.h b/include/util.h
index df708c8..5030065 100644
--- a/include/util.h
+++ b/include/util.h
@@ -275,4 +275,8 @@ void tcp_nodelay(int sk, bool on);
 void tcp_cork(int sk, bool on);
 
 const char *ns_to_string(unsigned int ns);
+
+char *add_to_string(char *str, const char *fmt, ...);
+char *construct_string(const char *fmt, ...);
+
 #endif /* __CR_UTIL_H__ */
diff --git a/util.c b/util.c
index d56f973..a27b0b6 100644
--- a/util.c
+++ b/util.c
@@ -51,6 +51,67 @@
 
 #define VMA_OPT_LEN	128
 
+static char *add_to_string_vargs(char *str, const char *fmt, va_list args)
+{
+	size_t offset = 0, delta;
+	int ret;
+	char *new;
+	va_list tmp;
+
+	if (str)
+		offset = strlen(str);
+	delta = strlen(fmt) * 2;
+
+	do {
+		ret = -ENOMEM;
+		new = xrealloc(str, offset + delta);
+		if (new) {
+			va_copy(tmp, args);
+			ret = vsnprintf(new + offset, delta, fmt, tmp);
+			if (ret >= delta) {
+				delta = ret +1;
+				str = new;
+				ret = 0;
+			}
+		}
+	} while (ret == 0);
+
+	if (ret == -ENOMEM) {
+		/* realloc failed. We must release former string */
+		pr_err("Failed to allocate string\n");
+		xfree(str);
+	} else if (ret < 0) {
+		/* vsnprintf failed */
+		pr_err("Failed to print string\n");
+		xfree(new);
+		new = NULL;
+	}
+	return new;
+}
+
+char *add_to_string(char *str, const char *fmt, ...)
+{
+	va_list args;
+
+	va_start(args, fmt);
+	str = add_to_string_vargs(str, fmt, args);
+	va_end(args);
+
+	return str;
+}
+
+char *construct_string(const char *fmt, ...)
+{
+	va_list args;
+	char *str;
+
+	va_start(args, fmt);
+	str = add_to_string_vargs(NULL, fmt, args);
+	va_end(args);
+
+	return str;
+}
+
 static void vma_opt_str(const struct vma_area *v, char *opt)
 {
 	int p = 0;



More information about the CRIU mailing list