Annotation of embedaddon/dnsmasq/src/tables.c, revision 1.1.1.2
1.1 misho 1: /* tables.c is Copyright (c) 2014 Sven Falempin All Rights Reserved.
2:
3: Author's email: sfalempin@citypassenger.com
4:
5: This program is free software; you can redistribute it and/or modify
6: it under the terms of the GNU General Public License as published by
7: the Free Software Foundation; version 2 dated June, 1991, or
8: (at your option) version 3 dated 29 June, 2007.
9:
10: This program is distributed in the hope that it will be useful,
11: but WITHOUT ANY WARRANTY; without even the implied warranty of
12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: GNU General Public License for more details.
14:
15: You should have received a copy of the GNU General Public License
16: along with this program. If not, see <http://www.gnu.org/licenses/>.
17: */
18:
19: #include "dnsmasq.h"
20:
21: #if defined(HAVE_IPSET) && defined(HAVE_BSD_NETWORK)
22:
23: #include <string.h>
24:
25: #include <sys/types.h>
26: #include <sys/ioctl.h>
27:
28: #include <net/if.h>
29: #include <netinet/in.h>
30: #include <net/pfvar.h>
31:
32: #include <err.h>
33: #include <errno.h>
34: #include <fcntl.h>
35:
36: #define UNUSED(x) (void)(x)
37:
38: static char *pf_device = "/dev/pf";
39: static int dev = -1;
40:
41: static char *pfr_strerror(int errnum)
42: {
43: switch (errnum)
44: {
45: case ESRCH:
46: return "Table does not exist";
47: case ENOENT:
48: return "Anchor or Ruleset does not exist";
49: default:
50: return strerror(errnum);
51: }
52: }
53:
54:
55: void ipset_init(void)
56: {
57: dev = open( pf_device, O_RDWR);
58: if (dev == -1)
59: {
60: err(1, "%s", pf_device);
61: die (_("failed to access pf devices: %s"), NULL, EC_MISC);
62: }
63: }
64:
1.1.1.2 ! misho 65: int add_to_ipset(const char *setname, const union all_addr *ipaddr,
! 66: int flags, int remove)
1.1 misho 67: {
68: struct pfr_addr addr;
69: struct pfioc_table io;
70: struct pfr_table table;
71:
1.1.1.2 ! misho 72: if (dev == -1)
1.1 misho 73: {
74: my_syslog(LOG_ERR, _("warning: no opened pf devices %s"), pf_device);
75: return -1;
76: }
77:
78: bzero(&table, sizeof(struct pfr_table));
79: table.pfrt_flags |= PFR_TFLAG_PERSIST;
1.1.1.2 ! misho 80: if (strlen(setname) >= PF_TABLE_NAME_SIZE)
1.1 misho 81: {
82: my_syslog(LOG_ERR, _("error: cannot use table name %s"), setname);
83: errno = ENAMETOOLONG;
84: return -1;
85: }
86:
1.1.1.2 ! misho 87: if (strlcpy(table.pfrt_name, setname,
! 88: sizeof(table.pfrt_name)) >= sizeof(table.pfrt_name))
1.1 misho 89: {
90: my_syslog(LOG_ERR, _("error: cannot strlcpy table name %s"), setname);
91: return -1;
92: }
93:
1.1.1.2 ! misho 94: bzero(&io, sizeof io);
! 95: io.pfrio_flags = 0;
! 96: io.pfrio_buffer = &table;
! 97: io.pfrio_esize = sizeof(table);
! 98: io.pfrio_size = 1;
! 99: if (ioctl(dev, DIOCRADDTABLES, &io))
1.1 misho 100: {
1.1.1.2 ! misho 101: my_syslog(LOG_WARNING, _("IPset: error:%s"), pfr_strerror(errno));
! 102:
1.1 misho 103: return -1;
104: }
1.1.1.2 ! misho 105:
1.1 misho 106: table.pfrt_flags &= ~PFR_TFLAG_PERSIST;
1.1.1.2 ! misho 107: if (io.pfrio_nadd)
1.1 misho 108: my_syslog(LOG_INFO, _("info: table created"));
1.1.1.2 ! misho 109:
! 110: bzero(&addr, sizeof(addr));
! 111:
! 112: if (flags & F_IPV6)
! 113: {
! 114: addr.pfra_af = AF_INET6;
! 115: addr.pfra_net = 0x80;
! 116: memcpy(&(addr.pfra_ip6addr), ipaddr, sizeof(struct in6_addr));
! 117: }
! 118: else
! 119: {
! 120: addr.pfra_af = AF_INET;
! 121: addr.pfra_net = 0x20;
! 122: addr.pfra_ip4addr.s_addr = ipaddr->addr4.s_addr;
! 123: }
! 124:
1.1 misho 125: bzero(&io, sizeof(io));
126: io.pfrio_flags = 0;
127: io.pfrio_table = table;
128: io.pfrio_buffer = &addr;
129: io.pfrio_esize = sizeof(addr);
130: io.pfrio_size = 1;
131: if (ioctl(dev, ( remove ? DIOCRDELADDRS : DIOCRADDADDRS ), &io))
132: {
133: my_syslog(LOG_WARNING, _("warning: DIOCR%sADDRS: %s"), ( remove ? "DEL" : "ADD" ), pfr_strerror(errno));
134: return -1;
135: }
136:
137: my_syslog(LOG_INFO, _("%d addresses %s"),
138: io.pfrio_nadd, ( remove ? "removed" : "added" ));
139:
140: return io.pfrio_nadd;
141: }
142:
143:
144: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>