[CRIU] [PATCH 1/3]v3 libcriu: criu_dump_me() and library header

Andrew Vagin avagin at parallels.com
Fri Aug 30 03:37:58 EDT 2013


On Thu, Aug 29, 2013 at 11:08:23PM +0400, Ruslan Kuprieiev wrote:
> Hi!
> 
> Patch 1\3 contains criu_dump_me() for library and library header.
>        -- criu_dump_me() gets an argument of  type struct criu_dump_args
> from user program,
>          processes it and sends request to criu through unix domain
> socket.
>          Then, it gets flag from criu and returns it back to program.
>        -- libcriu.h contains definitions of flags, struct
> criu_dump_args etc.
>           So, it is to be used in user program.

Do we want to invent own RPC?

http://en.wikipedia.org/wiki/Remote_procedure_call

Can we use something well-known, which has bindings for all popular
languages?

> 
> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>

> commit 17391d2dad4ec7a1cb2505dd47e47f488651ca5e
> Author: Kuprieiev Ruslan <kupruser at gmail.com>
> Date:   Thu Aug 29 22:20:56 2013 +0400
> 
>     -------------------------
> 
> diff --git a/include/libcriu.h b/include/libcriu.h
> new file mode 100644
> index 0000000..3f4ccf7
> --- /dev/null
> +++ b/include/libcriu.h
> @@ -0,0 +1,25 @@
> +#ifndef __CRIU_LIB__
> +#define __CRIU_LIB__
> +
> +#define CR_DEFAULT_SERVICE_ADDRESS "/tmp/criu_service.socket"
> +
> +/* dump flags for struct criu_dump_args */
> +#define CRIU_DUMP_AND_CONTINUE 1
> +
> +/* return codes */
> +#define CRIU_DUMP_FAIL -1
> +#define CRIU_RESUME 1		/* when program is restored */
> +#define CRIU_DUMP_SUCCESS 0	/* when CRIU_DUMP_AND_CONTINUE is set */
> +
> +struct criu_dump_args {
> +	/* opened dir fd for images. must be set*/
> +	int			images_dir_fd;
> +	/* dump flags. see macros above. */
> +	unsigned long		flags;
> +	/* sock path. CR_DEFAULT_SERVICE_ADDRESS by def */
> +	char			*service_addr;
> +};
> +
> +int criu_dump_me(struct criu_dump_args *arg);
> +
> +#endif
> diff --git a/lib/criu.c b/lib/criu.c
> index be629d9..e5a42ef 100644
> --- a/lib/criu.c
> +++ b/lib/criu.c
> @@ -1,3 +1,80 @@
> +#include <unistd.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <errno.h>
> +#include <string.h>
> +#include <sys/types.h>
> +#include <sys/socket.h>
> +#include <sys/un.h>
> +#include <stdint.h>
> +#include <stdbool.h>
> +
> +#include "libcriu.h"
>  #include "version.h"
> +#include "util-pie.h"
>  
>  const char *criu_lib_version = version;
> +
> +static int criu_send_dump_arg(int socket_fd, struct criu_dump_args *arg)
> +{
> +	if (send_fd(socket_fd, NULL, 0, arg->images_dir_fd) == -1) {
> +		perror("Can't send file descriptor");
> +		return -1;
> +	}
> +
> +	if (send(socket_fd, &(arg->flags), sizeof(arg->flags), 0) == -1) {
> +		perror("Can't send flags");
> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
> +int criu_dump_me(struct criu_dump_args *arg)
> +{
> +	int socket_fd;
> +	int ret, c;
> +	struct sockaddr_un server_addr;
> +	socklen_t server_addr_len;
> +
> +	socket_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
> +	if (socket_fd == -1) {
> +		perror("Can't create socket");
> +		return CRIU_DUMP_FAIL;
> +	}
> +
> +	memset(&server_addr, 0, sizeof(server_addr));
> +	server_addr.sun_family = AF_LOCAL;
> +
> +	if (!arg->service_addr)
> +		arg->service_addr = CR_DEFAULT_SERVICE_ADDRESS;
> +
> +	strcpy(server_addr.sun_path, arg->service_addr);
> +
> +	server_addr_len = strlen(server_addr.sun_path)
> +			+ sizeof(server_addr.sun_family);
> +
> +	if (connect(socket_fd, (struct sockaddr *) &server_addr,
> +						server_addr_len) != 0) {
> +		perror("Can't connect to service socket");
> +		goto err;
> +	}
> +
> +	if (criu_send_dump_arg(socket_fd, arg) == -1) {
> +		perror("Can't send dump arg");
> +		goto err;
> +	}
> +
> +	/* getting flag from criu */
> +	c = read(socket_fd, &ret, sizeof(ret));
> +	if (c == -1)
> +		goto err;
> +
> +	close(socket_fd);
> +	return ret;
> +
> +err:
> +	close(socket_fd);
> +	return CRIU_DUMP_FAIL;
> +}
> +

> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu



More information about the CRIU mailing list