/*
 * Copyright (c) 2001, 2002, 2003, 2004, 2005  Netli, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $Id: ncnf_vr.h,v 1.1 2005/05/26 12:08:19 vlm Exp $
 */
/*
 * Validation engine.
 */
#ifndef	__NCNF_VR_H__
#define	__NCNF_VR_H__

#include "headers.h"

enum _vr_tokens {
	VR_GLOBAL	= 0,
	VR_ENTITY	= 1,
	VR_ENTITY_TYPE	= 2,
	VR_ENTITY_NAME	= 3,
	VR_TYPE		= 1,
	VR_TYPE_NAME	= 2,
	VR_TYPE_TYPE	= 3,
	VR_TYPE_VALUE	= 4,
	VR_RULE_MO	= 1,
	VR_RULE_SM	= 2,
	VR_RULE_EA	= 3,
	VR_RULE_NAME	= 4,
	VR_RULE_RANGE	= 5,
	VR_RULE_RANGE_VALUE	= 6,
	VR_RULE_REGEX	= 5,
	VR_RULE_REGEX_VALUE	= 6,
	VR_RULE_TYPE	= 5,
	VR_RULE_TYPE_NAME	= 6,
	VR_TOKENS_MAX	= 7
};

#define	VR_STR_ENTITY	"entity"
#define	VR_STR_TYPE	"type"
#define	VR_STR_REGEX	"regex"
#define	VR_STR_SINGLE	"single"
#define	VR_STR_MULTIPLE	"multiple"
#define	VR_STR_MANDATORY	"mandatory"
#define	VR_STR_OPTIONAL	"optional"
#define	VR_STR_ATTRIBUTE	"attribute"
#define	VR_STR_REFERENCE	"reference"
#define	VR_STR_ATTACH	"attach"
#define	VR_STR_RANGE	"range"
#define	VR_STR_IP	"ip"
#define	VR_STR_IP_MASK	"ip_mask"
#define	VR_STR_IP_MASKLEN	"ip_masklen"
#define	VR_STR_IP_PORT	"ip_port"
#define	VR_STR_VALIDATOR_ENTITY	"_validator-entity"

enum vr_obj_class {
	VR_CLASS_ATTRIBUTE	= 0,
	VR_CLASS_ENTITY		= 1,
	VR_CLASS_REFERENCE	= 2,
	VR_CLASS_ATTACHMENT	= 3,
};

/*
 * Type, i.e.: range, regex, and others.
 */
struct vr_type {
	char *name;
	int standalone;	/* Not in the hash */

	char *regex;
#ifdef	HAVE_LIBSTRFUNC
	sed_t *regex_compiled;
#endif	/* HAVE_LIBSTRFUNC */

	int range_defined;
	double range_start;
	double range_end;

	int ip_required;
	int ip_mask_required;
	int ip_masklen_required;
	int ip_port_required;
};

/*
 * Basic rule line:
 */
struct vr_rule {
	int mandatory;
	int multiple;
	enum vr_obj_class vr_obj_class;

	char *name;	/* Destination object name */

	int _entity_reference;

	struct vr_type *type;

	struct vr_rule *next;
};

/*
 * Entity containing ruleset:
 */
struct vr_entity {
	char *type;
	char *name;
	int already_here;
	struct vr_rule *rules;
};

/*
 * The whole configuration.
 */
struct vr_config {
	genhash_t *types;
	genhash_t *entities;
};

struct vr_config *ncnf_vr_read(const char *filename);
int ncnf_validate(struct ncnf_obj_s *, struct vr_config *);
void ncnf_vr_destroy(struct vr_config *);

struct vr_entity *_vr_get_entity(struct vr_config *vc, char *name, char *type, int create);
struct vr_type *_vr_add_type(struct vr_config *vc, char *name,
	char *type, char *value, int line);
void _vr_destroy_type(void *vr);
int _vr_add_rule(int line, struct vr_config *vc, struct vr_entity *e,
	char *mo, char *sm, char *ea, char *name, char *a, char *v);

#endif /* __NCNF_VR_H__ */


syntax highlighted by Code2HTML, v. 0.9.1