[lxc-devel] [lxc/master] utils: add lxc_iterate_parts()

brauner on Github lxc-bot at linuxcontainers.org
Thu Jul 26 10:59:58 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180726/305ef7c8/attachment.bin>
-------------- next part --------------
From 86cc998177a3fe97f80a12a92c94b47daa981c81 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Thu, 26 Jul 2018 12:43:29 +0200
Subject: [PATCH 1/2] utils: add lxc_iterate_parts()

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/utils.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/lxc/utils.h b/src/lxc/utils.h
index f09bc9018..e708b3d92 100644
--- a/src/lxc/utils.h
+++ b/src/lxc/utils.h
@@ -620,4 +620,9 @@ extern int lxc_set_death_signal(int signal);
 extern int fd_cloexec(int fd, bool cloexec);
 extern int recursive_destroy(char *dirname);
 
+#define lxc_split_string(__iterator, __splitme, __separators)                   \
+	for (char *__p = NULL, *__it = strtok_r(__splitme, __separators, &__p); \
+	     (__iterator = __it);                                               \
+	     __iterator = __it = strtok_r(NULL, __separators, &__p))
+
 #endif /* __LXC_UTILS_H */

From 46a02b970b3ac6745f673b6b1fa2b79ea698e999 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Thu, 26 Jul 2018 12:57:47 +0200
Subject: [PATCH 2/2] cgroups: s/strtok_r()/lxc_iterate_parts()

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/cgroups/cgfsng.c | 33 +++++++++++++++------------------
 src/lxc/utils.h          |  2 +-
 2 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c
index 935b868b9..311a1dfce 100644
--- a/src/lxc/cgroups/cgfsng.c
+++ b/src/lxc/cgroups/cgfsng.c
@@ -274,14 +274,13 @@ static uint32_t *lxc_cpumask(char *buf, size_t nbits)
 	char *token;
 	size_t arrlen;
 	uint32_t *bitarr;
-	char *saveptr = NULL;
 
 	arrlen = BITS_TO_LONGS(nbits);
 	bitarr = calloc(arrlen, sizeof(uint32_t));
 	if (!bitarr)
 		return NULL;
 
-	for (; (token = strtok_r(buf, ",", &saveptr)); buf = NULL) {
+	lxc_iterate_parts(token, buf, ",") {
 		errno = 0;
 		unsigned end, start;
 		char *range;
@@ -728,7 +727,7 @@ static char **cg_hybrid_get_controllers(char **klist, char **nlist, char *line,
 	 */
 	int i;
 	char *dup, *p2, *tok;
-	char *p = line, *saveptr = NULL, *sep = ",";
+	char *p = line, *sep = ",";
 	char **aret = NULL;
 
 	for (i = 0; i < 4; i++) {
@@ -755,16 +754,17 @@ static char **cg_hybrid_get_controllers(char **klist, char **nlist, char *line,
 	*p2 = '\0';
 
 	if (type == CGROUP_SUPER_MAGIC) {
-		/* strdup() here for v1 hierarchies. Otherwise strtok_r() will
-		 * destroy mountpoints such as "/sys/fs/cgroup/cpu,cpuacct".
+		/* strdup() here for v1 hierarchies. Otherwise
+		 * lxc_iterate_parts() will destroy mountpoints such as
+		 * "/sys/fs/cgroup/cpu,cpuacct".
 		 */
 		dup = strdup(p);
 		if (!dup)
 			return NULL;
 
-		for (tok = strtok_r(dup, sep, &saveptr); tok;
-		     tok = strtok_r(NULL, sep, &saveptr))
+		lxc_iterate_parts(tok, dup, sep) {
 			must_append_controller(klist, nlist, &aret, tok);
+		}
 
 		free(dup);
 	}
@@ -786,15 +786,14 @@ static char **cg_unified_make_empty_controller(void)
 static char **cg_unified_get_controllers(const char *file)
 {
 	char *buf, *tok;
-	char *saveptr = NULL, *sep = " \t\n";
+	char *sep = " \t\n";
 	char **aret = NULL;
 
 	buf = read_file(file);
 	if (!buf)
 		return NULL;
 
-	for (tok = strtok_r(buf, sep, &saveptr); tok;
-	     tok = strtok_r(NULL, sep, &saveptr)) {
+	lxc_iterate_parts(tok, buf, sep) {
 		int newentry;
 		char *copy;
 
@@ -878,7 +877,7 @@ static char *copy_to_eol(char *p)
  */
 static bool controller_in_clist(char *cgline, char *c)
 {
-	char *tok, *saveptr = NULL, *eol, *tmp;
+	char *tok, *eol, *tmp;
 	size_t len;
 
 	eol = strchr(cgline, ':');
@@ -890,8 +889,7 @@ static bool controller_in_clist(char *cgline, char *c)
 	memcpy(tmp, cgline, len);
 	tmp[len] = '\0';
 
-	for (tok = strtok_r(tmp, ",", &saveptr); tok;
-	     tok = strtok_r(NULL, ",", &saveptr)) {
+	lxc_iterate_parts(tok, tmp, ",") {
 		if (strcmp(tok, c) == 0)
 			return true;
 	}
@@ -955,7 +953,7 @@ static int get_existing_subsystems(char ***klist, char ***nlist)
 		return -1;
 
 	while (getline(&line, &len, f) != -1) {
-		char *p, *p2, *tok, *saveptr = NULL;
+		char *p, *p2, *tok;
 		p = strchr(line, ':');
 		if (!p)
 			continue;
@@ -977,8 +975,7 @@ static int get_existing_subsystems(char ***klist, char ***nlist)
 			continue;
 		}
 
-		for (tok = strtok_r(p, ",", &saveptr); tok;
-		     tok = strtok_r(NULL, ",", &saveptr)) {
+		lxc_iterate_parts(tok, p, ",") {
 			if (strncmp(tok, "name=", 5) == 0)
 				must_append_string(nlist, tok);
 			else
@@ -2531,13 +2528,13 @@ static bool cg_init(struct cgroup_ops *ops)
 	tmp = lxc_global_config_value("lxc.cgroup.use");
 	if (tmp) {
 		char *chop, *cur, *pin;
-		char *saveptr = NULL;
 
 		pin = must_copy_string(tmp);
 		chop = pin;
 
-		for (; (cur = strtok_r(chop, ",", &saveptr)); chop = NULL)
+		lxc_iterate_parts(cur, chop, ",") {
 			must_append_string(&ops->cgroup_use, cur);
+		}
 
 		free(pin);
 	}
diff --git a/src/lxc/utils.h b/src/lxc/utils.h
index e708b3d92..7d672b777 100644
--- a/src/lxc/utils.h
+++ b/src/lxc/utils.h
@@ -620,7 +620,7 @@ extern int lxc_set_death_signal(int signal);
 extern int fd_cloexec(int fd, bool cloexec);
 extern int recursive_destroy(char *dirname);
 
-#define lxc_split_string(__iterator, __splitme, __separators)                   \
+#define lxc_iterate_parts(__iterator, __splitme, __separators)                  \
 	for (char *__p = NULL, *__it = strtok_r(__splitme, __separators, &__p); \
 	     (__iterator = __it);                                               \
 	     __iterator = __it = strtok_r(NULL, __separators, &__p))


More information about the lxc-devel mailing list