[CRIU] [PATCH 2/4] service: page-server: return port back to user
Ruslan Kuprieiev
kupruser at gmail.com
Mon Sep 22 01:57:05 PDT 2014
On 22.09.2014 11:54, Pavel Emelyanov wrote:
> 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.
Oops, let me fix it and resend this particular patch.
Thanks!
>> + 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