[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