File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / charon-nm / nm / nm_handler.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 09:46:44 2020 UTC (4 years, 3 months ago) by misho
Branches: strongswan, MAIN
CVS tags: v5_9_2p0, v5_8_4p7, HEAD
Strongswan

    1: /*
    2:  * Copyright (C) 2016 Tobias Brunner
    3:  * Copyright (C) 2009 Martin Willi
    4:  * HSR Hochschule fuer Technik Rapperswil
    5:  *
    6:  * This program is free software; you can redistribute it and/or modify it
    7:  * under the terms of the GNU General Public License as published by the
    8:  * Free Software Foundation; either version 2 of the License, or (at your
    9:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
   10:  *
   11:  * This program is distributed in the hope that it will be useful, but
   12:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   13:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   14:  * for more details.
   15:  */
   16: 
   17: #include "nm_handler.h"
   18: 
   19: #include <daemon.h>
   20: #include <collections/array.h>
   21: 
   22: typedef struct private_nm_handler_t private_nm_handler_t;
   23: 
   24: /**
   25:  * Private data of an nm_handler_t object.
   26:  */
   27: struct private_nm_handler_t {
   28: 
   29: 	/**
   30: 	 * Public nm_handler_t interface.
   31: 	 */
   32: 	nm_handler_t public;
   33: 
   34: 	/**
   35: 	 * Received DNS server attributes, chunk_t
   36: 	 */
   37: 	array_t *dns;
   38: 
   39: 	/**
   40: 	 * Received IPv6 DNS server attributes, chunk_t
   41: 	 */
   42: 	array_t *dns6;
   43: 
   44: 	/**
   45: 	 * Received NBNS server attributes, chunk_t
   46: 	 */
   47: 	array_t *nbns;
   48: };
   49: 
   50: METHOD(attribute_handler_t, handle, bool,
   51: 	private_nm_handler_t *this, ike_sa_t *ike_sa,
   52: 	configuration_attribute_type_t type, chunk_t data)
   53: {
   54: 	array_t *list;
   55: 
   56: 	switch (type)
   57: 	{
   58: 		case INTERNAL_IP4_DNS:
   59: 			list = this->dns;
   60: 			break;
   61: 		case INTERNAL_IP6_DNS:
   62: 			list = this->dns6;
   63: 			break;
   64: 		case INTERNAL_IP4_NBNS:
   65: 			list = this->nbns;
   66: 			break;
   67: 		default:
   68: 			return FALSE;
   69: 	}
   70: 	data = chunk_clone(data);
   71: 	array_insert(list, ARRAY_TAIL, &data);
   72: 	return TRUE;
   73: }
   74: 
   75: METHOD(enumerator_t, enumerate_dns6, bool,
   76: 	enumerator_t *this, va_list args)
   77: {
   78: 	configuration_attribute_type_t *type;
   79: 	chunk_t *data;
   80: 
   81: 	VA_ARGS_VGET(args, type, data);
   82: 	*type = INTERNAL_IP6_DNS;
   83: 	*data = chunk_empty;
   84: 	this->venumerate = (void*)return_false;
   85: 	return TRUE;
   86: }
   87: 
   88: METHOD(enumerator_t, enumerate_nbns, bool,
   89: 	enumerator_t *this, va_list args)
   90: {
   91: 	configuration_attribute_type_t *type;
   92: 	chunk_t *data;
   93: 
   94: 	VA_ARGS_VGET(args, type, data);
   95: 	*type = INTERNAL_IP4_NBNS;
   96: 	*data = chunk_empty;
   97: 	/* enumerate IPv6 DNS server as next attribute ... */
   98: 	this->venumerate = _enumerate_dns6;
   99: 	return TRUE;
  100: }
  101: 
  102: /**
  103:  * Implementation of create_attribute_enumerator().enumerate() for DNS
  104:  */
  105: METHOD(enumerator_t, enumerate_dns, bool,
  106: 	enumerator_t *this, va_list args)
  107: {
  108: 	configuration_attribute_type_t *type;
  109: 	chunk_t *data;
  110: 
  111: 	VA_ARGS_VGET(args, type, data);
  112: 	*type = INTERNAL_IP4_DNS;
  113: 	*data = chunk_empty;
  114: 	/* enumerate WINS server as next attribute ... */
  115: 	this->venumerate = _enumerate_nbns;
  116: 	return TRUE;
  117: }
  118: 
  119: METHOD(attribute_handler_t, create_attribute_enumerator, enumerator_t*,
  120: 	private_nm_handler_t *this, ike_sa_t *ike_sa, linked_list_t *vips)
  121: {
  122: 	if (vips->get_count(vips))
  123: 	{
  124: 		enumerator_t *enumerator;
  125: 
  126: 		INIT(enumerator,
  127: 			/* enumerate DNS attribute first ... */
  128: 			.enumerate = enumerator_enumerate_default,
  129: 			.venumerate = _enumerate_dns,
  130: 			.destroy = (void*)free,
  131: 		);
  132: 		return enumerator;
  133: 	}
  134: 	return enumerator_create_empty();
  135: }
  136: 
  137: METHOD(nm_handler_t, create_enumerator, enumerator_t*,
  138: 	private_nm_handler_t *this, configuration_attribute_type_t type)
  139: {
  140: 	array_t *list;
  141: 
  142: 	switch (type)
  143: 	{
  144: 		case INTERNAL_IP4_DNS:
  145: 			list = this->dns;
  146: 			break;
  147: 		case INTERNAL_IP6_DNS:
  148: 			list = this->dns6;
  149: 			break;
  150: 		case INTERNAL_IP4_NBNS:
  151: 			list = this->nbns;
  152: 			break;
  153: 		default:
  154: 			return enumerator_create_empty();
  155: 	}
  156: 	return array_create_enumerator(list);
  157: }
  158: 
  159: METHOD(nm_handler_t, reset, void,
  160: 	private_nm_handler_t *this)
  161: {
  162: 	chunk_t chunk;
  163: 
  164: 	while (array_remove(this->dns, ARRAY_TAIL, &chunk))
  165: 	{
  166: 		chunk_free(&chunk);
  167: 	}
  168: 	while (array_remove(this->dns6, ARRAY_TAIL, &chunk))
  169: 	{
  170: 		chunk_free(&chunk);
  171: 	}
  172: 	while (array_remove(this->nbns, ARRAY_TAIL, &chunk))
  173: 	{
  174: 		chunk_free(&chunk);
  175: 	}
  176: }
  177: 
  178: METHOD(nm_handler_t, destroy, void,
  179: 	private_nm_handler_t *this)
  180: {
  181: 	reset(this);
  182: 	array_destroy(this->dns);
  183: 	array_destroy(this->dns6);
  184: 	array_destroy(this->nbns);
  185: 	free(this);
  186: }
  187: 
  188: /**
  189:  * See header
  190:  */
  191: nm_handler_t *nm_handler_create()
  192: {
  193: 	private_nm_handler_t *this;
  194: 
  195: 	INIT(this,
  196: 		.public = {
  197: 			.handler = {
  198: 				.handle = _handle,
  199: 				.release = nop,
  200: 				.create_attribute_enumerator = _create_attribute_enumerator,
  201: 			},
  202: 			.create_enumerator = _create_enumerator,
  203: 			.reset = _reset,
  204: 			.destroy = _destroy,
  205: 		},
  206: 		.dns = array_create(sizeof(chunk_t), 0),
  207: 		.dns6 = array_create(sizeof(chunk_t), 0),
  208: 		.nbns = array_create(sizeof(chunk_t), 0),
  209: 	);
  210: 
  211: 	return &this->public;
  212: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>