[libvirt] [PATCH 09/19] util: new internal function to permit silent failure of virNetDevSetMAC()
Michal Privoznik
mprivozn at redhat.com
Fri Mar 17 13:32:48 UTC 2017
On 03/10/2017 09:35 PM, Laine Stump wrote:
> We will want to allow silent failure of virNetDevSetMAC() in the case
> that the SIOSIFHWADDR ioctl fails with errno == EADDRNOTAVAIL. (Yes,
> that is very specific, but we really *do* want a logged failure in all
> other circumstances, and don't want to duplicate code in the caller
> for the other possibilities).
>
> This patch renames the 3 different virNetDevSetMAC() functions to
> virNetDevSetMACInternal(), adding a 3rd arg called "quiet" and making
> them static (because this extra control will only be needed within
> virnetdev.c). A new global virNetDevSetMAC() is defined that calls
> whichever of the three *Internal() functions gets compiled with quiet
> = false. Callers in virnetdev.c that want to notice a failure with
> errno == EADDRNOTAVAIL and retry with a different strategy rather than
> immediately failing, can call virNetDevSetMACInternal(..., true).
> ---
> src/util/virnetdev.c | 51 +++++++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 41 insertions(+), 10 deletions(-)
>
> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
> index 766638d..ffc2fb4 100644
> --- a/src/util/virnetdev.c
> +++ b/src/util/virnetdev.c
> @@ -222,17 +222,20 @@ int virNetDevExists(const char *ifname)
> #if defined(SIOCGIFHWADDR) && defined(SIOCSIFHWADDR) && \
> defined(HAVE_STRUCT_IFREQ)
> /**
> - * virNetDevSetMAC:
> + * virNetDevSetMACInternal:
> * @ifname: interface name to set MTU for
> * @macaddr: MAC address
> + * @quiet: true if a failure to set MAC address with errno == EADDRNOTAVAIL
> + * should be silent (still returns error, but without log)
> *
> - * This function sets the @macaddr for a given interface @ifname. This
> - * gets rid of the kernel's automatically assigned random MAC.
> + * This function sets the @macaddr for a given interface @ifname.
> *
> * Returns 0 in case of success or -1 on failure
> */
> -int virNetDevSetMAC(const char *ifname,
> - const virMacAddr *macaddr)
> +static int
> +virNetDevSetMACInternal(const char *ifname,
> + const virMacAddr *macaddr,
> + bool quiet)
> {
> int fd = -1;
> int ret = -1;
> @@ -254,6 +257,9 @@ int virNetDevSetMAC(const char *ifname,
> if (ioctl(fd, SIOCSIFHWADDR, &ifr) < 0) {
> char macstr[VIR_MAC_STRING_BUFLEN];
>
> + if (quiet && errno == EADDRNOTAVAIL)
> + goto cleanup;
> +
> virReportSystemError(errno,
> _("Cannot set interface MAC to %s on '%s'"),
> virMacAddrFormat(macaddr, macstr), ifname);
Frankly, I like functions with quiet = true to be really silent. But I
don't care that much.
ACK
Michal
More information about the libvir-list
mailing list