From 58a876e5ac9539ff14acb7dc3ea3633f5bdb41d8 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 23 Oct 2014 20:02:59 +0100 Subject: [PATCH 1/1] enums: Add `sizeforce' member value 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 --- src/adns.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/adns.h b/src/adns.h index 5765e55..e248c10 100644 --- a/src/adns.h +++ b/src/adns.h @@ -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,/* % 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; -- 2.30.2