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