[CRIU] [PATCH 4/4] service: add check request support
Pavel Emelyanov
xemul at parallels.com
Mon Nov 18 01:16:37 PST 2013
On 11/16/2013 05:00 AM, Ruslan Kuprieiev wrote:
Write comment about what this request checks as if you were writing a
documentation for it.
> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
> ---
> cr-service.c | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 116 insertions(+)
>
> diff --git a/cr-service.c b/cr-service.c
> index 65710fd..c2e4a3e 100644
> --- a/cr-service.c
> +++ b/cr-service.c
> @@ -12,12 +12,16 @@
> #include <sys/un.h>
> #include <sys/wait.h>
> #include <sys/stat.h>
> +#include <fcntl.h>
>
> #include "crtools.h"
> #include "cr_options.h"
> #include "util.h"
> #include "log.h"
> #include "pstree.h"
> +#include "proc_parse.h"
> +#include "protobuf.h"
> +#include "protobuf/creds.pb-c.h"
> #include "cr-service.h"
>
> unsigned int service_sk_ino = -1;
> @@ -217,6 +221,116 @@ exit:
> return success ? 0 : 1;
> }
>
> +static int can_dump(int pid)
> +{
> + struct proc_status_creds creds;
> + int ret;
> +
> + ret = parse_pid_status(pid, &creds);
> + if (ret < 0) {
> + pr_perror("Can't get task stat");
> + return -1;
> + }
> +
> + if (!may_dump(&creds)) {
> + pr_perror("Have no rights to dump task %d", pid);
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +static int can_restore(void)
> +{
> + char path[PATH_MAX];
> + struct stat s;
> + CredsEntry *ce;
> + int fd;
> +
> + if (check_img_inventory() < 0) {
> + pr_perror("Something wrong with images");
> + return -1;
> + }
> +
> + if (prepare_task_entries()) {
> + pr_perror("Can't prepare task ent");
> + return -1;
> + }
> +
> + if (read_pstree_image()) {
> + pr_perror("Can't read pstree image");
> + return -1;
> + }
> +
> + sprintf(path, "/proc/%d", root_item->pid.real);
> + if (stat(path, &s)) {
> + if (errno != ENOENT)
> + return -1;
> + } else {
> + pr_perror("Process %d exists", root_item->pid.real);
> + return -1;
> + }
> +
> + fd = open_image(CR_FD_CREDS, O_RSTR, root_item->pid.virt);
> + if (fd < 0)
> + return -1;
> +
> + if (pb_read_one(fd, &ce, PB_CREDS) < 0)
> + return -1;
> +
> + close_safe(&fd);
> +
> + if (!may_restore(ce)) {
> + pr_perror("Have no rights to restore task");
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +static int check_using_req(int sk, CriuOpts *req)
> +{
> + bool success = false;
> + CriuResp msg = CRIU_RESP__INIT;
> + CriuCheckResp resp = CRIU_CHECK_RESP__INIT;
> +
> + if (setup_opts_from_req(sk, req) == -1) {
> + pr_perror("Arguments treating fail");
> + goto exit;
> + }
> +
> + resp.kernel = true;
> + if (cr_check()) {
> + pr_perror("The kernel support isn't up-to-date");
> + resp.kernel = false;
> + }
> +
> + resp.dump = true;
> + if (can_dump(req->pid)) {
> + pr_perror("Can't dump process %d", req->pid);
> + resp.dump = false;
> + }
> +
> + resp.restore = true;
> + if (can_restore()) {
> + pr_perror("Can't restore process");
> + resp.restore = false;
> + }
> +
> + success = true;
> +exit:
> + msg.type = CRIU_REQ_TYPE__CHECK;
> + msg.success = success;
> + msg.check = &resp;
> +
> + if (send_criu_msg(sk, &msg) == -1) {
> + pr_perror("Can't send response");
> + success = false;
> + }
> +
> + return success ? 0 : 1;
> +}
> +
> static int cr_service_work(int sk)
> {
> CriuReq *msg = 0;
> @@ -233,6 +347,8 @@ static int cr_service_work(int sk)
> return dump_using_req(sk, msg->opts);
> case CRIU_REQ_TYPE__RESTORE:
> return restore_using_req(sk, msg->opts);
> + case CRIU_REQ_TYPE__CHECK:
> + return check_using_req(sk, msg->opts);
>
> default: {
> CriuResp resp = CRIU_RESP__INIT;
>
More information about the CRIU
mailing list