FreeBSD-5.3/usr.sbin/atm/scspd/scsp_config_parse.y

%{
/*
 *
 * ===================================
 * HARP  |  Host ATM Research Platform
 * ===================================
 *
 *
 * This Host ATM Research Platform ("HARP") file (the "Software") is
 * made available by Network Computing Services, Inc. ("NetworkCS")
 * "AS IS".  NetworkCS does not provide maintenance, improvements or
 * support of any kind.
 *
 * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
 * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
 * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
 * In no event shall NetworkCS be responsible for any damages, including
 * but not limited to consequential damages, arising from or relating to
 * any use of the Software or related support.
 *
 * Copyright 1994-1998 Network Computing Services, Inc.
 *
 * Copies of this Software may be made, however, the above copyright
 * notice must be reproduced on all copies.
 *
 *	@(#) $FreeBSD: src/usr.sbin/atm/scspd/scsp_config_parse.y,v 1.5 2002/10/10 00:32:55 alfred Exp $
 *
 */


/*
 * Server Cache Synchronization Protocol (SCSP) Support
 * ----------------------------------------------------
 *
 * YACC input for configuration file processing
 *
 */

#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netatm/port.h> 
#include <netatm/queue.h> 
#include <netatm/atm.h>
#include <netatm/atm_if.h>
#include <netatm/atm_sap.h>
#include <netatm/atm_sys.h>
#include <netatm/atm_ioctl.h>

#include <libatm.h>
#if __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>

#include "scsp_msg.h"
#include "scsp_if.h"
#include "scsp_var.h"

#ifndef lint
__RCSID("@(#) $FreeBSD: src/usr.sbin/atm/scspd/scsp_config_parse.y,v 1.5 2002/10/10 00:32:55 alfred Exp $");
#endif


void	yyerror(char *);
%}


/*
 * Token value definition
 */
%union {
	char		*tv_alpha;
	int		tv_int;
	char		*tv_hex;
}


/*
 * Token types returned by scanner
 */
%token	<tv_alpha>	TOK_NAME
%token	<tv_int>	TOK_INTEGER
%token	<tv_hex>	TOK_HEX

/*
 * Reserved words
 */
%token			TOK_ATMARP
%token			TOK_DCS
%token			TOK_DCS_ADDR
%token			TOK_DCS_CA_REXMIT_INT
%token			TOK_DCS_CSUS_REXMIT_INT
%token			TOK_DCS_CSU_REXMIT_INT
%token			TOK_DCS_CSU_REXMIT_MAX
%token			TOK_DCS_HELLO_DF
%token			TOK_DCS_HELLO_INT
%token			TOK_DCS_HOP_CNT
%token			TOK_DCS_ID
%token			TOK_DHCP
%token			TOK_FAMILY
%token			TOK_LFN
%token			TOK_LNNI
%token			TOK_LOG
%token			TOK_MARS
%token			TOK_NETIF
%token			TOK_NHRP
%token			TOK_PROTOCOL
%token			TOK_SERVER
%token			TOK_SRVGRP
%token			TOK_SYSLOG


%%
cfg_file: /* Empty */
	| stmt_seq

stmt_seq: stmt
	| stmt_seq stmt
	;

stmt:	server_stmt ';'
	| log_stmt ';'
	;

/*
 * SCSP server definition statements
 */
server_stmt: TOK_SERVER TOK_NAME
	{
		int	rc;

		rc = start_server($2);
		free($2);
		if (rc)
			return(rc);
	}
	'{' server_def '}'
	{
		int	rc;

		rc = finish_server();
		if (rc)
			return(rc);
	}
	;

server_def: server_spec ';'
	| server_def server_spec ';'
	;

server_spec: /* Nothing */
	| dcs_stmt
	| TOK_NETIF TOK_NAME
	{
		int	rc;

		/*
		 * Configure the network interface
		 */
		rc = set_intf($2);
		free($2);
		if (rc)
			return(rc);
	}
	| TOK_PROTOCOL TOK_ATMARP
	{
		int	rc;

		/*
		 * Configure the protocol
		 */
		rc = set_protocol(SCSP_PROTO_ATMARP);
		if (rc)
			return(rc);
	}
	| TOK_PROTOCOL TOK_DHCP | TOK_LNNI | TOK_MARS | TOK_NHRP
	{
		yyerror("Protocol not implemented");
		return(1);
	}
	| TOK_SRVGRP TOK_INTEGER
	{
		int	rc;

		/*
		 * Configure the SCSP server group ID
		 */
		rc = set_server_group($2);
		if (rc)
			return(rc);
	}
	;

