]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: Turn virFirewallAddRule() into a macro
authorAndrea Bolognani <abologna@redhat.com>
Mon, 2 Jan 2017 18:15:30 +0000 (19:15 +0100)
committerAndrea Bolognani <abologna@redhat.com>
Wed, 4 Jan 2017 10:14:56 +0000 (11:14 +0100)
Clang 3.9 refuses to compile the existing code with the
following error:

  util/virfirewall.c:425:20: error: passing an object that undergoes
                             default argument promotion to 'va_start'
                             has undefined behavior [-Werror,-Wvarargs]
      va_start(args, layer);
                     ^
  util/virfirewall.c:420:37: note: parameter of type 'virFirewallLayer'
                             is declared here
                     virFirewallLayer layer,
                                      ^

This happens because 'layer' is of type virFirewallLayer, which
is an enum type and not a standard type such as eg. void* or int.

To solve the issue, turn virFirewallAddRule() from a very thin
wrapper around virFirewallAddRuleFullV() to a macro that expands
to a call to virFirewallAddRuleFull() - itself a very thin wrapper
around the aforementioned virFirewallAddRuleFullV() - with no loss
of functionality or type safety.

src/libvirt_private.syms
src/util/virfirewall.c
src/util/virfirewall.h

index 2d23e462d71490146ec7e680f35b1fba8909b407..01118730bc5d3f3381ddef16f92f0c7fdb685f1b 100644 (file)
@@ -1624,7 +1624,6 @@ virFindFileInPath;
 
 
 # util/virfirewall.h
-virFirewallAddRule;
 virFirewallAddRuleFull;
 virFirewallApply;
 virFirewallFree;
index 3f976186a6714a1f51135a56e1f6f83c47e0b8b9..4de38d592467736c7045b04f3246f3d3994f7b1d 100644 (file)
@@ -405,29 +405,6 @@ virFirewallAddRuleFullV(virFirewallPtr firewall,
     return NULL;
 }
 
-/**
- * virFirewallAddRule:
- * @firewall: firewall ruleset to add to
- * @layer: the firewall layer to change
- * @...: NULL terminated list of strings for the rule
- *
- * Add any type of rule to the firewall ruleset.
- *
- * Returns the new rule
- */
-virFirewallRulePtr
-virFirewallAddRule(virFirewallPtr firewall,
-                   virFirewallLayer layer,
-                   ...)
-{
-    virFirewallRulePtr rule;
-    va_list args;
-    va_start(args, layer);
-    rule = virFirewallAddRuleFullV(firewall, layer, false, NULL, NULL, args);
-    va_end(args);
-    return rule;
-}
-
 
 /**
  * virFirewallAddRuleFull:
index dbf397537fa82b06b60c67fa3036a609a338ff2e..5248d600391b374fe5345f26954f29dd66807391 100644 (file)
@@ -44,10 +44,18 @@ virFirewallPtr virFirewallNew(void);
 
 void virFirewallFree(virFirewallPtr firewall);
 
-virFirewallRulePtr virFirewallAddRule(virFirewallPtr firewall,
-                                      virFirewallLayer layer,
-                                      ...)
-    ATTRIBUTE_SENTINEL;
+/**
+ * virFirewallAddRule:
+ * @firewall: firewall ruleset to add to
+ * @layer: the firewall layer to change
+ * @...: NULL terminated list of strings for the rule
+ *
+ * Add any type of rule to the firewall ruleset.
+ *
+ * Returns the new rule
+ */
+#define virFirewallAddRule(firewall, layer, ...) \
+        virFirewallAddRuleFull(firewall, layer, false, NULL, NULL, __VA_ARGS__)
 
 typedef int (*virFirewallQueryCallback)(virFirewallPtr firewall,
                                         const char *const *lines,