Commit 6b631faa authored by Ruslan Kuprieiev's avatar Ruslan Kuprieiev Committed by Pavel Emelyanov

service: page-server: return port back to user, v2

Signed-off-by: 's avatarRuslan Kuprieiev <kupruser@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 45fe2c9d
...@@ -503,13 +503,19 @@ static int pre_dump_loop(int sk, CriuReq *msg) ...@@ -503,13 +503,19 @@ static int pre_dump_loop(int sk, CriuReq *msg)
return dump_using_req(sk, msg->opts); return dump_using_req(sk, msg->opts);
} }
struct ps_info {
int pid;
unsigned short port;
};
static int start_page_server_req(int sk, CriuOpts *req) static int start_page_server_req(int sk, CriuOpts *req)
{ {
int ret, pid, start_pipe[2]; int ret = -1, pid, start_pipe[2];
ssize_t count; ssize_t count;
bool success = false; bool success = false;
CriuResp resp = CRIU_RESP__INIT; CriuResp resp = CRIU_RESP__INIT;
CriuPageServerInfo ps = CRIU_PAGE_SERVER_INFO__INIT; CriuPageServerInfo ps = CRIU_PAGE_SERVER_INFO__INIT;
struct ps_info info;
if (!req->ps) { if (!req->ps) {
pr_err("No page server info in message\n"); pr_err("No page server info in message\n");
...@@ -532,27 +538,48 @@ static int start_page_server_req(int sk, CriuOpts *req) ...@@ -532,27 +538,48 @@ static int start_page_server_req(int sk, CriuOpts *req)
pr_debug("Starting page server\n"); pr_debug("Starting page server\n");
ret = cr_page_server(true, start_pipe[1]); pid = cr_page_server(true, start_pipe[1]);
if (pid <= 0)
goto out_ch;
info.pid = pid;
info.port = opts.ps_port;
count = write(start_pipe[1], &info, sizeof(info));
if (count != sizeof(info))
goto out_ch;
ret = 0;
out_ch: out_ch:
count = write(start_pipe[1], &ret, sizeof(ret)); if (ret < 0 && pid > 0)
kill(pid, SIGKILL);
close(start_pipe[1]); close(start_pipe[1]);
if (count != sizeof(ret)) exit(ret);
exit(1);
exit(0);
} }
close(start_pipe[1]); close(start_pipe[1]);
wait(NULL); wait(&ret);
ret = -1; if (WIFEXITED(ret)) {
count = read(start_pipe[0], &ret, sizeof(ret)); if (WEXITSTATUS(ret)) {
if (count != sizeof(ret)) pr_err("Child exited with an error\n");
success = false; goto out;
else if (ret > 0) { }
} else {
pr_err("Child wasn't terminated normally\n");
goto out;
}
count = read(start_pipe[0], &info, sizeof(info));
close(start_pipe[0]);
if (count != sizeof(info))
goto out;
success = true; success = true;
ps.has_pid = true; ps.has_pid = true;
ps.pid = ret; ps.pid = info.pid;
ps.has_port = true;
ps.port = info.port;
resp.ps = &ps; resp.ps = &ps;
}
pr_debug("Page server started\n"); pr_debug("Page server started\n");
out: out:
......
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