Commit f39bb8f9 authored by Ruslan Kuprieiev's avatar Ruslan Kuprieiev Committed by Pavel Emelyanov

libcriu: use swrk by default

Not sure if it is okay, but this patch breaks backward compatibility,
as we now discourage people from using criu as a system service by default.
But it is better to be done rather sooner than later, considering criu service
is not widely used.

On a patch side, we just need to daemonize swrk if self-dump is requested.
Signed-off-by: 's avatarRuslan Kuprieiev <rkuprieiev@cloudlinux.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent f4e9a1df
...@@ -114,8 +114,8 @@ int criu_local_init_opts(criu_opts **o) ...@@ -114,8 +114,8 @@ int criu_local_init_opts(criu_opts **o)
opts->rpc = rpc; opts->rpc = rpc;
opts->notify = NULL; opts->notify = NULL;
opts->service_comm = CRIU_COMM_SK; opts->service_comm = CRIU_COMM_BIN;
opts->service_address = CR_DEFAULT_SERVICE_ADDRESS; opts->service_address = CR_DEFAULT_SERVICE_BIN;
*o = opts; *o = opts;
...@@ -808,7 +808,7 @@ static void swrk_wait(criu_opts *opts) ...@@ -808,7 +808,7 @@ static void swrk_wait(criu_opts *opts)
waitpid(opts->swrk_pid, NULL, 0); waitpid(opts->swrk_pid, NULL, 0);
} }
static int swrk_connect(criu_opts *opts) static int swrk_connect(criu_opts *opts, bool d)
{ {
int sks[2], pid, ret = -1; int sks[2], pid, ret = -1;
...@@ -844,23 +844,45 @@ static int swrk_connect(criu_opts *opts) ...@@ -844,23 +844,45 @@ static int swrk_connect(criu_opts *opts)
close(sks[0]); close(sks[0]);
sprintf(fds, "%d", sks[1]); sprintf(fds, "%d", sks[1]);
if (d)
if (daemon(0, 1)) {
perror("Can't detach for a self-dump");
goto child_err;
}
pid = getpid();
if (write(sks[1], &pid, sizeof(pid)) != sizeof(pid)) {
perror("Can't write swrk pid");
goto child_err;
}
execlp(opts->service_binary, opts->service_binary, "swrk", fds, NULL); execlp(opts->service_binary, opts->service_binary, "swrk", fds, NULL);
perror("Can't exec criu swrk"); perror("Can't exec criu swrk");
child_err:
close(sks[1]);
exit(1); exit(1);
} }
close(sks[1]); close(sks[1]);
if (read(sks[0], &pid, sizeof(pid)) != sizeof(pid)) {
perror("Can't read swrk pid");
goto err;
}
opts->swrk_pid = pid; opts->swrk_pid = pid;
ret = sks[0]; ret = sks[0];
out: out:
return ret; return ret;
err: err:
close(sks[0]); close(sks[0]);
close(sks[1]); close(sks[1]);
goto out; goto out;
} }
static int criu_connect(criu_opts *opts) static int criu_connect(criu_opts *opts, bool d)
{ {
int fd, ret; int fd, ret;
struct sockaddr_un addr; struct sockaddr_un addr;
...@@ -869,7 +891,7 @@ static int criu_connect(criu_opts *opts) ...@@ -869,7 +891,7 @@ static int criu_connect(criu_opts *opts)
if (opts->service_comm == CRIU_COMM_FD) if (opts->service_comm == CRIU_COMM_FD)
return opts->service_fd; return opts->service_fd;
else if (opts->service_comm == CRIU_COMM_BIN) else if (opts->service_comm == CRIU_COMM_BIN)
return swrk_connect(opts); return swrk_connect(opts, d);
fd = socket(AF_LOCAL, SOCK_SEQPACKET, 0); fd = socket(AF_LOCAL, SOCK_SEQPACKET, 0);
if (fd < 0) { if (fd < 0) {
...@@ -945,8 +967,12 @@ static int send_req_and_recv_resp(criu_opts *opts, CriuReq *req, CriuResp **resp ...@@ -945,8 +967,12 @@ static int send_req_and_recv_resp(criu_opts *opts, CriuReq *req, CriuResp **resp
{ {
int fd; int fd;
int ret = 0; int ret = 0;
bool d = false;
if (req->type == CRIU_REQ_TYPE__DUMP && req->opts->has_pid == false)
d = true;
fd = criu_connect(opts); fd = criu_connect(opts, d);
if (fd < 0) { if (fd < 0) {
perror("Can't connect to criu"); perror("Can't connect to criu");
ret = -ECONNREFUSED; ret = -ECONNREFUSED;
...@@ -1052,7 +1078,7 @@ int criu_local_dump_iters(criu_opts *opts, int (*more)(criu_predump_info pi)) ...@@ -1052,7 +1078,7 @@ int criu_local_dump_iters(criu_opts *opts, int (*more)(criu_predump_info pi))
goto exit; goto exit;
ret = -ECONNREFUSED; ret = -ECONNREFUSED;
fd = criu_connect(opts); fd = criu_connect(opts, false);
if (fd < 0) if (fd < 0)
goto exit; goto exit;
...@@ -1162,7 +1188,7 @@ int criu_local_restore_child(criu_opts *opts) ...@@ -1162,7 +1188,7 @@ int criu_local_restore_child(criu_opts *opts)
opts->service_binary = CR_DEFAULT_SERVICE_BIN; opts->service_binary = CR_DEFAULT_SERVICE_BIN;
} }
sk = swrk_connect(opts); sk = swrk_connect(opts, false);
if (save_comm) { if (save_comm) {
/* Restore comm */ /* Restore comm */
opts->service_comm = saved_comm; opts->service_comm = saved_comm;
......
...@@ -47,7 +47,7 @@ void criu_set_service_binary(char *path); ...@@ -47,7 +47,7 @@ void criu_set_service_binary(char *path);
/* /*
* You can choose if you want libcriu to connect to service socket * You can choose if you want libcriu to connect to service socket
* by itself or just use provided file descriptor * by itself, use provided file descriptor or spawn swrk by itself
*/ */
void criu_set_service_comm(enum criu_service_comm); void criu_set_service_comm(enum criu_service_comm);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment