enums: Add `sizeforce' member value
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 23 Oct 2014 19:02:59 +0000 (20:02 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 24 Oct 2014 17:58:43 +0000 (18:58 +0100)
The C standard helpfully permits enums with a small range of values to
be short.  This effect is not desirable in an API because it means that
adding new values (new flags, say) may cause ABI incompatibility.

Add some `sizeforce' members to relevant enums in the API.  In none of
the three cases do we expect this to actually cause an ABI break on
actual practical platforms, because the values we choose are within
the same power-of-two bitwidth.

Specifically:

                    max value in adns 1.4       new max value
  adns_initflags            0x0300                    0x7fff
  adns_queryflags       0x0ff00000                0x7fffffff
  adns_rrtype              0x20000                0x7fffffff
  adns_status                  499                 unchanged

The small max value of adns_initflags is unfortunate.  But we can't
change it without actually breaking the ABI on actual existing
platforms.  We can put off biting that bullet until we run out of
initflags - there are still three flags remaining.

This patch is not expected to have any practical effect with existing
platforms and compilers but it makes the code more correct and less
likely to be misoptimised by a future aggressive compiler.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/adns.h

index 5765e55..e248c10 100644 (file)
@@ -110,13 +110,14 @@ typedef enum { /* In general, or together the desired flags: */
 
  adns_if_permit_ipv4= 0x0400,/* allow _addr queries to return IPv4 addresses  */
  adns_if_permit_ipv6= 0x0800,/* allow _addr queries to return IPv6 addresses */
- adns_if_afmask=      0x0c00
+ adns_if_afmask=      0x0c00,
    /* These are policy flags, and overridden by the adns_af:... option in
     * resolv.conf.  If the adns_qf_want_... query flags are incompatible with
     * these settings (in the sense that no address families are permitted at
     * all) then the query flags take precedence; otherwise only records which
     * satisfy all of the stated requirements are allowed.
     */
+ adns__if_sizeforce= 0x7fff,
 } adns_initflags;
 
 typedef enum { /* In general, or together the desired flags: */
@@ -145,7 +146,8 @@ typedef enum { /* In general, or together the desired flags: */
  adns_qf_addrlit_scope_numeric=0x00004000,/* %<scope> may only be numeric */
  adns_qf_addrlit_ipv4_quadonly=0x00008000,/* reject non-dotted-quad ipv4 */
 
- adns__qf_internalmask=  0x0ff00000
+ adns__qf_internalmask=  0x0ff00000,
+ adns__qf_sizeforce=     0x7fffffff
 } adns_queryflags;
 
 typedef enum {
@@ -214,7 +216,9 @@ typedef enum {
  adns_r_srv_raw=         33,
  adns_r_srv=                 adns_r_srv_raw|adns__qtf_deref,
                     
- adns_r_addr=                adns_r_a|adns__qtf_deref
+ adns_r_addr=                adns_r_a|adns__qtf_deref,
+
+ adns__rrt_sizeforce= 0x7fffffff,
  
 } adns_rrtype;