[1/8] zdtm: Make write_map() a part of lib

Submitted by Kirill Tkhai on June 28, 2017, 11:48 a.m.

Details

Message ID 149865049198.12218.9932058168269459157.stgit@localhost.localdomain
State New
Series "One-level leaked net_ns support"
Headers show

Commit Message

Kirill Tkhai June 28, 2017, 11:48 a.m.
It's implemented and used in many places,
so extract the code to library function.

Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 test/zdtm/lib/ns.c                    |   50 +++++++++++++++++----------------
 test/zdtm/lib/ns.h                    |    1 +
 test/zdtm/static/pidns01.c            |   25 +----------------
 test/zdtm/static/userns-leaked-sock.c |   23 +--------------
 test/zdtm/static/userns00.c           |   31 +++-----------------
 test/zdtm/static/userns01.c           |   23 +--------------
 6 files changed, 36 insertions(+), 117 deletions(-)

Patch hide | download patch | download mbox

diff --git a/test/zdtm/lib/ns.c b/test/zdtm/lib/ns.c
index 7a0949f22..ccf18be13 100644
--- a/test/zdtm/lib/ns.c
+++ b/test/zdtm/lib/ns.c
@@ -19,6 +19,29 @@ 
 #include "zdtmtst.h"
 #include "ns.h"
 
