chiark / gitweb /
shared: add MAXSIZE() and use it in resolved
authorDavid Herrmann <dh.herrmann@gmail.com>
Fri, 22 Aug 2014 11:55:57 +0000 (13:55 +0200)
committerDavid Herrmann <dh.herrmann@gmail.com>
Fri, 22 Aug 2014 12:01:05 +0000 (14:01 +0200)
The MAXSIZE() macro takes two types and returns the size of the larger
one. It is much simpler to use than MAX(sizeof(A), sizeof(B)) and also
avoids any compiler-extensions, unlike CONST_MAX() and MAX() (which are
needed to avoid evaluating arguments more than once). This was suggested
by Daniele Nicolodi <daniele@grinta.net>.

Also make resolved use this macro instead of CONST_MAX(). This enhances
readability quite a bit.

src/resolve/resolved-dns-stream.c
src/resolve/resolved-manager.c
src/shared/macro.h
src/test/test-util.c

index 8b3a3ced4b7724341736a8928a70afb2f7910da8..8aad5e4df1cc330692d4e77835cc4abea7bc1cc8 100644 (file)
@@ -64,7 +64,7 @@ static int dns_stream_complete(DnsStream *s, int error) {
 static int dns_stream_identify(DnsStream *s) {
         union {
                 struct cmsghdr header; /* For alignment */
-                uint8_t buffer[CMSG_SPACE(CONST_MAX(sizeof(struct in_pktinfo), sizeof(struct in6_pktinfo)))
+                uint8_t buffer[CMSG_SPACE(MAXSIZE(struct in_pktinfo, struct in6_pktinfo))
                                + EXTRA_CMSG_SPACE /* kernel appears to require extra space */];
         } control;
         struct msghdr mh = {};
index 56baf8730d9925cb7edec3921437b7ca8ae3ae5f..659b1dacc8d2f08432aa5105fb60782ed5d669b1 100644 (file)
@@ -841,7 +841,7 @@ int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
         _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
         union {
                 struct cmsghdr header; /* For alignment */
-                uint8_t buffer[CMSG_SPACE(CONST_MAX(sizeof(struct in_pktinfo), sizeof(struct in6_pktinfo)))
+                uint8_t buffer[CMSG_SPACE(MAXSIZE(struct in_pktinfo, struct in6_pktinfo))
                                + CMSG_SPACE(int) /* ttl/hoplimit */
                                + EXTRA_CMSG_SPACE /* kernel appears to require extra buffer space */];
         } control;
index 179b24c9838971d1609d1ce74d027f497ea55801..43fa3e556f33e2de9cd4b25dcede05152461763f 100644 (file)
@@ -149,6 +149,9 @@ static inline unsigned long ALIGN_POWER2(unsigned long u) {
                 ((_A) > (_B)) ? (_A) : (_B),                            \
                 (void)0))
 
+/* takes two types and returns the size of the larger one */
+#define MAXSIZE(A, B) (sizeof(union _packed_ { typeof(A) a; typeof(B) b; }))
+
 #define MAX3(x,y,z)                                     \
         __extension__ ({                                \
                         const typeof(x) _c = MAX(x,y);  \
index ac1afce86b922b3c090cb0dd25696a1ea7041330..34d5f2ed7d235be3510ca49c66eaccc1f9197195 100644 (file)
@@ -90,6 +90,10 @@ static void test_max(void) {
         assert_se(val1.a == 100);
         assert_se(MAX(++d, 0) == 1);
         assert_se(d == 1);
+
+        assert_cc(MAXSIZE(char[3], uint16_t) == 3);
+        assert_cc(MAXSIZE(char[3], uint32_t) == 4);
+        assert_cc(MAXSIZE(char, long) == sizeof(long));
 }
 
 static void test_first_word(void) {