[CRIU] [PATCH 2/4] service: page-server: return port back to user
Pavel Emelyanov
xemul at parallels.com
Mon Sep 22 01:54:57 PDT 2014
On 09/18/2014 04:51 AM, Ruslan Kuprieiev wrote:
> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
> ---
> cr-service.c | 54 +++++++++++++++++++++++++++++++++++++-----------------
> 1 file changed, 37 insertions(+), 17 deletions(-)
>
> diff --git a/cr-service.c b/cr-service.c
> index d144f47..e864f16 100644
> --- a/cr-service.c
> +++ b/cr-service.c
> @@ -503,13 +503,19 @@ static int pre_dump_loop(int sk, CriuReq *msg)
> 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)
> {
> - int ret, pid, start_pipe[2];
> + int ret = -1, pid, start_pipe[2];
> ssize_t count;
> bool success = false;
> CriuResp resp = CRIU_RESP__INIT;
> CriuPageServerInfo ps = CRIU_PAGE_SERVER_INFO__INIT;
> + struct ps_info info;
>
> if (!req->ps) {
> pr_err("No page server info in message\n");
> @@ -532,27 +538,41 @@ static int start_page_server_req(int sk, CriuOpts *req)
>
> 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:
> - count = write(start_pipe[1], &ret, sizeof(ret));
> + if (ret < 0 && pid > 0)
> + kill(pid, SIGKILL);
> close(start_pipe[1]);
> - if (count != sizeof(ret))
> - exit(1);
> - exit(0);
> + exit(ret);
> }
>
> close(start_pipe[1]);
> - wait(NULL);
> - ret = -1;
> - count = read(start_pipe[0], &ret, sizeof(ret));
> - if (count != sizeof(ret))
> - success = false;
> - else if (ret > 0) {
> - success = true;
> - ps.has_pid = true;
> - ps.pid = ret;
> - resp.ps = &ps;
> - }
> + wait(&ret);
> + if (ret)
The status can't (well, shouldn't) be checked like this. The WIFEXITED/WIFSIGNALLED
macros are to be used.
> + goto out;
> +
> + count = read(start_pipe[0], &info, sizeof(info));
> + close(start_pipe[0]);
> + if (count != sizeof(info))
> + goto out;
> +
> + success = true;
> + ps.has_pid = true;
> + ps.pid = info.pid;
> + ps.has_port = true;
> + ps.port = info.port;
> + resp.ps = &ps;
>
> pr_debug("Page server started\n");
> out:
>
More information about the CRIU
mailing list