[CRIU] [PATCH 2/4] service: page-server: return port back to user
Ruslan Kuprieiev
kupruser at gmail.com
Wed Sep 17 07:53:29 PDT 2014
On 17.09.2014 17:44, Pavel Emelyanov wrote:
> On 09/17/2014 11:25 AM, Ruslan Kuprieiev wrote:
>> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
>> ---
>> cr-service.c | 44 ++++++++++++++++++++++++++++----------------
>> 1 file changed, 28 insertions(+), 16 deletions(-)
>>
>> diff --git a/cr-service.c b/cr-service.c
>> index d144f47..2af6e8f 100644
>> --- a/cr-service.c
>> +++ b/cr-service.c
>> @@ -505,7 +505,7 @@ static int pre_dump_loop(int sk, CriuReq *msg)
>>
>> 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;
>> @@ -532,28 +532,40 @@ 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;
>> +
>> + count = write(start_pipe[1], &opts.ps_port, sizeof(opts.ps_port));
>> + if (count != sizeof(opts.ps_port))
>> + goto out_ch;
>> +
>> + ret = pid;
>> 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 <= 0)
>> + goto out;
>> +
>> + count = read(start_pipe[0], &opts.ps_port, sizeof(opts.ps_port));
>> + if (count != sizeof(opts.ps_port)) {
>> + kill(ret, SIGKILL);
>> + goto out;
>> }
>>
>> + success = true;
>> + ps.has_pid = true;
>> + ps.pid = ret;
> The ret here would be ... what? Last time it was passed
> as pointer to wait() call, but its argument is a) not pointer
> to store pid and b) this task's child is not page server task.
Last time exit value of child wasn't used at all:
- wait(NULL);
And ps pid was transfered through pipe.
And yes, sorry, i've used a bad way to transfer ps pid.
Will fix.
>> + ps.has_port = true;
>> + ps.port = opts.ps_port;
>> + resp.ps = &ps;
>> +
>> pr_debug("Page server started\n");
>> out:
>> resp.type = CRIU_REQ_TYPE__PAGE_SERVER;
>>
More information about the CRIU
mailing list