Commit d0d4d5e7 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

dump: a trasport socket should be SOCK_STREAM

because we want to know when one of the sides closed its point.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 45794cc1
...@@ -66,9 +66,6 @@ struct parasite_init_args { ...@@ -66,9 +66,6 @@ struct parasite_init_args {
int h_addr_len; int h_addr_len;
struct sockaddr_un h_addr; struct sockaddr_un h_addr;
int p_addr_len;
struct sockaddr_un p_addr;
k_rtsigset_t sig_blocked; k_rtsigset_t sig_blocked;
struct rt_sigframe *sigframe; struct rt_sigframe *sigframe;
......
...@@ -376,17 +376,18 @@ static int parasite_set_logfd(struct parasite_ctl *ctl, pid_t pid) ...@@ -376,17 +376,18 @@ static int parasite_set_logfd(struct parasite_ctl *ctl, pid_t pid)
static int parasite_init(struct parasite_ctl *ctl, pid_t pid, int nr_threads) static int parasite_init(struct parasite_ctl *ctl, pid_t pid, int nr_threads)
{ {
static int ssock = -1;
struct parasite_init_args *args; struct parasite_init_args *args;
static int sock = -1; int sock;
args = parasite_args(ctl, struct parasite_init_args); args = parasite_args(ctl, struct parasite_init_args);
pr_info("Putting tsock into pid %d\n", pid); pr_info("Putting tsock into pid %d\n", pid);
args->h_addr_len = gen_parasite_saddr(&args->h_addr, getpid()); args->h_addr_len = gen_parasite_saddr(&args->h_addr, getpid());
args->p_addr_len = gen_parasite_saddr(&args->p_addr, pid);
args->sigframe = ctl->rsigframe; args->sigframe = ctl->rsigframe;
if (sock == -1) { if (ssock == -1) {
int rst = -1; int rst = -1;
if (current_ns_mask & CLONE_NEWNET) { if (current_ns_mask & CLONE_NEWNET) {
...@@ -396,32 +397,22 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid, int nr_threads) ...@@ -396,32 +397,22 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid, int nr_threads)
return -1; return -1;
} }
sock = socket(PF_UNIX, SOCK_DGRAM, 0); ssock = socket(PF_UNIX, SOCK_STREAM, 0);
if (sock < 0) if (ssock < 0)
pr_perror("Can't create socket"); pr_perror("Can't create socket");
if (rst > 0 && restore_ns(rst, &net_ns_desc) < 0) if (rst > 0 && restore_ns(rst, &net_ns_desc) < 0)
return -1; return -1;
if (sock < 0) if (ssock < 0)
return -1; return -1;
if (bind(sock, (struct sockaddr *)&args->h_addr, args->h_addr_len) < 0) { if (bind(ssock, (struct sockaddr *)&args->h_addr, args->h_addr_len) < 0) {
pr_perror("Can't bind socket"); pr_perror("Can't bind socket");
goto err; goto err;
} }
} else { if (listen(ssock, 1)) {
struct sockaddr addr = { .sa_family = AF_UNSPEC, }; pr_perror("Can't listen on transport socket");
/*
* 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; goto err;
} }
} }
...@@ -434,15 +425,16 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid, int nr_threads) ...@@ -434,15 +425,16 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid, int nr_threads)
ctl->sig_blocked = args->sig_blocked; ctl->sig_blocked = args->sig_blocked;
ctl->use_sig_blocked = true; ctl->use_sig_blocked = true;
if (connect(sock, (struct sockaddr *)&args->p_addr, args->p_addr_len) < 0) { sock = accept(ssock, NULL, 0);
pr_perror("Can't connect a transport socket"); if (sock < 0) {
pr_perror("Can't accept connection to the transport socket");
goto err; goto err;
} }
ctl->tsock = sock; ctl->tsock = sock;
return 0; return 0;
err: err:
close_safe(&sock); close_safe(&ssock);
return -1; return -1;
} }
......
...@@ -225,16 +225,12 @@ static int init(struct parasite_init_args *args) ...@@ -225,16 +225,12 @@ static int init(struct parasite_init_args *args)
if (ret) if (ret)
return -1; return -1;
tsock = sys_socket(PF_UNIX, SOCK_DGRAM, 0); tsock = sys_socket(PF_UNIX, SOCK_STREAM, 0);
if (tsock < 0) { if (tsock < 0) {
ret = tsock; ret = tsock;
goto err; goto err;
} }
ret = sys_bind(tsock, (struct sockaddr *) &args->p_addr, args->p_addr_len);
if (ret < 0)
goto err;
ret = sys_connect(tsock, (struct sockaddr *)&args->h_addr, args->h_addr_len); ret = sys_connect(tsock, (struct sockaddr *)&args->h_addr, args->h_addr_len);
if (ret < 0) if (ret < 0)
goto err; goto err;
......
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