[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