[CRIU] [PATCH 7/8] lib: add dump/restore

Ruslan Kuprieiev kupruser at gmail.com
Wed Dec 4 02:57:30 PST 2013


Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
---
 lib/criu.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++----------------
 lib/criu.h |  3 +++
 2 files changed, 49 insertions(+), 16 deletions(-)

diff --git a/lib/criu.c b/lib/criu.c
index 75abe10..845ea42 100644
--- a/lib/criu.c
+++ b/lib/criu.c
@@ -93,12 +93,10 @@ static int criu_connect(void)
 	return fd;
 }
 
-int criu_check(void)
+static int exchange(CriuReq *req, CriuResp **resp)
 {
 	int fd;
 	int ret	= 0;
-	CriuReq req	= CRIU_REQ__INIT;
-	CriuResp *resp	= NULL;
 
 	fd = criu_connect();
 	if (fd < 0) {
@@ -107,34 +105,66 @@ int criu_check(void)
 		goto exit;
 	}
 
-	req.type	= CRIU_REQ_TYPE__CHECK;
-
-	if (send_req(fd, &req) < 0) {
+	if (send_req(fd, req) < 0) {
 		ret = CRIU_EREQ;
 		goto exit;
 	}
 
-	resp = recv_resp(fd);
-	if (!resp) {
+	*resp = recv_resp(fd);
+	if (!*resp) {
 		perror("Can't receive response");
 		ret = CRIU_ERESP;
 		goto exit;
 	}
 
-	if (resp->type != CRIU_REQ_TYPE__CHECK) {
-		perror("Unexpected response type");
-		ret = CRIU_ERESP;
+	if ((*resp)->type != req->type) {
+		if ((*resp)->type == CRIU_REQ_TYPE__EMPTY)
+			ret = CRIU_EREQ;
+		else {
+			perror("Unexpected response type");
+			ret = CRIU_ERESP;
+		}
 		goto exit;
 	}
 
-	if (!resp->success)
-		ret = CRIU_ECHECK;
-
 exit:
 	if (fd > 0)
 		close(fd);
-	if (resp)
-		free(resp);
 
 	return ret;
 }
+
+int criu_check(void)
+{
+	int ret;
+	CriuReq req	= CRIU_REQ__INIT;
+	CriuResp *resp	= NULL;
+
+	req.type	= CRIU_REQ_TYPE__CHECK;
+
+	ret = exchange(&req, &resp);
+	if (ret < 0)
+		return ret;
+
+	return resp->success ? 0 : CRIU_ECHECK;
+}
+
+int criu_dump(CriuOpts *opts, CriuResp **resp)
+{
+	CriuReq req	= CRIU_REQ__INIT;
+
+	req.type	= CRIU_REQ_TYPE__DUMP;
+	req.opts	= opts;
+
+	return exchange(&req, resp);
+}
+
+int criu_restore(CriuOpts *opts, CriuResp **resp)
+{
+	CriuReq req	= CRIU_REQ__INIT;
+
+	req.type	= CRIU_REQ_TYPE__RESTORE;
+	req.opts	= opts;
+
+	return exchange(&req, resp);
+}
diff --git a/lib/criu.h b/lib/criu.h
index 02939d3..5b50670 100644
--- a/lib/criu.h
+++ b/lib/criu.h
@@ -1,10 +1,13 @@
 #ifndef __CRIU_LIB_H__
 #define __CRIU_LIB_H__
 
+#include <stdbool.h>
 #include "rpc.pb-c.h"
 
 void criu_set_service_address(char *path);
 int criu_check(void);
+int criu_dump(CriuOpts *opts, CriuResp **resp);
+int criu_restore(CriuOpts *opts, CriuResp **resp);
 
 #define CRIU_ECONNECT	-1
 #define CRIU_EREQ	-2
-- 
1.8.1.2



More information about the CRIU mailing list