[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