From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:49116) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USNno-0004e1-Iy for qemu-devel@nongnu.org; Wed, 17 Apr 2013 04:33:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1USNnm-0000eT-Rz for qemu-devel@nongnu.org; Wed, 17 Apr 2013 04:33:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:1819) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USNnm-0000eE-JX for qemu-devel@nongnu.org; Wed, 17 Apr 2013 04:33:14 -0400 Date: Wed, 17 Apr 2013 16:33:03 +0800 From: Amos Kong Message-ID: <20130417083303.GA3856@t430s.nay.redhat.com> References: <8738urblx3.fsf@fimbulvetr.bsc.es> <20130416084919.GG6308@stefanha-thinkpad.redhat.com> <20130416145017.GA1599@vm> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20130416145017.GA1599@vm> Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [qapi] Cannot use list of strings List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: mdroth Cc: Stefan Hajnoczi , Anthony Liguori , Luiz Capitulino , =?iso-8859-1?Q?Llu=EDs?= Vilanova , qemu-devel@nongnu.org On Tue, Apr 16, 2013 at 09:50:17AM -0500, mdroth wrote: > On Tue, Apr 16, 2013 at 10:49:19AM +0200, Stefan Hajnoczi wrote: > > On Mon, Apr 15, 2013 at 10:04:24PM +0200, Llu=C3=ADs Vilanova wrote: > > > Tried using a list of strings as an argument to a command, but the = generated > > > code references the 'strList' type, which does not exist. > > >=20 > > > Is a specialized version for "['str']" missing, or should I define = my own type > > > with a single field of 'str' type? >=20 > I would say just give that a shot. Stick: >=20 > typedef struct strList > { > char *value; > struct strList *next; > } strList; >=20 > in include/qapi/visitor.h and see what happens. Hi Michael, | In file included from /home/devel/qemu/include/qapi/error.h:16, | from /home/devel/qemu/include/qapi/visitor.h:16, | from /home/devel/qemu/include/qapi/dealloc-visitor.h:1= 7, | from qapi-types.c:17: | ./qapi-types.h:2158: error: expected specifier-qualifier-list before =E2= =80=98strList=E2=80=99 | make: *** [qapi-types.o] Error 1 ("->" means "is include to") qapi-types.h -> include/qapi/error.h -> include/qapi/visitor.h 'strList' is used in qapi-types.h, we should not declare strList in include/qapi/visitor.h. I changed scripts/qapi-types.py to declare strList in qapi-types.h, but got a redefinition error. | In file included from qga/qapi-generated/qga-qmp-commands.h:19, | from qga/commands.c:15: | qga/qapi-generated/qga-qapi-types.h:23: error: redefinition of =E2=80=98= struct strList=E2=80=99 | qga/qapi-generated/qga-qapi-types.h:26: error: conflicting types for =E2= =80=98strList=E2=80=99 | ./qapi-types.h:26: note: previous declaration of =E2=80=98strList=E2=80= =99 was here | make: *** [qga/commands.o] Error 1 I used an _ugly_ "#ifndef" to limit it only be defined in qapi-types.h. Michael, others do you have some suggestion? Except strList, I also added a function: visit_type_strList(). Then it wo= rks. New output: {'execute': 'query-mac-table'} { "return": [ { "name": "virtio-net-pci.0",=20 "uni_overflow": false,=20 "nobcast": false,=20 "promisc": false,=20 "multicast": [ "01:00:5e:00:00:01",=20 "33:33:00:00:00:01",=20 "33:33:ff:12:34:57" ],=20 "nouni": false,=20 "nomulti": false,=20 "allmulti": false,=20 "multi_overflow": false,=20 "alluni": false },=20 { "name": "virtio-net-pci.1",=20 .... .... } ] } # cat draft.patch diff --git a/hmp.c b/hmp.c index 8820224..1cf524e 100644 --- a/hmp.c +++ b/hmp.c @@ -656,7 +656,7 @@ void hmp_info_tpm(Monitor *mon, const QDict *qdict) void hmp_info_mac_table(Monitor *mon, const QDict *qdict) { MacTableInfoList *table_list, *table_entry; - StringList *str_entry; + strList *str_entry; =20 table_list =3D qmp_query_mac_table(NULL); table_entry =3D table_list; @@ -698,7 +698,7 @@ void hmp_info_mac_table(Monitor *mon, const QDict *qd= ict) str_entry =3D table_entry->value->unicast; monitor_printf(mon, " \\ unicast:\n"); while (str_entry) { - monitor_printf(mon, " %s\n", str_entry->value->str); + monitor_printf(mon, " %s\n", str_entry->value); str_entry =3D str_entry->next; } } @@ -707,7 +707,7 @@ void hmp_info_mac_table(Monitor *mon, const QDict *qd= ict) str_entry =3D table_entry->value->multicast; monitor_printf(mon, " \\ multicast:\n"); while (str_entry) { - monitor_printf(mon, " %s\n", str_entry->value->str); + monitor_printf(mon, " %s\n", str_entry->value); str_entry =3D str_entry->next; } } diff --git a/hw/virtio-net.c b/hw/virtio-net.c index 8b15759..b72f163 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -197,8 +197,8 @@ static MacTableInfo *virtio_net_query_mactable(NetCli= entState *nc) { VirtIONet *n =3D qemu_get_nic_opaque(nc); MacTableInfo *info; - StringList *str_list =3D NULL; - StringList *entry; + strList *str_list =3D NULL; + strList *entry; char str[12]; int i; =20 @@ -234,7 +234,7 @@ static MacTableInfo *virtio_net_query_mactable(NetCli= entState *nc) n->mac_table.macs[i * ETH_ALEN + 4], n->mac_table.macs[i * ETH_ALEN + 5]); entry->value =3D g_malloc0(sizeof(String *)); - entry->value->str =3D g_strdup(str); + entry->value =3D g_strdup(str); entry->next =3D str_list; str_list =3D entry; } @@ -253,7 +253,7 @@ static MacTableInfo *virtio_net_query_mactable(NetCli= entState *nc) n->mac_table.macs[i * ETH_ALEN + 4], n->mac_table.macs[i * ETH_ALEN + 5]); entry->value =3D g_malloc0(sizeof(String *)); - entry->value->str =3D g_strdup(str); + entry->value =3D g_strdup(str); entry->next =3D str_list; str_list =3D entry; } diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h index 1fef18c..2e36edb 100644 --- a/include/qapi/visitor.h +++ b/include/qapi/visitor.h @@ -50,6 +50,7 @@ void visit_type_int64(Visitor *v, int64_t *obj, const c= har *name, Error **errp); void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error = **errp); void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **er= rp); void visit_type_str(Visitor *v, char **obj, const char *name, Error **er= rp); +void visit_type_strList(Visitor *m, strList ** obj, const char *name, Er= ror **errp); void visit_type_number(Visitor *v, double *obj, const char *name, Error = **errp); =20 #endif diff --git a/qapi-schema.json b/qapi-schema.json index febf62a..5c8e77e 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3537,8 +3537,8 @@ '*nobcast': 'bool', '*multi_overflow': 'bool', '*uni_overflow': 'bool', - '*unicast': ['String'], - '*multicast': ['String'] }} + '*unicast': ['str'], + '*multicast': ['str'] }} =20 ## # @query-mac-table: diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 401ee6e..aefe227 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -257,6 +257,28 @@ void visit_type_str(Visitor *v, char **obj, const ch= ar *name, Error **errp) } } =20 +void visit_type_strList(Visitor *m, strList ** obj, const char *name, Er= ror **errp) +{ + GenericList *i, **prev =3D (GenericList **)obj; + Error *err =3D NULL; + + if (!error_is_set(errp)) { + visit_start_list(m, name, &err); + if (!err) { + for (; (i =3D visit_next_list(m, prev, &err)) !=3D NULL; pre= v =3D &i) { + strList *native_i =3D (strList *)i; + visit_type_str(m, &native_i->value, NULL, &err); + } + error_propagate(errp, err); + err =3D NULL; + + /* Always call end_list if start_list succeeded. */ + visit_end_list(m, &err); + } + error_propagate(errp, err); + } +} + void visit_type_number(Visitor *v, double *obj, const char *name, Error = **errp) { if (!error_is_set(errp)) { diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index 9e19920..f2ca373 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -276,6 +276,14 @@ fdecl.write(mcgen(''' #include #include =20 +#ifndef QGA_QAPI_TYPES_H +typedef struct strList +{ + char *value; + struct strList *next; +} strList; +#endif + ''', guard=3Dguardname(h_file))) =20