[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