X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fin-addr-util.c;h=9dc9ec82b484eb4c97976ab1de7d50cf9561eff0;hp=5fbee6caf2fcbf0562c6b35b83eba3cb92f7ec3b;hb=a354329f724d6ce913d2ccffb2be8f3327a67faa;hpb=df40eee8edccb6bf09a57c2b96f69d233032ce52 diff --git a/src/shared/in-addr-util.c b/src/shared/in-addr-util.c index 5fbee6caf..9dc9ec82b 100644 --- a/src/shared/in-addr-util.c +++ b/src/shared/in-addr-util.c @@ -250,21 +250,20 @@ unsigned in_addr_netmask_to_prefixlen(const struct in_addr *addr) { } int in_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen) { - uint32_t address; + uint8_t msb_octet = *(uint8_t*) addr; + + /* addr may not be aligned, so make sure we only access it byte-wise */ assert(addr); - assert(addr->s_addr != INADDR_ANY); assert(prefixlen); - address = be32toh(addr->s_addr); - - if ((address >> 31) == 0x0) + if (msb_octet < 128) /* class A, leading bits: 0 */ *prefixlen = 8; - else if ((address >> 30) == 0x2) + else if (msb_octet < 192) /* class B, leading bits 10 */ *prefixlen = 16; - else if ((address >> 29) == 0x6) + else if (msb_octet < 224) /* class C, leading bits 110 */ *prefixlen = 24; else