[libvirt] PATCH: Fix passing of ifname to QEMU

Jim Meyering jim at meyering.net
Fri Jan 30 15:52:11 UTC 2009


"Daniel P. Berrange" <berrange at redhat.com> wrote:
> When using the type='ethernet'  network device configuration for a guest
> we pass a script, and optional interface name to QEMU. If ifname is
> omitted, then QEMU allocates one itself. The problem was we were passing
> an ifname of '(null)' by mistake. This patch corrects that problem and
> adds a test for it.
>
> Daniel
>
> diff -r b6a065030fa6 src/qemu_conf.c
> --- a/src/qemu_conf.c	Fri Jan 30 12:28:00 2009 +0000
> +++ b/src/qemu_conf.c	Fri Jan 30 13:07:11 2009 +0000
> @@ -1147,11 +1147,18 @@ int qemudBuildCommandLine(virConnectPtr
>              case VIR_DOMAIN_NET_TYPE_ETHERNET:
>                  {
>                      char arg[PATH_MAX];
> -                    if (snprintf(arg, PATH_MAX-1, "tap,ifname=%s,script=%s,vlan=%d",
> -                                 net->ifname,
> -                                 net->data.ethernet.script,
> -                                 vlan) >= (PATH_MAX-1))
> -                        goto error;


> +                    if (net->ifname) {
> +                        if (snprintf(arg, PATH_MAX-1, "tap,ifname=%s,script=%s,vlan=%d",
> +                                     net->ifname,
> +                                     net->data.ethernet.script,
> +                                     vlan) >= (PATH_MAX-1))
> +                            goto error;
> +                    } else {
> +                        if (snprintf(arg, PATH_MAX-1, "tap,script=%s,vlan=%d",
> +                                     net->data.ethernet.script,
> +                                     vlan) >= (PATH_MAX-1))
> +                            goto error;
> +                    }


Along the way, it'd be nice to use "sizeof(arg)-1" in place of
PATH_MAX-1.

That format string and arg list are long enough
that it'd be good not to duplicate them.
How about this instead?

             char if_buf[PATH_MAX];
             if_buf[0] = 0;
             if (net->ifname
                 && (snprintf(if_buf, sizeof(if_buf), ",script=%s", ifname)
                     >= sizeof(if_buf)-1))
                 goto error;

             if (snprintf(arg, sizeof(arg), "tap%s,script=%s,vlan=%d",
                          if_buf,
                          net->data.ethernet.script,
                          vlan) >= sizeof(arg)-1))
                 goto error;

+1 for the test
ACK either way.




More information about the libvir-list mailing list