Eric Blake <ebl...@redhat.com> writes: > On 02/23/2017 03:45 PM, Markus Armbruster wrote: >> qmp_check_input_obj() duplicates qmp_dispatch_check_obj(), except the >> latter screws up an error message. handle_qmp_command() runs first >> the former, then the latter via qmp_dispatch(), masking the screwup. >> >> qemu-ga also masks the screwup, because it also duplicates checks, >> just differently. > > Cleaning up the duplication is a win in my book. > >> >> qmp_check_input_obj() exists because handle_qmp_command() needs to >> examine the command before dispatching it. The previous commit got >> rid of this need, except for a tracepoint, and a bit of "id" code that >> relies on qdict not being null. >> >> Fix up the error message in qmp_dispatch_check_obj(), drop >> qmp_check_input_obj() and the tracepoint. Protect the "id" code with >> a conditional. >> >> Signed-off-by: Markus Armbruster <arm...@redhat.com> >> --- >> monitor.c | 74 >> +++++------------------------------------------------ >> qapi/qmp-dispatch.c | 3 +-- >> trace-events | 1 - >> 3 files changed, 7 insertions(+), 71 deletions(-) >> >> diff --git a/monitor.c b/monitor.c >> index dcf2de7..d83888d 100644 >> --- a/monitor.c >> +++ b/monitor.c >> @@ -3697,67 +3697,10 @@ static int monitor_can_read(void *opaque) >> return (mon->suspend_cnt == 0) ? 1 : 0; >> } >> >> -/* >> - * Input object checking rules >> - * >> - * 1. Input object must be a dict >> - * 2. The "execute" key must exist >> - * 3. The "execute" key must be a string >> - * 4. If the "arguments" key exists, it must be a dict >> - * 5. If the "id" key exists, it can be anything (ie. json-value) >> - * 6. Any argument not listed above is considered invalid > > You know, with just a little tweak, we could add something to the .json > file, and let generated code do all the checks of even the top-level > entities: > > { 'struct': 'WireCommand', > 'data': { 'execute': 'str', '*arguments': 'dict', '*id': 'any' } } > > if we had a way to force 'dict' as a subset of 'any' but where it must > be a QDict. (If we had a 'dict' recognized by the QAPI code generators, > we could probably also fix 'object-add' to use '*props':'dict' instead > of its current use of 'any') > > But that sounds like a bit much to ask for in the 2.9 timeframe, so it > doesn't hold up this patch.
The thought came to me, too, but I banished it due to time pressure before it could take presentable form. Valid point on object-add. If we find more uses for "generic object", we can explore a new built-in QAPI type. > We lose a trace, but I don't think that's fatal. If we need one, it should be added to qmp_dispatch(), where it's also useful for qemu-ga. > Reviewed-by: Eric Blake <ebl...@redhat.com> Thanks!