[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Patch] channel_get_exit_status always return -1


Vic,

You made interesting research. Let me quote the SSH RFC:

   When the command running at the other end terminates, the following
   message can be sent to return the exit status of the command.
   Returning the status is RECOMMENDED.  No acknowledgement is sent for
   this message.  The channel needs to be closed with
   SSH_MSG_CHANNEL_CLOSE after this message.

   The client MAY ignore these messages.

It means
1- The server is going to close the channel when this command is sent
2- If you receive this message, the command stops outputing things, so the channel 'should' be EOF
3- After you receive this message, the channel is going to be closed which implies EOF.

I have yet to read why I test local_eof and not remote_eof. Dropping these may be ok if you do it 
the same way that isclosed.

By the way, to execute multiple commands, you are forced to use several channels. Sorry

Regards,

Aris

Vic Lee a écrit :
> Hi Aris,
>
> Today I played a little bit more with exit_status and you are right, it
> won't be able to get it if the channel is closed. If I just try to
> channel_send_eof then it works just fine.
>
> But now I come up with an interesting question: why I have to send eof
> before I can call channel_get_exit_status? I actually tried to remove
> the following lines, and I have no problem getting exit_status without
> sending eof:
>
>  int channel_get_exit_status(ssh_channel channel) {
> -  if (channel->local_eof == 0) {
> -    return -1;
> -  }
>
> Although right now it's not problem for me because I only need to issue
> one exec, but let's imagine someone else in the future might need to
> execute several commands and he needs to get exit_status for each
> command before he can continue with the next. In this case, does he have
> to open/close a new channel for each command? I have a strong feeling
> that we should remove the above three lines; or did I miss something
> else?
>
> Thanks a lot and sorry for my long question. :)
>
> Vic
>
> On Sun, 2009-08-16 at 13:55 +0200, Aris Adamantiadis wrote:
>   
>> Hi Vic,
>>
>> Thanks for your patch, there is indeed a problem. But your patch does 
>> not resolve it the clean way. When a channel has been closed, the 
>> optional exit_status message can't come anymore, hence the return -1 in 
>> the code (simply removing the test may block the function forever if no 
>> exit status is sent). I replaced it by a break; so it returns whatever 
>> value was saved.
>>
>> Regards,
>> Aris
>>
>> Vic Lee a écrit :
>>     
>>> Hi,
>>>
>>> I just found out that the channel_get_exit_status() function always
>>> return -1. What I saw in the codes is that, the channel is supposed to
>>> close first before we can call channel_get_exit_status; which is true
>>> because it's checking "channel->local_eof == 0" in the first line of
>>> that function.
>>>
>>> But if I have to close the channel, why another checking "channel->open
>>> == 0" to check whether the channel is open? So I tried to remove these
>>> three lines, and finally it's working as expected.
>>>
>>> Thanks,
>>>
>>> Vic
>>>       
>
>
>
>   


Follow-Ups:
Re: [Patch] channel_get_exit_status always return -1Vic Lee <llyzs@xxxxxxx>
Archive administrator: postmaster@lists.cynapses.org