From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42105) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aNo4d-0002Bj-Qo for qemu-devel@nongnu.org; Mon, 25 Jan 2016 15:49:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aNo4Z-0006cm-7T for qemu-devel@nongnu.org; Mon, 25 Jan 2016 15:49:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:49198) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aNo4Y-0006cc-VK for qemu-devel@nongnu.org; Mon, 25 Jan 2016 15:49:15 -0500 References: <1453713170-13156-1-git-send-email-zhang.zhanghailiang@huawei.com> From: Eric Blake Message-ID: <56A68A44.1020606@redhat.com> Date: Mon, 25 Jan 2016 13:49:08 -0700 MIME-Version: 1.0 In-Reply-To: <1453713170-13156-1-git-send-email-zhang.zhanghailiang@huawei.com> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="iasPP4DpnnhgBvXpmqQFSNUd3EDu53x93" Subject: Re: [Qemu-devel] [PATCH] net/filter: Fix the output information for command 'info network' List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: zhanghailiang , qemu-devel@nongnu.org Cc: Jason Wang , Markus Armbruster , Yang Hongyang This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --iasPP4DpnnhgBvXpmqQFSNUd3EDu53x93 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 01/25/2016 02:12 AM, zhanghailiang wrote: > The properties of netfilter object could be changed by 'qom-set' > command, but the output of 'info network' command is not updated, > because it got the old information through nf->info_str, it will > not be updated while we change the value of netfilter's property. >=20 > Here we split a helper function that could colletct the output s/colletct/collect/ > information for filter, and also remove the useless member > 'info_str' from struct NetFilterState. >=20 > Signed-off-by: zhanghailiang > Cc: Jason Wang > Cc: Eric Blake > Cc: Markus Armbruster > Cc: Yang Hongyang > --- > include/net/filter.h | 3 ++- > net/filter.c | 47 ++++++++++++++++++++++++++------------------= --- > net/net.c | 5 ++++- > 3 files changed, 32 insertions(+), 23 deletions(-) >=20 > +++ b/include/net/filter.h > @@ -55,7 +55,6 @@ struct NetFilterState { > char *netdev_id; > NetClientState *netdev; > NetFilterDirection direction; > - char info_str[256]; Fixed size buffer... > QTAILQ_ENTRY(NetFilterState) next; > }; > =20 > @@ -74,4 +73,6 @@ ssize_t qemu_netfilter_pass_to_next(NetClientState *s= ender, > int iovcnt, > void *opaque); > =20 > +void netfilter_print_info(NetFilterState *nf, char *output_str, int si= ze); > + > #endif /* QEMU_NET_FILTER_H */ > diff --git a/net/filter.c b/net/filter.c > index 5d90f83..40254bd 100644 > --- a/net/filter.c > +++ b/net/filter.c > @@ -128,6 +128,31 @@ static void netfilter_init(Object *obj) > NULL); > } > =20 > +void netfilter_print_info(NetFilterState *nf, char *output_str, int si= ze) > +{ > + char *str, *info; > + ObjectProperty *prop; > + ObjectPropertyIterator iter; > + StringOutputVisitor *ov; > + > + /* generate info str */ > + object_property_iter_init(&iter, OBJECT(nf)); > + while ((prop =3D object_property_iter_next(&iter))) { > + if (!strcmp(prop->name, "type")) { > + continue; > + } > + ov =3D string_output_visitor_new(false); > + object_property_get(OBJECT(nf), string_output_get_visitor(ov),= > + prop->name, NULL); > + str =3D string_output_get_string(ov); > + string_output_visitor_cleanup(ov); > + info =3D g_strdup_printf(",%s=3D%s", prop->name, str); =2E..but variable-sized print collection. Why not just rewrite the function to malloc the entire string, and ditch the fixed-size buffer and size parameters altogether, while at it? > + g_strlcat(output_str, info, size); > + g_free(str); > + g_free(info); > + } > +} > + > +++ b/net/net.c > @@ -1198,9 +1198,12 @@ void print_net_client(Monitor *mon, NetClientSta= te *nc) > } > QTAILQ_FOREACH(nf, &nc->filters, next) { > char *path =3D object_get_canonical_path_component(OBJECT(nf))= ; > + char info[256] =3D { 0 }; > + > + netfilter_print_info(nf, info, sizeof(info)); > monitor_printf(mon, " - %s: type=3D%s%s\n", path, > object_get_typename(OBJECT(nf)), > - nf->info_str); > + info); Or, instead of printing into a temporary string just to then replay that string to monitor_printf(), why not have netfilter_print_info() directly write to the monitor (that is, use monitor_printf() directly in the helper function, instead of g_strlcat() into a temporary string). --=20 Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org --iasPP4DpnnhgBvXpmqQFSNUd3EDu53x93 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Public key at http://people.redhat.com/eblake/eblake.gpg Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBCAAGBQJWpopEAAoJEKeha0olJ0NqNwkH/31Vom0/N614c7mJnvVtz0sw J6WGP8O4HwyDnoaVWlFP8+djJcKodGyH/mY27txSCmv7y3bGs0KnLBRmz8IAxqEW U3KpdajeNP/6fwIMYNsK4U/Vm4J+NU09LzO55CRc9WJsROGb7Z9a0W6pCg1+ZsrF QrHee5byxoNA9/4VHvXk5ki38RYOMw2xEoICIwA1iN9d1HJqNAGcTdlJ7/HASTdM 2CTKFkV4zIiIuaF83OvMBywy7wANQUsZmUJdTQCnWVRz2CpTY51/cYl9dxr0DxYP 3UY8n67cl8bUAzDN5Y0iBccNHSk0HWUegSFNeeEUjCSSezwRxXLJVF/asjNbEDM= =0NK9 -----END PGP SIGNATURE----- --iasPP4DpnnhgBvXpmqQFSNUd3EDu53x93--