[CRIU] [PATCH 4/6] libcriu: use swrk by default

Ruslan Kuprieiev rkuprieiev at cloudlinux.com
Mon Oct 12 02:50:04 PDT 2015


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: Ruslan Kuprieiev <rkuprieiev at cloudlinux.com>
---
 lib/criu.c | 42 ++++++++++++++++++++++++++++++++++--------
 lib/criu.h |  2 +-
 2 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/lib/criu.c b/lib/criu.c
index 1f8c917..9c00a0f 100644
--- a/lib/criu.c
+++ b/lib/criu.c
@@ -114,8 +114,8 @@ int criu_local_init_opts(criu_opts **o)
 	opts->rpc	= rpc;
 	opts->notify	= NULL;
 
-	opts->service_comm	= CRIU_COMM_SK;
-	opts->service_address	= CR_DEFAULT_SERVICE_ADDRESS;
+	opts->service_comm	= CRIU_COMM_BIN;
+	opts->service_address	= CR_DEFAULT_SERVICE_BIN;
 
 	*o = opts;
 
@@ -808,7 +808,7 @@ static void swrk_wait(criu_opts *opts)
 		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;
 
@@ -844,23 +844,45 @@ static int swrk_connect(criu_opts *opts)
 		close(sks[0]);
 		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);
 		perror("Can't exec criu swrk");
+child_err:
+		close(sks[1]);
 		exit(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;
 	ret = sks[0];
+
 out:
 	return ret;
+
 err:
 	close(sks[0]);
 	close(sks[1]);
 	goto out;
 }
 
-static int criu_connect(criu_opts *opts)
+static int criu_connect(criu_opts *opts, bool d)
 {
 	int fd, ret;
 	struct sockaddr_un addr;
@@ -869,7 +891,7 @@ static int criu_connect(criu_opts *opts)
 	if (opts->service_comm == CRIU_COMM_FD)
 		return opts->service_fd;
 	else if (opts->service_comm == CRIU_COMM_BIN)
-		return swrk_connect(opts);
+		return swrk_connect(opts, d);
 
 	fd = socket(AF_LOCAL, SOCK_SEQPACKET, 0);
 	if (fd < 0) {
@@ -945,8 +967,12 @@ static int send_req_and_recv_resp(criu_opts *opts, CriuReq *req, CriuResp **resp
 {
 	int fd;
 	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) {
 		perror("Can't connect to criu");
 		ret = -ECONNREFUSED;
@@ -1052,7 +1078,7 @@ int criu_local_dump_iters(criu_opts *opts, int (*more)(criu_predump_info pi))
 		goto exit;
 
 	ret = -ECONNREFUSED;
-	fd = criu_connect(opts);
+	fd = criu_connect(opts, false);
 	if (fd < 0)
 		goto exit;
 
@@ -1162,7 +1188,7 @@ int criu_local_restore_child(criu_opts *opts)
 		opts->service_binary = CR_DEFAULT_SERVICE_BIN;
 	}
 
-	sk = swrk_connect(opts);
+	sk = swrk_connect(opts, false);
 	if (save_comm) {
 		/* Restore comm */
 		opts->service_comm = saved_comm;
diff --git a/lib/criu.h b/lib/criu.h
index c2ad84d..0898be0 100644
--- a/lib/criu.h
+++ b/lib/criu.h
@@ -47,7 +47,7 @@ void criu_set_service_binary(char *path);
 
 /*
  * 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);
 
-- 
2.4.3



More information about the CRIU mailing list