Commit 2f272fa1 authored by Pavel Emelyanov's avatar Pavel Emelyanov

parasite: Don't recreate host-side transport socket

When dumping a net namespace we'll have to create the transport
socket in the target namespace. In order to do this we'll have
to call setns swice -- before and after socket() call.

I don't want to do it for every single task to dump, let's cache
the socket instead.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 6cf65d0f
...@@ -371,11 +371,13 @@ static int parasite_set_logfd(struct parasite_ctl *ctl, pid_t pid) ...@@ -371,11 +371,13 @@ static int parasite_set_logfd(struct parasite_ctl *ctl, pid_t pid)
static int parasite_init(struct parasite_ctl *ctl, pid_t pid) static int parasite_init(struct parasite_ctl *ctl, pid_t pid)
{ {
struct parasite_init_args args = { }; struct parasite_init_args args = { };
int sock; static int sock = -1;
args.h_addr_len = gen_parasite_saddr(&args.h_addr, pid); pr_info("Putting tsock into pid %d\n", pid);
args.p_addr_len = gen_parasite_saddr(&args.p_addr, -pid); args.h_addr_len = gen_parasite_saddr(&args.h_addr, 0);
args.p_addr_len = gen_parasite_saddr(&args.p_addr, pid);
if (sock == -1) {
sock = socket(PF_UNIX, SOCK_DGRAM, 0); sock = socket(PF_UNIX, SOCK_DGRAM, 0);
if (sock < 0) { if (sock < 0) {
pr_perror("Can't create socket"); pr_perror("Can't create socket");
...@@ -386,6 +388,21 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid) ...@@ -386,6 +388,21 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid)
pr_perror("Can't bind socket"); pr_perror("Can't bind socket");
goto err; goto err;
} }
} else {
struct sockaddr addr = { .sa_family = AF_UNSPEC, };
/*
* When the peer of a dgram socket dies the original socket
* remains in connected state, thus denying any connections
* from "other" sources. Unconnect the socket by hands thus
* allowing for parasite to connect back.
*/
if (connect(sock, &addr, sizeof(addr)) < 0) {
pr_perror("Can't unconnect");
goto err;
}
}
if (parasite_execute(PARASITE_CMD_INIT, ctl, &args, sizeof(args)) < 0) { if (parasite_execute(PARASITE_CMD_INIT, ctl, &args, sizeof(args)) < 0) {
pr_err("Can't init parasite\n"); pr_err("Can't init parasite\n");
...@@ -604,8 +621,7 @@ int parasite_cure_seized(struct parasite_ctl *ctl) ...@@ -604,8 +621,7 @@ int parasite_cure_seized(struct parasite_ctl *ctl)
{ {
int ret = 0; int ret = 0;
if (ctl->tsock >= 0) ctl->tsock = -1;
close(ctl->tsock);
if (ctl->parasite_ip) { if (ctl->parasite_ip) {
ctl->signals_blocked = 0; ctl->signals_blocked = 0;
......
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