[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] Handling the O-type
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] Handling the O-type |
Date: |
Mon, 21 Jun 2010 18:50:19 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) |
Luiz Capitulino <address@hidden> writes:
> On Mon, 21 Jun 2010 10:12:06 +0200
> Markus Armbruster <address@hidden> wrote:
>
>> Luiz Capitulino <address@hidden> writes:
>>
>> > On Wed, 02 Jun 2010 09:31:24 +0200
>> > Markus Armbruster <address@hidden> wrote:
>> >
>> >> Luiz Capitulino <address@hidden> writes:
>> >
>> > [...]
>> >
>> >> > static void check_mandatory_args(const char *cmd_arg_name,
>> >> > @@ -4344,6 +4413,9 @@ out:
>> >> > * Client argument checking rules:
>> >> > *
>> >> > * 1. Client must provide all mandatory arguments
>> >> > + * 2. Each argument provided by the client must be valid
>> >> > + * 3. Each argument provided by the client must have the type expected
>> >> > + * by the command
>> >> > */
>> >> > static int qmp_check_client_args(const mon_cmd_t *cmd, QDict
>> >> > *client_args)
>> >> > {
>> >> > @@ -4355,7 +4427,10 @@ static int qmp_check_client_args(const mon_cmd_t
>> >> > *cmd, QDict *client_args)
>> >> > res.qdict = client_args;
>> >> > qdict_iter(cmd_args, check_mandatory_args, &res);
>> >> >
>> >> > - /* TODO: Check client args type */
>> >> > + if (!res.result && !res.skip) {
>> >> > + res.qdict = cmd_args;
>> >> > + qdict_iter(client_args, check_client_args_type, &res);
>> >> > + }
>> >>
>> >> What if we have both an O-type argument and other arguments? Then the
>> >> 'O' makes check_client_args_type() set res.skip, and we duly skip
>> >> checking the other arguments here.
>> >
>> > I was working on this and it seems a bad idea to allow mixing O-type and
>> > other monitor types*.
>> >
>> > The reason is that you can't easily tell if an argument passed by the
>> > client
>> > is part of the O-type or the monitor type. We could workaround this by
>> > trying to
>> > ensure that an argument exists only in one of them, but I really feel this
>> > will
>> > get messy.
>> >
>> > I think we should disallow mixing O-type with other argument types and
>> > maintain
>> > the skip trick, ie. skip any checking in the top level if the argument is
>> > an
>> > O-type one.
>>
>> If you're proposing "if you have an O-type parameter, then you can have
"can't have" for crying out loud!
>> any other parameters", then I disagree. That's too big a hammer.
>
> Not sure if this changes what you're trying to say here, but actually what
> I'm saying is "if you have an O-type parameter, then argument checking is
> up to you".
Workable, I think.
> The best way to fix that is to do the other way around, ie. O-type should
> also be checked by the new checker.
>
>> The problem is to match actual arguments to formal parameters.
>>
>> In HMP, the matching is positional. No ambiguity as long as positions
>> are clearly delimited. A positional argument maybe an O-type, and
>> within that argument, matching is by option name.
>
> Ok, so the HMP parser can tell when an O-type sequence beings and ends,
> right? By looking at the code, I have the impression it does.
Just like any other type, the O-type tells us how to parse a single
positional argument.
> In this case, the new checker should do the same. Should be possible, right?
>
>> The big hammer restriction would make it impossible for a command to
>> take both positional arguments and named arguments, unless you do the
>> named arguments ad hoc instead of with an O-type. Some commands already
>> take both positional and named arguments: pci_add, drive_add,
>> host_net_add. Okay, those examples aren't exactly pinnacles of human
>> interface design. Still, it's an ugly restriction.
>>
>> Multiple O-types in the same command are probably a bad idea, because
>> the user would have to remember which option goes into what positional
>> argument.
>>
>> In QMP, the matching is by parameter name. No ambiguity as long as the
>> names are unique. Therefore, all we need to disallow is non-unique
>> parameter names.
>
> Yes, if there's an easy way to do that I will do.
>
>> Having an args_type define the same parameter name twice is a
>> programming error. It doesn't matter whether the name is right in the
>> string, or buried in an O-type.
>
> Sure, but it's error prone.
>
> [...]
>
>> Sooner or later we'll want to switch to a more structured encoding of
>> parameters than the args_type string. We might want to revise or ditch
>> the use of QemuOptsList then.
>
> Yes, and we have to decide what to do before we get there.
>
> My suggestion is: if it's easy to do the O-type checking in the new checker,
> then let's do it. Otherwise let's live with the limitation until we can
> properly fix it.
Should be good enough for the initial commit.
- [Qemu-devel] [PATCH 2/9] Monitor: handle optional '-' arg as a bool, (continued)
[Qemu-devel] [PATCH 7/9] QError: Introduce QERR_QMP_BAD_INPUT_OBJECT_MEMBER, Luiz Capitulino, 2010/06/01
[Qemu-devel] [PATCH 8/9] QMP: Introduce qmp_check_input_obj(), Luiz Capitulino, 2010/06/01
[Qemu-devel] [PATCH 9/9] QMP: Drop old input object checking code, Luiz Capitulino, 2010/06/01
Re: [Qemu-devel] [PATCH 0/9]: QMP: Replace client argument checker, Markus Armbruster, 2010/06/02