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 + -
显示快捷键?