[CRIU] [PATCH 4/5] add init_work_dir

Ruslan Kuprieiev kupruser at gmail.com
Tue Nov 12 13:43:00 PST 2013


Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
---
 cr-service.c   |  5 +++++
 crtools.c      | 10 ++++++++++
 include/util.h |  2 ++
 util.c         | 25 +++++++++++++++++++++++++
 4 files changed, 42 insertions(+)

diff --git a/cr-service.c b/cr-service.c
index 92ccd66..58f765a 100644
--- a/cr-service.c
+++ b/cr-service.c
@@ -127,6 +127,11 @@ static int setup_opts_from_req(int sk, CriuOpts *req)
 	log_closedir();
 
 	/* initiate log file in imgs dir */
+	if (init_work_dir(NULL) < 0) {
+		pr_perror("Can't set work directory");
+		return -1;
+	}
+
 	if (req->log_file)
 		opts.output = req->log_file;
 	else
diff --git a/crtools.c b/crtools.c
index b9313b1..136d3fc 100644
--- a/crtools.c
+++ b/crtools.c
@@ -79,6 +79,7 @@ int main(int argc, char *argv[])
 	int opt, idx;
 	int log_level = 0;
 	char *imgs_dir = ".";
+	char *work_dir = NULL;
 
 	BUILD_BUG_ON(PAGE_SIZE != PAGE_IMAGE_SIZE);
 
@@ -167,6 +168,7 @@ int main(int argc, char *argv[])
 			imgs_dir = optarg;
 			break;
 		case 'W':
+			work_dir = optarg;
 			break;
 		case 'o':
 			opts.output = optarg;
@@ -280,6 +282,14 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	if (!work_dir)
+		work_dir = imgs_dir;
+
+	if (init_work_dir(work_dir) < 0) {
+		pr_perror("Can't initiate work directory");
+		return -1;
+	}
+
 	if (chdir(imgs_dir)) {
 		pr_perror("Can't change directory to %s", optarg);
 		return -1;
diff --git a/include/util.h b/include/util.h
index 72a79e9..5bc9557 100644
--- a/include/util.h
+++ b/include/util.h
@@ -289,4 +289,6 @@ extern int read_fd_link(int lfd, char *buf, size_t size);
 #define USEC_PER_SEC	1000000L
 #define NSEC_PER_SEC    1000000000L
 
+extern int init_work_dir(char *work_dir);
+
 #endif /* __CR_UTIL_H__ */
diff --git a/util.c b/util.c
index 0b10f0d..23a3148 100644
--- a/util.c
+++ b/util.c
@@ -571,3 +571,28 @@ out:
 
 	return ret;
 }
+
+int init_work_dir(char *work_dir)
+{
+	int dfd, ret;
+
+	if (work_dir) {
+		dfd = open(work_dir, O_RDONLY);
+		if (dfd < 0) {
+			pr_perror("Can't open work directory %s", work_dir);
+			return -1;
+		}
+	} else {
+		dfd = open(".", O_RDONLY);
+		if (dfd < 0) {
+			pr_perror("Can't open current directory %s", work_dir);
+			return -1;
+		}
+	}
+
+	ret = install_service_fd(WORK_DIR_FD_OFF, dfd);
+
+	close(dfd);
+
+	return ret;
+}
-- 
1.8.1.2



More information about the CRIU mailing list