nrs_info.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 1,732 行 · 第 1/3 页

C
1,732
字号
/* nrs_info.c - nRSInformation attribute */#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/dsap/common/RCS/nrs_info.c,v 9.0 1992/06/16 12:12:39 isode Rel $";#endif/* * $Header: /xtel/isode/isode/dsap/common/RCS/nrs_info.c,v 9.0 1992/06/16 12:12:39 isode Rel $ * * * $Log: nrs_info.c,v $ * Revision 9.0  1992/06/16  12:12:39  isode * Release 8.0 * *//* *				  NOTICE * *    Acquisition, use, and distribution of this module and related *    materials are subject to the restrictions of a license agreement. *    Consult the Preface in the User's Manual for the full terms of *    this agreement. * *//*	SYNTAX:	nrs_info ::= <context> "$" <addr_sp_id> "$" <routes>	context ::= <integer> | <context_str>	context_str ::= "x29" | "ts29" | "niftp" | "mail-niftp" | "mail-telex"		| "jtmp" | "jtmp-files" | "jtmp-reg" | "ybts-node" | "ybts"		| "ftam" | "jtm" | "jtm-reg" | "vt" | "motis"	addr_sp_id ::= <integer> | <addr_sp_id_str>	addr_sp_id_str ::= "pss" | "janet" | "telex" | "osi-cons"	routes ::= <route> "|" <routes> | empty	route ::= <cost> "#" <addressing_info>	cost ::= <asn> | empty	-- empty implies cost is ASN.1 NULL	addressing_info ::=		  "dte_only" ":" <dte_number>		| "dte_applic_info" ":" <dte_number> "#" <applic_info>		| "dte_cudf" ":" <dte_number> "#" <cudf>		| "dte_cudf_applic_info" ":" <dte_number> "#" <cudf> "#" <applic_info>		| "dte_ybts" ":" <dte_number> "#" <ybts_string>		| "dte_ybts_applic_info" ":" <dte_number> "#" <ybts_string> "#" <applic_info>		| "dte_ybts_applic_relay" ":" <dte_number> "#" <ybts_string> "#" <applic_relay>		| "none_needed" ":"		| "osi_addressing" ":" <nsap> "#" <tsel> "#" <ssel> "#" <psel>"#" <place_holder> "#" <application_title> "#" <per_app_context_info>		| "osi_nsap_only" ":" <nsap>		| "osi_nsap_applic_info" ":" <nsap> "#" <applic_info>		| "osi_nsap_applic_relay" ":" <nsap> "#" <applic_relay>		| "dte_ybts_osi_addressing" ":" <dte_number> "#" <ybts_string>			"#" <tsel> "#" <ssel> "#" <psel> "#" <place_holder>			"#" <application_title> "#" <per_app_context_info>	dte_number ::= <numeric_string>	cudf ::= <octet_string>	ybts ::= <visible_string>	nsap ::= <numeric_string>	tselector ::= <octet_string>	sselector ::= <octet_string>	pselector ::= <octet_string>	place_holder ::= <asn>	application_title ::= <asn>	per_app_context_info ::= <asn>	applic_info ::= <vis_str_seq>	applic_relay ::= <vis_str_seq>	vis_str_seq ::= <visible_string> | <str_seq> "$" <visible_string>*//* LINTLIBRARY */#include "quipu/util.h"#include "quipu/attr.h"		/* Def.s for READOUT etc */#include "quipu/nrs_info.h"#include "quipu/NRS-types.h"extern LLog	* log_dsap;PE		  asn2pe();PE	  asnstr2pe (orig)char	* orig;{	PE	  result;	char	* str;	if (orig == NULLCP)		return(NULLPE);	str = SkipSpace(orig);	if ((*str) == '\0')		return(NULLPE);	if (strncmp (str, "{ASN}", 5) == 0)	{		result = asn2pe ((char *)(orig + 5));	}	else	{		parse_error ("Malformed ASN string '%s'", orig);		result = NULLPE;	}	return(result);}static str_seq_free (arg)struct str_seq	* arg;{	if (arg == (struct str_seq *)NULL)		return;	if (arg->ss_str)		free (arg->ss_str);	if (arg->ss_next)		str_seq_free (arg->ss_next);	free ((char *)arg);}static struct str_seq	* str_seq_cpy (arg)struct str_seq	* arg;{	struct str_seq	* ret;	if (arg == (struct str_seq *)NULL)		return ((struct str_seq *)NULL);	ret = (struct str_seq *) smalloc (sizeof (struct str_seq));	ret->ss_str = strdup (arg->ss_str);	ret->ss_next = str_seq_cpy (arg->ss_next);	return (ret);}static str_seq_cmp (arg1, arg2)struct str_seq	* arg1;struct str_seq	* arg2;{	int	  ret;	if (arg1 == (struct str_seq *)NULL)		if (arg2 == (struct str_seq *)NULL)			return (0);		else			return (-1);	if (arg2 == (struct str_seq *)NULL)		return (1);	if ((ret = lexequ (arg1->ss_str, arg2->ss_str)) != 0)		return (ret);	return (str_seq_cmp (arg1->ss_next, arg2->ss_next));}static str_seq_print (ps, strseq, format)register PS	  ps;struct str_seq	* strseq;int		  format;{	struct str_seq	* ss;	for (ss=strseq; ss != (struct str_seq *)NULL; ss = ss->ss_next)	{		if (ss != strseq)			if (format == READOUT)				ps_printf (ps, "//");			else				ps_printf (ps, "$");		ps_printf (ps, "%s", ss->ss_str);	}}static struct str_seq	* str2str_seq (orig)char * orig;{	struct str_seq	* result;	struct str_seq	**ss;	char		* ptr_prev;	char		* ptr_next;	if (((ptr_prev = orig) == NULLCP) || ((*ptr_prev) == '\0'))	{		return ((struct str_seq *)NULL);	}	ss = &(result);	while ( (ptr_next=index (ptr_prev, '$')) != NULLCP)	{		*ptr_next = '\0';		ptr_next++;		(*ss) = (struct str_seq *) smalloc (sizeof (struct str_seq));		(*ss)->ss_str = strdup (ptr_prev);		ss = &((*ss)->ss_next);		ptr_prev = ptr_next;	}	(*ss) = (struct str_seq *) smalloc (sizeof (struct str_seq));	(*ss)->ss_str = strdup (ptr_prev);	(*ss)->ss_next = (struct str_seq *)NULL;	return (result);}static addr_info_free (arg)struct addr_info	* arg;{	if (arg == (struct addr_info *)NULL)		return;	if (arg->dte_number)		free (arg->dte_number);	if (arg->cudf)		free (arg->cudf);	if (arg->ybts_string)		free (arg->ybts_string);	if (arg->nsap)		free (arg->nsap);	if (arg->tselector)		free (arg->tselector);	if (arg->sselector)		free (arg->sselector);	if (arg->pselector)		free (arg->pselector);	if (arg->place_holder)		pe_free (arg->place_holder);	if (arg->application_title)		pe_free (arg->application_title);	if (arg->per_app_context_info)		pe_free (arg->per_app_context_info);	if (arg->applic_info)		str_seq_free (arg->applic_info);	if (arg->applic_relay)		str_seq_free (arg->applic_relay);	free ((char *) arg);}static struct addr_info	* addr_info_cpy (arg)struct addr_info	* arg;{	struct addr_info	* ret;	if (arg == (struct addr_info *)NULL)		return ((struct addr_info *)NULL);	ret = (struct addr_info *) calloc (1, sizeof (struct addr_info));	switch (ret->addr_info_type = arg->addr_info_type)	{	case ADDR_INFO_DTE_ONLY:		ret->dte_number = strdup (arg->dte_number);		break;	case ADDR_INFO_DTE_APPLIC_INFO:		ret->dte_number = strdup (arg->dte_number);		ret->applic_info = str_seq_cpy (arg->applic_info);		break;	case ADDR_INFO_DTE_CUDF:		ret->dte_number = strdup (arg->dte_number);		ret->cudf = strdup (arg->cudf);		break;	case ADDR_INFO_DTE_CUDF_APPLIC_INFO:		ret->dte_number = strdup (arg->dte_number);		ret->cudf = strdup (arg->cudf);		ret->applic_info = str_seq_cpy (arg->applic_info);		break;	case ADDR_INFO_DTE_YBTS:		ret->dte_number = strdup (arg->dte_number);		ret->ybts_string = strdup (arg->ybts_string);		break;	case ADDR_INFO_DTE_YBTS_APPLIC_INFO:		ret->dte_number = strdup (arg->dte_number);		ret->ybts_string = strdup (arg->ybts_string);		ret->applic_info = str_seq_cpy (arg->applic_info);		break;	case ADDR_INFO_DTE_YBTS_APPLIC_RELAY:		ret->dte_number = strdup (arg->dte_number);		ret->ybts_string = strdup (arg->ybts_string);		ret->applic_relay = str_seq_cpy (arg->applic_relay);		break;	case ADDR_INFO_NONE_NEEDED:		break;	case ADDR_INFO_OSI_ADDRESSING:		ret->nsap = strdup (arg->nsap);		ret->tselector = strdup (arg->tselector);		ret->sselector = strdup (arg->sselector);		ret->pselector = strdup (arg->pselector);		if (arg->place_holder == NULLPE)			ret->place_holder = NULLPE;		else			ret->place_holder = pe_cpy (arg->place_holder);		if (arg->application_title == NULLPE)			ret->application_title = NULLPE;		else			ret->application_title = pe_cpy (arg->application_title);		if (arg->per_app_context_info == NULLPE)			ret->per_app_context_info = NULLPE;		else			ret->per_app_context_info = pe_cpy (arg->per_app_context_info);		break;	case ADDR_INFO_OSI_NSAP_ONLY:		ret->nsap = strdup (arg->nsap);		break;	case ADDR_INFO_OSI_NSAP_APPLIC_INFO:		ret->nsap = strdup (arg->nsap);		ret->applic_info = str_seq_cpy (arg->applic_info);		break;	case ADDR_INFO_OSI_NSAP_APPLIC_RELAY:		ret->nsap = strdup (arg->nsap);		ret->applic_relay = str_seq_cpy (arg->applic_relay);		break;	case ADDR_INFO_DTE_YBTS_OSI_ADDRESSING:		ret->dte_number = strdup (arg->dte_number);		ret->ybts_string = strdup (arg->ybts_string);		ret->tselector = strdup (arg->tselector);		ret->sselector = strdup (arg->sselector);		ret->pselector = strdup (arg->pselector);		if (arg->place_holder == NULLPE)			ret->place_holder = NULLPE;		else			ret->place_holder = pe_cpy (arg->place_holder);		if (arg->application_title == NULLPE)			ret->application_title = NULLPE;		else			ret->application_title = pe_cpy (arg->application_title);		if (arg->per_app_context_info == NULLPE)			ret->per_app_context_info = NULLPE;		else			ret->per_app_context_info = pe_cpy (arg->per_app_context_info);		break;	default:		LLOG (log_dsap, LLOG_EXCEPTIONS, ("addr_info_cpy(): Unknown addressing info type %d", arg->addr_info_type));		break;	}	return (ret);}static addr_info_cmp (arg1, arg2)struct addr_info	* arg1;struct addr_info	* arg2;{	int	  ret;	if (arg1 == (struct addr_info *)NULL)		if (arg2 == (struct addr_info *)NULL)			return (0);		else			return (-1);	if (arg2 == (struct addr_info *)NULL)		return (1);	if (arg1->addr_info_type < arg2->addr_info_type)		return (-1);	if (arg1->addr_info_type > arg2->addr_info_type)		return (1);	switch (arg1->addr_info_type)	{	case ADDR_INFO_DTE_ONLY:		if ((ret = lexequ (arg1->dte_number, arg2->dte_number)) != 0)			return (ret);		break;	case ADDR_INFO_DTE_APPLIC_INFO:		if ((ret = lexequ (arg1->dte_number, arg2->dte_number)) != 0)			return (ret);		if ((ret = str_seq_cmp (arg1->applic_info, arg2->applic_info)) != 0)			return (ret);		break;	case ADDR_INFO_DTE_CUDF:		if ((ret = lexequ (arg1->dte_number, arg2->dte_number)) != 0)			return (ret);		if ((ret = lexequ (arg1->cudf, arg2->cudf)) != 0)			return (ret);		break;	case ADDR_INFO_DTE_CUDF_APPLIC_INFO:		if ((ret = lexequ (arg1->dte_number, arg2->dte_number)) != 0)			return (ret);		if ((ret = lexequ (arg1->cudf, arg2->cudf)) != 0)			return (ret);		if ((ret = str_seq_cmp (arg1->applic_info, arg2->applic_info)) != 0)			return (ret);		break;	case ADDR_INFO_DTE_YBTS:		if ((ret = lexequ (arg1->dte_number, arg2->dte_number)) != 0)			return (ret);		if ((ret = lexequ (arg1->ybts_string, arg2->ybts_string)) != 0)			return (ret);		break;	case ADDR_INFO_DTE_YBTS_APPLIC_INFO:		if ((ret = lexequ (arg1->dte_number, arg2->dte_number)) != 0)			return (ret);		if ((ret = lexequ (arg1->ybts_string, arg2->ybts_string)) != 0)			return (ret);		if ((ret = str_seq_cmp (arg1->applic_info, arg2->applic_info)) != 0)			return (ret);		break;	case ADDR_INFO_DTE_YBTS_APPLIC_RELAY:		if ((ret = lexequ (arg1->dte_number, arg2->dte_number)) != 0)			return (ret);		if ((ret = lexequ (arg1->ybts_string, arg2->ybts_string)) != 0)			return (ret);		if ((ret = str_seq_cmp (arg1->applic_relay, arg2->applic_relay)) != 0)			return (ret);		break;	case ADDR_INFO_NONE_NEEDED:		break;	case ADDR_INFO_OSI_ADDRESSING:		if ((ret = lexequ (arg1->nsap, arg2->nsap)) != 0)			return (ret);		if ((ret = lexequ (arg1->tselector, arg2->tselector)) != 0)			return (ret);		if ((ret = lexequ (arg1->sselector, arg2->sselector)) != 0)			return (ret);		if ((ret = lexequ (arg1->pselector, arg2->pselector)) != 0)			return (ret);		if ((ret = quipu_pe_cmp (arg1->place_holder, arg2->place_holder)) != 0)			return (ret);		if ((ret = quipu_pe_cmp (arg1->application_title, arg2->application_title)) != 0)			return (ret);		if ((ret = quipu_pe_cmp (arg1->per_app_context_info, arg2->per_app_context_info)) != 0)			return (ret);		break;	case ADDR_INFO_OSI_NSAP_ONLY:		if ((ret = lexequ (arg1->nsap, arg2->nsap)) != 0)			return (ret);		break;	case ADDR_INFO_OSI_NSAP_APPLIC_INFO:		if ((ret = lexequ (arg1->nsap, arg2->nsap)) != 0)			return (ret);		if ((ret = str_seq_cmp (arg1->applic_info, arg2->applic_info)) != 0)			return (ret);		break;	case ADDR_INFO_OSI_NSAP_APPLIC_RELAY:		if ((ret = lexequ (arg1->nsap, arg2->nsap)) != 0)			return (ret);		if ((ret = str_seq_cmp (arg1->applic_relay, arg2->applic_relay)) != 0)			return (ret);		break;	case ADDR_INFO_DTE_YBTS_OSI_ADDRESSING:		if ((ret = lexequ (arg1->dte_number, arg2->dte_number)) != 0)			return (ret);		if ((ret = lexequ (arg1->ybts_string, arg2->ybts_string)) != 0)			return (ret);		if ((ret = lexequ (arg1->tselector, arg2->tselector)) != 0)			return (ret);		if ((ret = lexequ (arg1->sselector, arg2->sselector)) != 0)			return (ret);		if ((ret = lexequ (arg1->pselector, arg2->pselector)) != 0)			return (ret);		if ((ret = quipu_pe_cmp (arg1->place_holder, arg2->place_holder)) != 0)			return (ret);		if ((ret = quipu_pe_cmp (arg1->application_title, arg2->application_title)) != 0)			return (ret);		if ((ret = quipu_pe_cmp (arg1->per_app_context_info, arg2->per_app_context_info)) != 0)			return (ret);		break;	default:		LLOG (log_dsap, LLOG_EXCEPTIONS, ("addr_info_cmp(): Unknown addressing info type %d", arg1->addr_info_type));		break;	}	return (0);}static addr_info_print (ps, info, format)register PS		  ps;struct addr_info	* info;int			  format;{	switch (info->addr_info_type)	{	case ADDR_INFO_DTE_ONLY:		ps_printf (ps, "%s", "dte_only");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->dte_number);		break;	case ADDR_INFO_DTE_APPLIC_INFO:		ps_printf (ps, "%s", "dte_applic_info");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->dte_number);		ps_printf (ps, "#");		str_seq_print (ps, info->applic_info, format);		break;	case ADDR_INFO_DTE_CUDF:		ps_printf (ps, "%s", "dte_cudf");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->dte_number);		ps_printf (ps, "#");		ps_printf (ps, "%s", info->cudf);		break;	case ADDR_INFO_DTE_CUDF_APPLIC_INFO:		ps_printf (ps, "%s", "dte_cudf_applic_info");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->dte_number);		ps_printf (ps, "#");		ps_printf (ps, "%s", info->cudf);		ps_printf (ps, "#");		str_seq_print (ps, info->applic_info, format);		break;	case ADDR_INFO_DTE_YBTS:		ps_printf (ps, "%s", "dte_ybts");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->dte_number);		ps_printf (ps, "#");		ps_printf (ps, "%s", info->ybts_string);		break;	case ADDR_INFO_DTE_YBTS_APPLIC_INFO:		ps_printf (ps, "%s", "dte_ybts_applic_info");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->dte_number);		ps_printf (ps, "#");		ps_printf (ps, "%s", info->ybts_string);		ps_printf (ps, "#");		str_seq_print (ps, info->applic_info, format);		break;	case ADDR_INFO_DTE_YBTS_APPLIC_RELAY:		ps_printf (ps, "%s", "dte_ybts_applic_relay");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->dte_number);		ps_printf (ps, "#");		ps_printf (ps, "%s", info->ybts_string);		ps_printf (ps, "#");		str_seq_print (ps, info->applic_relay, format);		break;	case ADDR_INFO_NONE_NEEDED:		ps_printf (ps, "%s", "none_needed");		ps_printf (ps, ":");		break;	case ADDR_INFO_OSI_ADDRESSING:		ps_printf (ps, "%s", "osi_addressing");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->nsap);		ps_printf (ps, "#");		if (info->tselector)			ps_printf (ps, "%s", info->tselector);		ps_printf (ps, "#");		if (info->sselector)			ps_printf (ps, "%s", info->sselector);		ps_printf (ps, "#");		if (info->pselector)			ps_printf (ps, "%s", info->pselector);		ps_printf (ps, "#");		if (info->place_holder)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?