diff options
author | Ollivier Robert <roberto@FreeBSD.org> | 2008-08-17 17:37:33 +0000 |
---|---|---|
committer | Ollivier Robert <roberto@FreeBSD.org> | 2008-08-17 17:37:33 +0000 |
commit | cce65f439697627afbccf5a67035a957bb4d784a (patch) | |
tree | 16d100fbc9dae63888d48b464e471ba0e5065193 /libntp/netof.c | |
parent | 8c24a1e0ffd629427f94da1b681600008030c41a (diff) |
Notes
Diffstat (limited to 'libntp/netof.c')
-rw-r--r-- | libntp/netof.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/libntp/netof.c b/libntp/netof.c new file mode 100644 index 000000000000..fd57568d3130 --- /dev/null +++ b/libntp/netof.c @@ -0,0 +1,48 @@ +/* + * netof - return the net address part of an ip address in a sockaddr_storage structure + * (zero out host part) + */ +#include <stdio.h> + +#include "ntp_fp.h" +#include "ntp_stdlib.h" +#include "ntp.h" + +#define NUM_NETOF_BUFS 10 +static struct sockaddr_storage ssbuf[NUM_NETOF_BUFS]; +static int next_ssbuf = 0; + +struct sockaddr_storage* +netof( + struct sockaddr_storage* hostaddr + ) +{ + register u_int32 netnum; + struct sockaddr_storage *netaddr; + + netaddr = &ssbuf[next_ssbuf++]; + if (next_ssbuf == NUM_NETOF_BUFS) + next_ssbuf = 0; + memcpy(netaddr, hostaddr, sizeof(struct sockaddr_storage)); + + if(netaddr->ss_family == AF_INET) { + netnum = ((struct sockaddr_in*)netaddr)->sin_addr.s_addr; + + /* + * We live in a modern CIDR world where the basement nets, which + * used to be class A, are now probably associated with each + * host address. So, for class-A nets, all bits are significant. + */ + if(IN_CLASSC(netnum)) + netnum &= IN_CLASSC_NET; + else if (IN_CLASSB(netnum)) + netnum &= IN_CLASSB_NET; + ((struct sockaddr_in*)netaddr)->sin_addr.s_addr = netnum; + } + else if(netaddr->ss_family == AF_INET6) { + /* Here we put 0 at the local link address so we get net address */ + memset(&((struct sockaddr_in6*)netaddr)->sin6_addr.s6_addr[8], 0, 8*sizeof(u_char)); + } + + return netaddr; +} |