[CRIU] [PATCH 7/8] lib: add dump/restore
Andrew Vagin
avagin at parallels.com
Wed Dec 4 02:18:27 PST 2013
On Wed, Dec 04, 2013 at 02:57:30PM +0400, Ruslan Kuprieiev wrote:
>
> 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)
> +{
I don't like that we return "CriuResp **resp" to users.
> + 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
>
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list