On Fri, Oct 7, 2011 at 13:36, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote:
> On Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
>> So, if there is an error in the answer given by QEMU, the function
>> qmp_synchronous_send while know.
>                       "will"
>
>>
>> Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
>> ---
>>  tools/libxl/libxl_qmp.c |   14 ++++++++------
>>  1 files changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
>> index 1594a4f..cd3e4e4 100644
>> --- a/tools/libxl/libxl_qmp.c
>> +++ b/tools/libxl/libxl_qmp.c
>> @@ -233,6 +233,7 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
>>                                 const libxl__json_object *resp)
>>  {
>>      libxl__qmp_message_type type = LIBXL__QMP_MESSAGE_TYPE_INVALID;
>> +    int rc = 0;
>>
>>      type = qmp_response_type(qmp, resp);
>>      LIBXL__LOG(qmp->ctx, LIBXL__LOG_DEBUG,
>> @@ -241,14 +242,14 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
>>      switch (type) {
>>      case LIBXL__QMP_MESSAGE_TYPE_QMP:
>>          /* On the greeting message from the server, enable QMP capabilities 
>> */
>> -        enable_qmp_capabilities(qmp);
>> +        rc = enable_qmp_capabilities(qmp);
>>          break;
>>      case LIBXL__QMP_MESSAGE_TYPE_RETURN: {
>>          callback_id_pair *pp = qmp_get_callback_from_id(qmp, resp);
>>
>>          if (pp) {
>>              if (pp->callback) {
>> -                pp->callback(qmp,
>> +                rc = pp->callback(qmp,
>>                               libxl__json_map_get("return", resp, JSON_ANY),
>>                               pp->opaque);
>>              }
>> @@ -263,13 +264,13 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
>>      }
>>      case LIBXL__QMP_MESSAGE_TYPE_ERROR:
>>          qmp_handle_error_response(qmp, resp);
>> -        break;
>> +        return -1;
>
> A mixture or "return -1" and a rc variable returned at the outermost
> level is a bit odd. You should either always set rc and fall through or
> always return at the end of each case.
OK, I will change that.
>>      case LIBXL__QMP_MESSAGE_TYPE_EVENT:
>>          break;
>>      case LIBXL__QMP_MESSAGE_TYPE_INVALID:
>>          return -1;
>>      }
>> -    return 0;
>> +    return rc;
>>  }
>>
>>  /*
>> @@ -358,6 +359,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler 
>> *qmp)
>>
>>      char *incomplete = NULL;
>>      size_t incomplete_size = 0;
>> +    int rc = 0;
>>
>>      do {
>>          fd_set rfds;
>> @@ -416,7 +418,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler 
>> *qmp)
>>                  s = end + 2;
>>
>>                  if (o) {
>> -                    qmp_handle_response(qmp, o);
>> +                    rc = qmp_handle_response(qmp, o);
>
> If rc now indicates error do we need to bail straight away or need to
> keep going around this loop? (Or is it certain we will immediately fall
> out of the loop after this?)
We can not be sure that we will return, because it could be another
message in the butffer. So I should return if there is a protocol
error. But I think that I should keep seperate the return code of a
callback, so only the interested function (qmp_synchronous_send) will
read it (and return to the caller).
>>                      libxl__json_object_free(gc, o);
>>                  } else {
>>                      LIBXL__LOG(qmp->ctx, LIBXL__LOG_ERROR,
>> @@ -429,7 +431,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler 
>> *qmp)
>>          } while (s < s_end);
>>     } while (s < s_end);
>>
>> -    return 1;
>> +    return rc;
>>  }
>>
>>  static int qmp_send(libxl__qmp_handler *qmp,
-- 
Anthony PERARD
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 |