1e1dd16dngie/*
2e1dd16dngie * Copyright (C) 2012 by Darren Reed.
3e1dd16dngie *
4e1dd16dngie * See the IPFILTER.LICENCE file for details on licencing.
5e1dd16dngie *
6e1dd16dngie * $Id: load_dstlist.c,v 1.1.2.5 2012/07/22 08:04:24 darren_r Exp $
7e1dd16dngie */
8e1dd16dngie
9e1dd16dngie#include <fcntl.h>
10e1dd16dngie#include <sys/ioctl.h>
11e1dd16dngie#include "ipf.h"
12e1dd16dngie#include "netinet/ip_lookup.h"
13e1dd16dngie#include "netinet/ip_dstlist.h"
14e1dd16dngie
15e1dd16dngie
16e1dd16dngieint
17e1dd16dngieload_dstlist(dst, iocfunc, nodes)
18e1dd16dngie	ippool_dst_t *dst;
19e1dd16dngie	ioctlfunc_t iocfunc;
20e1dd16dngie	ipf_dstnode_t *nodes;
21e1dd16dngie{
22e1dd16dngie	iplookupop_t op;
23e1dd16dngie	ipf_dstnode_t *a;
24e1dd16dngie	ippool_dst_t dest;
25e1dd16dngie
26e1dd16dngie	if (dst->ipld_name[0] == '\0')
27e1dd16dngie		return -1;
28e1dd16dngie
29e1dd16dngie	if (pool_open() == -1)
30e1dd16dngie		return -1;
31e1dd16dngie
32e1dd16dngie	op.iplo_unit = dst->ipld_unit;
33e1dd16dngie	op.iplo_type = IPLT_DSTLIST;
34e1dd16dngie	op.iplo_arg = 0;
35e1dd16dngie	strncpy(op.iplo_name, dst->ipld_name, sizeof(op.iplo_name));
36e1dd16dngie	op.iplo_size = sizeof(dest);
37e1dd16dngie	op.iplo_struct = &dest;
38e1dd16dngie	bzero((char *)&dest, sizeof(dest));
39e1dd16dngie	dest.ipld_unit = dst->ipld_unit;
40e1dd16dngie	dest.ipld_policy = dst->ipld_policy;
41e1dd16dngie	dest.ipld_flags = dst->ipld_flags;
42e1dd16dngie	strncpy(dest.ipld_name, dst->ipld_name, sizeof(dest.ipld_name));
43e1dd16dngie
44e1dd16dngie	if ((opts & OPT_REMOVE) == 0) {
45e1dd16dngie		if (pool_ioctl(iocfunc, SIOCLOOKUPADDTABLE, &op))
46e1dd16dngie			if ((opts & OPT_DONOTHING) == 0) {
47e1dd16dngie				return ipf_perror_fd(pool_fd(), iocfunc,
48e1dd16dngie						  "add destination list table");
49e1dd16dngie			}
50e1dd16dngie	}
51e1dd16dngie
52e1dd16dngie	if ((opts & OPT_VERBOSE) != 0) {
53e1dd16dngie		dest.ipld_dests = dst->ipld_dests;
54e1dd16dngie		printdstlist(&dest, bcopywrap, dest.ipld_name, opts, nodes, NULL);
55e1dd16dngie		dest.ipld_dests = NULL;
56e1dd16dngie	}
57e1dd16dngie
58e1dd16dngie	for (a = nodes; a != NULL; a = a->ipfd_next)
59e1dd16dngie		load_dstlistnode(dst->ipld_unit, dest.ipld_name, a, iocfunc);
60e1dd16dngie
61e1dd16dngie	if ((opts & OPT_REMOVE) != 0) {
62e1dd16dngie		if (pool_ioctl(iocfunc, SIOCLOOKUPDELTABLE, &op))
63e1dd16dngie			if ((opts & OPT_DONOTHING) == 0) {
64e1dd16dngie				return ipf_perror_fd(pool_fd(), iocfunc,
65e1dd16dngie					      "delete destination list table");
66e1dd16dngie			}
67e1dd16dngie	}
68e1dd16dngie	return 0;
69e1dd16dngie}
70