xref: /netbsd-src/external/ibm-public/postfix/dist/src/util/mask_addr.c (revision e89934bbf778a6d6d6894877c4da59d0c7835b0f)
1 /*	$NetBSD: mask_addr.c,v 1.2 2017/02/14 01:16:49 christos Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	mask_addr 3
6 /* SUMMARY
7 /*	address bit banging
8 /* SYNOPSIS
9 /*	#include <mask_addr.h>
10 /*
11 /*	void	mask_addr(addr_bytes, addr_byte_count, network_bits)
12 /*	unsigned char *addr_bytes;
13 /*	unsigned addr_byte_count;
14 /*	unsigned network_bits;
15 /* DESCRIPTION
16 /*	mask_addr() clears all the host bits in the specified
17 /*	address.  The code can handle addresses of any length,
18 /*	and bytes of any width.
19 /*
20 /*	Arguments:
21 /* .IP addr_bytes
22 /*	The network address in network byte order.
23 /* .IP addr_byte_count
24 /*	The network address length in bytes.
25 /* .IP network_bits
26 /*	The number of initial bits that will not be cleared.
27 /* DIAGNOSTICS
28 /*	Fatal errors: the number of network bits exceeds the address size.
29 /* LICENSE
30 /* .ad
31 /* .fi
32 /*	The Secure Mailer license must be distributed with this software.
33 /* AUTHOR(S)
34 /*	Wietse Venema
35 /*	IBM T.J. Watson Research
36 /*	P.O. Box 704
37 /*	Yorktown Heights, NY 10598, USA
38 /*--*/
39 
40 /* System library. */
41 
42 #include <sys_defs.h>
43 #include <limits.h>			/* CHAR_BIT */
44 
45 /* Utility library. */
46 
47 #include <msg.h>
48 #include <mask_addr.h>
49 
50 /* mask_addr - mask off a variable-length address */
51 
mask_addr(unsigned char * addr_bytes,unsigned addr_byte_count,unsigned network_bits)52 void    mask_addr(unsigned char *addr_bytes,
53 		          unsigned addr_byte_count,
54 		          unsigned network_bits)
55 {
56     unsigned char *p;
57 
58     if (network_bits > addr_byte_count * CHAR_BIT)
59 	msg_panic("mask_addr: address byte count %d too small for bit count %d",
60 		  addr_byte_count, network_bits);
61 
62     p = addr_bytes + network_bits / CHAR_BIT;
63     network_bits %= CHAR_BIT;
64 
65     if (network_bits != 0)
66 	*p++ &= ~0U << (CHAR_BIT - network_bits);
67 
68     while (p < addr_bytes + addr_byte_count)
69 	*p++ = 0;
70 }
71