/*
 * SCSP DCS definition statements
 */
dcs_stmt: TOK_DCS 
	{
		int	rc;

		rc = start_dcs();
		if (rc)
			return(rc);
	}
	'{' dcs_def '}'
	{
		int	rc;

		rc = finish_dcs();
		if (rc)
			return(rc);
	}
	;

dcs_def: dcs_spec ';'
	| dcs_def dcs_spec ';'
	;

dcs_spec: /* Nothing */
	| TOK_DCS_ADDR TOK_HEX
	{
		int	rc;

		/*
		 * Set DCS address
		 */
		rc = set_dcs_addr($2, (char *)0);
		free($2);
		if (rc)
			return(rc);
	}
	| TOK_DCS_ADDR TOK_HEX TOK_HEX
	{
		int	rc;

		/*
		 * Set DCS address and subaddress
		 */
		rc = set_dcs_addr($2, $3);
		free($2);
		free($3);
		if (rc)
			return(rc);
	}
	| TOK_DCS_CA_REXMIT_INT TOK_INTEGER
	{
		int	rc;

		/*
		 * Configure the CA retransmit interval
		 */
		rc = set_dcs_ca_rexmit($2);
		if (rc)
			return(rc);
	}
	| TOK_DCS_CSUS_REXMIT_INT TOK_INTEGER
	{
		int	rc;

		/*
		 * Configure the CSUS retransmit interval
		 */
		rc = set_dcs_csus_rexmit($2);
		if (rc)
			return(rc);
	}
	| TOK_DCS_CSU_REXMIT_INT TOK_INTEGER
	{
		int	rc;

		/*
		 * Configure the CSU retransmit interval
		 */
		rc = set_dcs_csu_rexmit($2);
		if (rc)
			return(rc);
	}
	| TOK_DCS_CSU_REXMIT_MAX TOK_INTEGER
	{
		int	rc;

		/*
		 * Configure the CSU retransmit limit
		 */
		rc = set_dcs_csu_rexmit_max($2);
		if (rc)
			return(rc);
	}
	| TOK_DCS_HELLO_DF TOK_INTEGER
	{
		int	rc;

		/*
		 * Configure the Hello dead factor
		 */
		rc = set_dcs_hello_df($2);
		if (rc)
			return(rc);
	}
	| TOK_DCS_HELLO_INT TOK_INTEGER
	{
		int	rc;

		/*
		 * Configure the Hello interval
		 */
		rc = set_dcs_hello_int($2);
		if (rc)
			return(rc);
	}
	| TOK_DCS_HOP_CNT TOK_INTEGER
	{
		int	rc;

		/*
		 * Configure the hop count
		 */
		rc = set_dcs_hops($2);
		if (rc)
			return(rc);
	}
	| TOK_DCS_ID TOK_NAME
	{
		int	rc;

		/*
		 * Configure the DCS ID
		 */
		rc = set_dcs_id($2);
		free($2);
		if (rc)
			return(rc);
	}
	;


/*
 * Logging option statements
 */
log_stmt: TOK_LOG
	'{' log_spec '}'
	;

log_spec: /* Nothing */
	| TOK_LFN TOK_NAME ';'
	{
		/*
		 * Configure the log file name
		 */
		int	rc;

		rc = set_log_file($2);
		free($2);
		if (rc)
			return(rc);
	}
	;
	| TOK_SYSLOG ';'
	{
		/*
		 * Configure logging to syslog
		 */
		scsp_log_syslog = 1;
	}
	;

%%

void
#if __STDC__
parse_error(const char *fmt, ...)
#else
parse_error(fmt, va_alist)
	char	*fmt;
	va_dcl
#endif
{
	va_list	ap;
	char	buff[256];

#if __STDC__
	va_start(ap, fmt);
#else
	va_start(ap);
#endif

	vsprintf(buff, fmt, ap);
	scsp_log(LOG_ERR, "%s: Config file error at line %d: %s\n",
			prog, parse_line, buff);
#ifdef NOTDEF
	fprintf(stderr, "%s: Config file error at line %d: %s\n",
			prog, parse_line, buff);
#endif
	va_end(ap);
}


void
yyerror(s)
	char	*s;
{
	parse_error(s);
}