1254219Scy/*
2254219Scy * Copyright (C) 2012 by Darren Reed.
3254219Scy *
4254219Scy * See the IPFILTER.LICENCE file for details on licencing.
5254219Scy *
6254219Scy * $Id: load_dstlistnode.c,v 1.1.2.5 2012/07/22 08:04:24 darren_r Exp $
7254219Scy */
8254219Scy
9254219Scy#include <fcntl.h>
10254219Scy#include <sys/ioctl.h>
11254219Scy#include "ipf.h"
12254219Scy#include "netinet/ip_lookup.h"
13254219Scy#include "netinet/ip_pool.h"
14254219Scy
15254219Scy
16254219Scyint
17254219Scyload_dstlistnode(role, name, node, iocfunc)
18254219Scy	int role;
19254219Scy	char *name;
20254219Scy	ipf_dstnode_t *node;
21254219Scy	ioctlfunc_t iocfunc;
22254219Scy{
23254219Scy	iplookupop_t op;
24254219Scy	frdest_t *dst;
25254219Scy	char *what;
26254219Scy	int err;
27254219Scy
28254219Scy	if (pool_open() == -1)
29254219Scy		return -1;
30254219Scy
31254219Scy	dst = calloc(1, sizeof(*dst) + node->ipfd_dest.fd_name);
32254219Scy	if (dst == NULL)
33254219Scy		return -1;
34254219Scy
35254219Scy	op.iplo_unit = role;
36254219Scy	op.iplo_type = IPLT_DSTLIST;
37254219Scy	op.iplo_arg = 0;
38254219Scy	op.iplo_struct = dst;
39254219Scy	op.iplo_size = sizeof(*dst);
40254219Scy	if (node->ipfd_dest.fd_name >= 0)
41254219Scy		op.iplo_size += node->ipfd_dest.fd_name;
42254219Scy	(void) strncpy(op.iplo_name, name, sizeof(op.iplo_name));
43254219Scy
44254219Scy	dst->fd_addr = node->ipfd_dest.fd_addr;
45254219Scy	dst->fd_type = node->ipfd_dest.fd_type;
46254219Scy	dst->fd_name = node->ipfd_dest.fd_name;
47254219Scy	if (node->ipfd_dest.fd_name >= 0)
48254219Scy		bcopy(node->ipfd_names, (char *)dst + sizeof(*dst),
49254219Scy		      node->ipfd_dest.fd_name);
50254219Scy
51254219Scy	if ((opts & OPT_REMOVE) == 0) {
52254219Scy		what = "add";
53254219Scy		err = pool_ioctl(iocfunc, SIOCLOOKUPADDNODE, &op);
54254219Scy	} else {
55254219Scy		what = "delete";
56254219Scy		err = pool_ioctl(iocfunc, SIOCLOOKUPDELNODE, &op);
57254219Scy	}
58254219Scy	free(dst);
59254219Scy
60254219Scy	if (err != 0) {
61254219Scy		if ((opts & OPT_DONOTHING) == 0) {
62254219Scy			char msg[80];
63254219Scy
64254219Scy			(void) sprintf(msg, "%s lookup node", what);
65254219Scy			return ipf_perror_fd(pool_fd(), iocfunc, msg);
66254219Scy		}
67254219Scy	}
68254219Scy
69254219Scy	return 0;
70254219Scy}
71