+int write_map(pid_t pid, const char *file, const char *map)
+{
+	char path[PATH_MAX];
+	int fd, ret;
+
+	sprintf(path, "/proc/%d/%s", pid, file);
+	fd = open(path, O_WRONLY);
+	if (fd < 0) {
+		fail("Can't open");
+		return -1;
+	}
+	ret = strlen(map);
+	ret -= write(fd, map, ret);
+	if (ret) {
+		fail("Can't write");
+		close(fd);
+		return -1;
+	}
+	close(fd);
+
+	return 0;
+}
+
 extern int pivot_root(const char *new_root, const char *put_old);
 static int prepare_mntns(void)
 {
@@ -384,32 +407,11 @@  void ns_create(int argc, char **argv)
 	close(args.status_pipe[1]);
 
 	if (flags & CLONE_NEWUSER) {
-		char pname[PATH_MAX];
-		int fd;
-
-		snprintf(pname, sizeof(pname), "/proc/%d/uid_map", pid);
-		fd = open(pname, O_WRONLY);
-		if (fd < 0) {
-			fprintf(stderr, "open(%s): %m\n", pname);
-			exit(1);
-		}
-		if (write(fd, UID_MAP, sizeof(UID_MAP)) < 0) {
-			fprintf(stderr, "write(" UID_MAP "): %m\n");
+		if (write_map(pid, "uid_map", UID_MAP) ||
+		    write_map(pid, "gid_map", GID_MAP)) {
+			fprintf(stderr, "Can't setup maps: %m\n");
 			exit(1);
 		}
-		close(fd);
-
-		snprintf(pname, sizeof(pname), "/proc/%d/gid_map", pid);
-		fd = open(pname, O_WRONLY);
-		if (fd < 0) {
-			fprintf(stderr, "open(%s): %m\n", pname);
-			exit(1);
-		}
-		if (write(fd, GID_MAP, sizeof(GID_MAP)) < 0) {
-			fprintf(stderr, "write(" GID_MAP "): %m\n");
-			exit(1);
-		}
-		close(fd);
 	}
 	shutdown(args.status_pipe[0], SHUT_WR);
 
diff --git a/test/zdtm/lib/ns.h b/test/zdtm/lib/ns.h
index 23378bc60..846c50841 100644
--- a/test/zdtm/lib/ns.h
+++ b/test/zdtm/lib/ns.h
@@ -8,6 +8,7 @@  extern char *pidfile;
 
 extern void ns_create(int argc, char **argv);
 extern int ns_init(int argc, char **argv);
+extern int write_map(pid_t pid, const char *file, const char *map);
 
 extern void test_waitsig(void);
 extern void parseargs(int, char **);
diff --git a/test/zdtm/static/pidns01.c b/test/zdtm/static/pidns01.c
index 70137edc4..dba02e918 100644
--- a/test/zdtm/static/pidns01.c
+++ b/test/zdtm/static/pidns01.c
@@ -16,6 +16,7 @@ 
 
 #include "zdtmtst.h"
 #include "lock.h"
+#include "ns.h"
 /*
 	parent (pid_ns1, user_ns1)
 	  |
@@ -54,28 +55,6 @@  int child_fn(void *unused)
 	return pid == getpid() ? 0 : 1;
 }
 
-int write_map(pid_t pid, char *map)
-{
-	char path[PATH_MAX];
-	int fd, ret;
-
-	sprintf(path, "/proc/%d/%s", pid, map);
-	fd = open(path, O_WRONLY);
-	if (fd < 0) {
-		fail("Can't open");
-		return -1;
-	}
-	ret = write(fd, "0 0 1\n", 6);
-	if (ret != 6) {
-		fail("Can't write");
-		close(fd);
-		return -1;
-	}
-	close(fd);
-
-	return 0;
-}
-
 int __get_ns_id(int fd, unsigned int *id)
 {
 	struct stat st;
@@ -122,7 +101,7 @@  int main(int argc, char **argv)
 		return 1;
 	}
 
-	if (write_map(pid, "uid_map") || write_map(pid, "gid_map")) {
+	if (write_map(pid, "uid_map", "0 0 1") || write_map(pid, "gid_map", "0 0 1")) {
 		fail("write map");
 		goto err;
 	}
diff --git a/test/zdtm/static/userns-leaked-sock.c b/test/zdtm/static/userns-leaked-sock.c
index 5f4e9145f..f62c4ff6d 100644
--- a/test/zdtm/static/userns-leaked-sock.c
+++ b/test/zdtm/static/userns-leaked-sock.c
@@ -13,6 +13,7 @@ 
 #include <sys/un.h>
 
 #include "zdtmtst.h"
+#include "ns.h"
 #include "lock.h"
 
 const char *test_doc	= "Check that restorer for sockets is choosed right in dependence of net_ns->user_ns";
@@ -28,28 +29,6 @@  enum {
 
 futex_t *futex;
 
-int write_map(pid_t pid, char *file, char *map)
-{
-	char path[PATH_MAX];
-	int fd, ret;
-
-	sprintf(path, "/proc/%d/%s", pid, file);
-	fd = open(path, O_WRONLY);
-	if (fd < 0) {
-		fail("Can't open");
-		return -1;
-	}
-	ret = write(fd, map, strlen(map));
-	if (ret != strlen(map)) {
-		fail("Can't write");
-		close(fd);
-		return -1;
-	}
-	close(fd);
-
-	return 0;
-}
-
 int child_fn(void *arg)
 {
 	int ret = 1, sk = -1, orig_sk = (int)(long)arg;
diff --git a/test/zdtm/static/userns00.c b/test/zdtm/static/userns00.c
index 1b6f5c13b..45dcf443e 100644
--- a/test/zdtm/static/userns00.c
+++ b/test/zdtm/static/userns00.c
@@ -14,6 +14,7 @@ 
 #include <dirent.h>
 
 #include "zdtmtst.h"
+#include "ns.h"
 #include "lock.h"
 
 /*
@@ -70,28 +71,6 @@  int get_user_ns(pid_t pid, unsigned int *ns_id)
 	return 0;
 }
 
-int write_map(pid_t pid, char *map)
-{
-	char path[PATH_MAX];
-	int fd, ret;
-
-	sprintf(path, "/proc/%d/%s", pid, map);
-	fd = open(path, O_WRONLY);
-	if (fd < 0) {
-		fail("Can't open");
-		return -1;
-	}
-	ret = write(fd, "0 0 1\n", 6);
-	if (ret != 6) {
-		fail("Can't write");
-		close(fd);
-		return -1;
-	}
-	close(fd);
-
-	return 0;
-}
-
 /* Child1 creates its own namespace */
 int child1(void)
 {
@@ -107,8 +86,8 @@  int child1(void)
 	futex_set_and_wake(futex, CHILD1_CREATED);
 	futex_wait_while_lt(futex, GRAND_CHILD_CREATED);
 
-	if (write_map(*grand_child_pid, "uid_map") < 0 ||
-	    write_map(*grand_child_pid, "gid_map") < 0) {
+	if (write_map(*grand_child_pid, "uid_map", "0 0 1") < 0 ||
+	    write_map(*grand_child_pid, "gid_map", "0 0 1") < 0) {
 		fail("write map");
 		futex_set_and_wake(futex, EMERGENCY_ABORT);
 		return 2;
@@ -242,8 +221,8 @@  int main(int argc, char **argv)
 
 	futex_wait_while_lt(futex, CHILD1_CREATED);
 
-	if (write_map(pid1, "uid_map") < 0 ||
-	    write_map(pid1, "gid_map") < 0) {
+	if (write_map(pid1, "uid_map", "0 0 1") < 0 ||
+	    write_map(pid1, "gid_map", "0 0 1") < 0) {
 		fail("write map");
 		goto err;
 	}
diff --git a/test/zdtm/static/userns01.c b/test/zdtm/static/userns01.c
index 8e4401eca..91eca047c 100644
--- a/test/zdtm/static/userns01.c
+++ b/test/zdtm/static/userns01.c
@@ -17,6 +17,7 @@ 
 
 #include "zdtmtst.h"
 #include "lock.h"
+#include "ns.h"
 
 const char *test_doc	= "Check UID and GID in unshared userns remains the same";
 const char *test_author	= "Kirill Tkhai <ktkhai@virtuozzo.com>";
@@ -44,28 +45,6 @@  enum {
 gid_t gid_list[] = {3, 14, 15, 92}; /* Must be sorted */
 futex_t *futex;
 
-int write_map(pid_t pid, char *file, char *map)
-{
-	char path[PATH_MAX];
-	int fd, ret;
-
-	sprintf(path, "/proc/%d/%s", pid, file);
-	fd = open(path, O_WRONLY);
-	if (fd < 0) {
-		fail("Can't open");
-		return -1;
-	}
-	ret = write(fd, map, strlen(map));
-	if (ret != strlen(map)) {
-		fail("Can't write");
-		close(fd);
-		return -1;
-	}
-	close(fd);
-
-	return 0;
-}
-
 int compare_int(const void *a, const void *b)
 {
 	const int *x = a, *y = b;