[CRIU] [PATCH 3/3] unix: allow --external unix[ino]:string

Ruslan Kuprieiev rkuprieiev at cloudlinux.com
Thu Jan 5 04:42:20 PST 2017


Needles to say that it's useful for debug, but this is also
very useful when you syncronise checkpoint/restore whith a
dumpee using unix socketpair and want it to painlessly
receive notification on restore.

Signed-off-by: Ruslan Kuprieiev <rkuprieiev at cloudlinux.com>
---
 criu/sk-unix.c       | 23 +++++++++++++++++++++--
 images/sk-unix.proto |  5 +++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/criu/sk-unix.c b/criu/sk-unix.c
index 5cbe07a..4527dd6 100644
--- a/criu/sk-unix.c
+++ b/criu/sk-unix.c
@@ -263,6 +263,8 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p)
 	SkOptsEntry *skopts;
 	FilePermsEntry *perms;
 	FownEntry *fown;
+	char buf[PATH_MAX];
+	char *ext = NULL;
 
 	ue = xmalloc(sizeof(UnixSkEntry) +
 			sizeof(SkOptsEntry) +
@@ -322,6 +324,16 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p)
 		ue->uflags |= USK_SERVICE;
 	}
 
+	/* Same as with service_sk, but for custom sockets */
+	snprintf(buf, sizeof(buf), "unix[%u]", ue->peer);
+	ext = external_lookup_by_key(buf);
+	if (unlikely(!IS_ERR_OR_NULL(ext))) {
+		ue->state = TCP_CLOSE;
+		ue->peer = 0;
+		ue->uflags |= USK_SERVICE;
+		ue->stub = (void *)strtok(ext, ":");
+	}
+
 	if (sk->namelen && *sk->name) {
 		ue->file_perms = perms;
 
@@ -1139,8 +1151,15 @@ static int open_unixsk_standalone(struct unix_sk_info *ui)
 			return -1;
 		}
 
-		if (send_criu_dump_resp(sks[1], true, true) == -1)
-			return -1;
+		if (ui->ue->stub) {
+			unsigned int l;
+			l = strlen(ui->ue->stub);
+			if (write(sks[1], ui->ue->stub, l) != l)
+				return -1;
+		} else {
+			if (send_criu_dump_resp(sks[1], true, true) == -1)
+				return -1;
+		}
 
 		close(sks[1]);
 		sk = sks[0];
diff --git a/images/sk-unix.proto b/images/sk-unix.proto
index 3026214..4437700 100644
--- a/images/sk-unix.proto
+++ b/images/sk-unix.proto
@@ -48,4 +48,9 @@ message unix_sk_entry {
 	 */
 	optional string			name_dir	= 14;
 	optional bool			deleted		= 15;
+
+	/*
+	 * Stub to put into service socket on restore
+	 */
+        optional string			stub		= 16;
 }
-- 
2.5.5



More information about the CRIU mailing list