|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 22668 (0x588c)
Types: TextFile
Names: »isoaddrs.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/compat/isoaddrs.c«
/* isoaddrs.c - simple parsing of ISODE addresses */
#ifndef lint
static char *rcsid = "$Header: /f/osi/compat/RCS/isoaddrs.c,v 7.1 90/01/11 18:35:10 mrose Exp $";
#endif
/*
* $Header: /f/osi/compat/RCS/isoaddrs.c,v 7.1 90/01/11 18:35:10 mrose Exp $
*
*
* $Log: isoaddrs.c,v $
* Revision 7.1 90/01/11 18:35:10 mrose
* real-sync
*
* Revision 7.0 89/11/23 21:23:05 mrose
* Release 6.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.
*
*/
/* LINTLIBRARY */
#include <ctype.h>
#include <stdio.h>
#include "general.h"
#include "manifest.h"
#include "isoaddrs.h"
#include "internet.h"
#include "tailor.h"
/* \f
DATA */
static char *isomacros = "isomacros";
#define MBUCKETS 128
#define MHASH(nm) \
(((nm)[1]) ? (((chrcnv[((nm)[0])] - chrcnv[((nm)[1])]) & 0x1f) \
+ ((chrcnv[(nm)[2]]) & 0x5f)) \
: (chrcnv[(nm)[0]]) & 0x7f)
struct macro {
char *m_name;
char *m_value;
struct macro *m_chain;
};
static int inited = 0;
static struct macro *Mbuckets[MBUCKETS];
/* \f
MACROS */
static struct macro *name2macro (name)
char *name;
{
register struct macro *m;
read_macros ();
for (m = Mbuckets[MHASH (name)];
m && lexequ (m -> m_name, name);
m = m -> m_chain)
continue;
if (m)
LLOG (addr_log, LLOG_DEBUG,
("MACRO \"%s\" VALUE \"%s\"", m -> m_name, m -> m_value));
else
LLOG (addr_log, LLOG_DEBUG,
("lookup of MACRO \"%s\" failed", name));
return m;
}
/* \f
*/
static struct macro *value2macro (value)
char *value;
{
register int i,
j,
k;
register struct macro *m,
*p,
**np,
**pp;
read_macros ();
p = NULL, i = 0;
k = strlen (value);
for (pp = (np = Mbuckets) + MBUCKETS; np < pp; np++)
for (m = *np; m; m = m -> m_chain)
if ((j = strlen (m -> m_value)) <= k
&& j > i
&& strncmp (value, m -> m_value, j) == 0)
p = m, i = j;
if (p)
LLOG (addr_log, LLOG_DEBUG,
("MACRO \"%s\" VALUE \"%s\" differential %d",
p -> m_name, p -> m_value, k - strlen (p -> m_value)));
else
LLOG (addr_log, LLOG_DEBUG,
("lookup of VALUE \"%s\" failed", value));
return p;
}
/* \f
*/
static int read_macros ()
{
register char *hp;
char buffer[BUFSIZ];
if (inited)
return;
inited = 1;
bzero ((char *) Mbuckets, sizeof Mbuckets);
read_file (isodefile (isomacros, 0));
if ((hp = getenv ("HOME")) == NULL)
hp = ".";
(void) sprintf (buffer, "%s/.isode_macros", hp);
read_file (buffer);
}
/* \f
*/
static int read_file (file)
char *file;
{
register char *cp;
char buffer[BUFSIZ + 1],
*vec[NVEC + NSLACK + 1];
register FILE *fp;
if ((fp = fopen (file, "r")) == NULL)
return;
while (fgets (buffer, sizeof buffer, fp)) {
if (*buffer == '#')
continue;
if (cp = index (buffer, '\n'))
*cp = NULL;
if (str2vec (buffer, vec) < 2)
continue;
if (add_macro (vec[0], vec[1]) == NOTOK)
break;
}
(void) fclose (fp);
}
/* \f
*/
static int add_macro (name, value)
char *name,
*value;
{
int i;
register char *cp;
char buffer[BUFSIZ];
register struct macro *m,
*p;
if (cp = index (value, '=')) {
*cp++ = NULL;
if ((p = name2macro (value)) == NULL) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("macro \"%s\" references non-existant macro \"%s\"",
name, value));
return OK;
}
(void) sprintf (value = buffer, "%s%s", p -> m_value, cp);
}
if ((m = (struct macro *) calloc (1, sizeof *m)) == NULL) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("calloc of macro structure failed"));
return NOTOK;
}
if ((m -> m_name = malloc ((unsigned) (strlen (name) + 1))) == NULL
|| (m -> m_value = malloc ((unsigned) (strlen (value) + 1)))
== NULL) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("malloc of alias structure failed"));
if (m -> m_name)
free (m -> m_name);
free ((char *) m);
return NOTOK;
}
(void) strcpy (m -> m_name, name);
(void) strcpy (m -> m_value, value);
m -> m_chain = Mbuckets[i = MHASH (m -> m_name)];
Mbuckets[i] = m;
return OK;
}
/* \f
*/
char *macro2str (name)
char *name;
{
register struct macro *m = name2macro (name);
return (m ? m -> m_value : NULLCP);
}
/* \f
STR2PADDR */
#define PS_INIT 0 /* <selector> or <network-address> */
#define PS_SEL1 1 /* .. got one selector already */
#define PS_SEL2 2 /* .. got two selectors already */
#define PS_SEL3 3 /* <network-address> */
static struct pair {
char *p_name;
char *p_value;
} afi_entries[] = {
"X121", "36",
"DCC", "38",
"TELEX", "54",
"PSTN", "56",
"ISDN", "58",
"ICD", "46",
"LOCAL", "48",
NULL
};
static char sel1[TSSIZE];
static char sel2[TSSIZE];
static char sel3[TSSIZE];
static char *sels[3] = {
sel1, sel2, sel3
};
#define IMPLODE(intres,octres,octval,intval) \
{ \
register int z = (intval); \
register char *y = (octval); \
register char *zp = y + z; \
\
while (zp-- > y) \
if (!isxdigit (*zp)) { \
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, \
("invalid hexstring: \"%*.*s\"", \
z, z, y)); \
} \
(intres) = implode ((u_char *) (octres), y, z); \
}
/* \f
*/
#ifdef notdef
/* An interim approach to use of Network Addresses... */
#define INTERIM_IDP "5400728722"
#endif
struct PSAPaddr *str2paddr (str)
char *str;
{
register int state,
*lp;
int j,
lens[3];
register char *cp,
*dp,
*ep,
*np,
**sp;
char buf1[BUFSIZ],
buf2[BUFSIZ],
nsap[NASIZE * 2 + 1];
register struct macro *m;
register struct pair *pp;
static int i = 0;
static struct PSAPaddr pas[2];
register struct PSAPaddr *pa = &pas[i++];
register struct SSAPaddr *sa = &pa -> pa_addr;
register struct TSAPaddr *ta = &sa -> sa_addr;
register struct NSAPaddr *na = ta -> ta_addrs;
i = i % 2;
bzero ((char *) pa, sizeof *pa);
(void) strcpy (buf1, str);
state = PS_INIT;
sp = sels, lp = lens;
for (cp = buf1; *cp; )
switch (state) {
case PS_INIT:
case PS_SEL1:
case PS_SEL2:
switch (*cp) {
case '"': /* '"' <otherstring> '"' */
if ((cp = index (dp = cp + 1, '"')) == NULL) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("missing double-quote in selector: %s",
str));
return NULLPA;
}
*cp++ = NULL;
(void) strcpy (*sp, dp);
*lp = strlen (dp);
break;
case '#': /* '#' <digitstring> */
j = 0;
for (cp++; isdigit (*cp); cp++)
j = j * 10 + *cp - '0';
if (j > 0xffff) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("invalid #-style selector: %s", str));
return NULLPA;
}
(*sp)[0] = (j >> 8) & 0xff;
(*sp)[1] = j & 0xff;
*lp = 2;
break;
case '\'': /* "'" <hexstring> "'H" */
if ((cp = index (dp = cp + 1, '\'')) == NULL) {
missing_quoteH: ;
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("missing 'H in selector: %s",str));
return NULLPA;
}
*cp++ = NULL;
if (*cp++ != 'H')
goto missing_quoteH;
IMPLODE (*lp, *sp, dp, strlen (dp));
break;
case '/': /* empty selector */
*lp = 0;
break;
default:
goto stuff_selectors;
}
sp++, lp++;
if (*cp++ != '/') {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("missing selector seperator at position %d: %s",
cp - buf1, str));
return NULLPA;
}
state++;
break;
stuff_selectors: ;
state = PS_SEL3;
/* and fall */
case PS_SEL3:
if ((cp = index (ep = cp, '|')) == NULL)
cp = ep + strlen (ep);
else
*cp++ = NULL;
if (dp = index (ep, '=')) {
*dp++ = NULL;
if ((m = name2macro (ep)) == NULL) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("non-existant macro \"%s\"", ep));
return NULLPA;
}
(void) sprintf (ep = buf2, "%s%s", m -> m_value, dp);
}
{
register int k,
l,
n;
register struct ts_interim *ts,
*tp;
tp = NULL, n = 0;
k = strlen (ep);
for (ts = ts_interim; ts -> ts_name; ts++)
if (ts -> ts_value
&& (l = strlen (ts -> ts_value)) <= k
&& l > n
&& strncmp (ep, ts -> ts_value, l) == 0)
tp = ts, n = l;
if (tp)
na -> na_subnet = tp -> ts_subnet;
else
/* XXX: what a hack! */
if (strncmp (ep, "X121+", sizeof "X121+" - 1) == 0)
na -> na_subnet = SUBNET_INT_X25;
else {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("unable to determine community for %s",ep));
return NULLPA;
}
}
if ((ep = index (dp = ep, '+')) == NULL) {
missing_seperator: ;
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("missing network-address seperator: %s", str));
return NULLPA;
}
*ep++ = NULL;
if (ta -> ta_naddr >= NTADDR) {
#ifdef h_addr
too_many: ;
#endif
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("too many network addresses starting at position %d: %s",
dp - buf1 + 1, str));
return pa;
}
na -> na_type = NA_NSAP;
if (lexequ (dp, "NS") == 0) {
IMPLODE (na -> na_addrlen, na -> na_address, ep,
strlen (ep));
}
else {
for (pp = afi_entries; pp -> p_name; pp++)
if (lexequ (pp -> p_name, dp) == 0)
break;
if (!pp -> p_name) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("unknown AFI \"%s\": %s", dp, str));
return NULLPA;
}
if ((ep = index (dp = ep, '+')) == NULL)
ep = dp + strlen (dp);
else
*ep++ = NULL;
if (lexequ (pp -> p_name, "X121") == 0) {
/* X121 form -- should be more general */
(void) strcpy (nsap, dp);
if ((na -> na_dtelen = strlen (nsap)) > NSAP_DTELEN) {
dp = nsap;
goto invalid_dte;
}
(void) strcpy (na -> na_dte, nsap);
#ifdef BRIDGE_X25
na -> na_type = bridgediscrim (na) ? NA_BRG : NA_X25;
#else
na -> na_type = NA_X25;
#endif
na -> na_subnet = SUBNET_INT_X25;
if (*ep != NULL) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("bad X121 form \"%s\"", ep));
return NULLPA;
}
goto next;
}
else
(void) sprintf (nsap, "%s%s", pp -> p_value, dp);
switch (*ep) {
case 'd':
(void) strcpy (nsap + strlen (nsap), ep + 1);
/* and fall */
case 'x':
case 'l':
case NULL:
np = nsap, dp = na -> na_address;
while (*np) {
*dp = (*np++ - '0') << 4;
if (*np)
*dp++ |= (*np++ - '0') & 0x0f;
else
*dp++ |= 0x0f;
}
na -> na_addrlen = dp - na -> na_address;
if (*ep == 'x') {
IMPLODE (j, dp, ep + 1, strlen (ep + 1));
na -> na_addrlen += j;
}
else
if (*ep == 'l') {
(void) strcpy (dp, ep + 1);
na -> na_addrlen += strlen (ep + 1);
}
break;
default:
if (strncmp ("RFC-1006+", ep,
sizeof "RFC-1006+" - 1) == 0) {
#ifdef h_addr
register char **ap;
#endif
register struct hostent *hp;
na -> na_type = NA_TCP;
#ifdef notdef
if (strcmp (nsap, INTERIM_IDP)) {
wrong_idp: ;
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("wrong IDP \"%s\" for DSP \"%s\"",
nsap, ep));
return NULLPA;
}
#endif
ep += sizeof "RFC-1006+" - 1;
if ((ep = index (dp = ep, '+')) == NULL)
goto missing_seperator;
*ep++ = NULL;
#ifdef notdef
na -> na_subnet = atoi (dp);
#endif
if ((ep = index (dp = ep, '+')) == NULL)
ep = dp + strlen (dp);
else
*ep++ = NULL;
if ((hp = gethostbystring (dp)) == NULL) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("%s: unknown host", dp));
return NULLPA;
}
(void) strcpy (na -> na_domain,
inet_ntoa (*(struct in_addr *)
hp -> h_addr));
if (*ep) {
if ((ep = index (dp = ep, '+')) == NULL)
ep = dp + strlen (dp);
else
*ep++ = NULL;
na -> na_port = htons ((u_short) atoi(dp));
if (*ep)
na -> na_tset = atoi (ep);
}
#ifdef h_addr
for (ap = hp -> h_addr_list + 1; *ap; ap++) {
ta -> ta_naddr++, na++;
if (ta -> ta_naddr >= NTADDR)
goto too_many;
bcopy ((char *) (na - 1), (char *) na,
sizeof *na);
(void) strcpy (na -> na_domain,
inet_ntoa (*(struct in_addr *) *ap));
}
#endif
break;
}
if (strncmp ("X.25(80)+", ep,
sizeof "X.25(80)+" - 1) == 0) {
na -> na_type = NA_X25;
#ifdef notdef
if (strcmp (nsap, INTERIM_IDP))
goto wrong_idp;
#endif
ep += sizeof "X.25(80)+" - 1;
if ((ep = index (dp = ep, '+')) == NULL)
goto missing_seperator;
*ep++ = NULL;
#ifdef notdef
na -> na_subnet = atoi (dp);
#endif
if ((ep = index (dp = ep, '+')) == NULL)
ep = dp + strlen (dp);
else
*ep++ = NULL;
for (np = dp; *np; np++)
if (!isdigit (*np)) {
invalid_dte: ;
SLOG (addr_log, LLOG_EXCEPTIONS,
NULLCP,
("invalid DTE \"%s\": %s",
dp, str));
return NULLPA;
}
if (np - dp > NSAP_DTELEN + 1)
goto invalid_dte;
(void) strcpy (na -> na_dte, dp);
na -> na_dtelen = strlen (na -> na_dte);
if (*ep) {
char *cudf,
*clen;
if ((ep = index (dp = ep, '+')) == NULL)
goto missing_seperator;
*ep++ = NULL;
if (lexequ (dp, "CUDF") == 0) {
cudf = na -> na_cudf;
clen = &na -> na_cudflen;
j = sizeof na -> na_cudf;
}
else
if (lexequ (dp, "PID") == 0) {
cudf = na -> na_pid;
clen = &na -> na_pidlen;
j = sizeof na -> na_pid;
}
else {
invalid_field: ;
SLOG (addr_log, LLOG_EXCEPTIONS,
NULLCP,
("invalid field \"%s\": %s",
dp, str));
return NULLPA;
}
if (j * 2 < strlen (ep))
goto invalid_field;
IMPLODE (j, cudf, ep, strlen (ep));
*clen = j & 0xff;
}
#ifdef BRIDGE_X25
na -> na_type = bridgediscrim (na) ? NA_BRG
: NA_X25;
#endif
break;
}
#ifdef notdef
if (lexequ ("ECMA-117-Binary", ep) == 0) {
/* some day support this... */
break;
}
if (lexequ ("ECMA-117-Decimal", ep) == 0) {
/* some day support this... */
break;
}
#endif
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("unknown DSP \"%s\": %s", ep, str));
return NULLPA;
}
}
next: ;
ta -> ta_naddr++, na++;
break;
}
switch (sp - sels) {
case 3: /* PSEL+SSEL+TSEL */
bcopy (*--sp, ta -> ta_selector,
ta -> ta_selectlen = *--lp);
bcopy (*--sp, sa -> sa_selector,
sa -> sa_selectlen = *--lp);
bcopy (*--sp, pa -> pa_selector,
pa -> pa_selectlen = *--lp);
break;
case 2: /* SSEL+TSEL */
bcopy (*--sp, ta -> ta_selector,
ta -> ta_selectlen = *--lp);
bcopy (*--sp, sa -> sa_selector,
sa -> sa_selectlen = *--lp);
break;
case 1: /* TSEL */
bcopy (*--sp, ta -> ta_selector,
ta -> ta_selectlen = *--lp);
break;
default:
break;
}
return pa;
}
/* \f
*/
int macro2comm (name, ts)
char *name;
register struct ts_interim *ts;
{
int j;
register char *ap,
*cp,
*dp,
*ep,
*fp,
*np;
char addr[NASIZE * 2 + 1],
buffer[BUFSIZ];
register struct pair *pp;
ts -> ts_length = 0, ts -> ts_syntax = NA_NSAP;
if ((cp = macro2str (name)) == NULLCP)
return NOTOK;
ts -> ts_value = cp;
(void) strcpy (buffer, cp);
ap = addr;
if ((ep = index (dp = buffer, '+')) == NULL)
ep = dp + strlen (dp);
else
*ep++ = NULL;
if (lexequ (dp, "NS") == 0) {
IMPLODE (ts -> ts_length, ts -> ts_prefix, ep, strlen (ep));
return OK;
}
for (pp = afi_entries; pp -> p_name; pp++)
if (lexequ (pp -> p_name, dp) == 0)
break;
if (!pp -> p_name) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("unknown AFI \"%s\": %s", dp, cp));
return NOTOK;
}
(void) strcpy (ap, pp -> p_value);
ap += strlen (ap);
if (!ep)
goto out;
if ((ep = index (dp = ep, '+')) == NULL)
ep = dp + strlen (dp);
else
*ep++ = NULL;
for (fp = dp; *fp; fp++)
if (!isdigit (*fp))
break;
if (*fp) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("invalid AFI suffix \"%s\": %s", dp, cp));
return NOTOK;
}
(void) strcpy (ap, dp);
ap += strlen (ap);
if (lexequ (pp -> p_name, "X121") == 0) {
if (*ep) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("invalid DTE \"%s\": %s", dp, cp));
return NOTOK;
}
ts -> ts_syntax = NA_X25;
ts -> ts_subnet = SUBNET_INT_X25;
goto out;
}
switch (*ep) {
case 'd':
(void) strcpy (ap, ep + 1);
/* and fall */
case 'x':
case 'l':
case NULL:
break;
default:
if ((ep = index (dp = ep, '+')) == NULL)
ep = dp + strlen (dp);
else
*ep++ = NULL;
if (lexequ (dp, "RFC-1006") == 0)
ts -> ts_syntax = NA_TCP;
else
if (lexequ (dp, "X.25(80)") == 0)
ts -> ts_syntax = NA_X25;
else {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("unknown DSP \"%s\": %s", dp, cp));
return NOTOK;
}
if ((ep = index (dp = ep, '+')) == NULL)
ep = dp + strlen (dp);
else
*ep++ = NULL;
(void) strcpy (ap, dp);
ap += strlen (ap);
if (*ep) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("invalid MACRO for community \"%s\": %s", name, cp));
return NOTOK;
}
break;
}
out: ;
ap = addr, np = ts -> ts_prefix;
while (*ap) {
*np = (*ap++ - '0') << 4;
if (*ap)
*np++ |= (*ap++ - '0') & 0x0f;
else
*np++ |= 0x0f;
}
switch (*ep) {
case 'x':
IMPLODE (j, np, ep + 1, strlen (ep + 1));
np += j;
break;
case 'l':
(void) strcpy (np, ep + 1);
np += strlen (ep + 1);
break;
default:
break;
}
ts -> ts_length = np - ts -> ts_prefix;
return OK;
}
/* \f
PADDR2STR */
static char *SEL2STR (sel, len)
char *sel;
int len;
{
register char *cp,
*dp,
*ep;
static char buffer[PSSIZE * 2 + 4];
if (len <= 0)
return "";
cp = buffer;
*cp++ = '"';
for (ep = (dp = sel) + len; dp < ep; dp++) {
switch (*dp) {
case '+':
case '-':
case '.':
break;
default:
if (!isalnum (*dp)) {
cp = buffer;
*cp++ = '\'';
cp += explode (cp, (u_char *) sel, len);
(void) strcpy (cp, "'H");
return buffer;
}
break;
}
*cp++ = *dp;
}
*cp++ = '"';
*cp = NULL;
return buffer;
}
/* \f
*/
char *_paddr2str (pa, na, compact)
register struct PSAPaddr *pa;
register struct NSAPaddr *na;
int compact;
{
register int n;
int first;
register char *bp,
*cp,
*dp;
register struct macro *m;
register struct SSAPaddr *sa;
register struct TSAPaddr *ta;
register struct NSAPaddr *ca;
static int i = 0;
static char buf1[BUFSIZ],
buf2[BUFSIZ];
static char *bufs[] = { buf1, buf2 };
bp = cp = bufs[i++];
i = i % 2;
if (pa == NULLPA) {
bad_pa: ;
(void) strcpy (bp, "NULLPA");
return bp;
}
sa = &pa -> pa_addr;
ta = &sa -> sa_addr;
if (na)
n = 1;
else
if ((n = ta -> ta_naddr) > 0)
na = ta -> ta_addrs;
if (pa -> pa_selectlen > 0) {
(void) sprintf (cp, "%s/",
SEL2STR (pa -> pa_selector, pa -> pa_selectlen));
cp += strlen (cp);
}
if (sa -> sa_selectlen > 0 || bp != cp) {
(void) sprintf (cp, "%s/",
SEL2STR (sa -> sa_selector, sa -> sa_selectlen));
cp += strlen (cp);
}
if (ta -> ta_selectlen > 0 || bp != cp) {
(void) sprintf (cp, "%s/",
SEL2STR (ta -> ta_selector, ta -> ta_selectlen));
cp += strlen (cp);
}
for (first = 1; n > 0; na++, n--) {
register struct ts_interim *ts;
if (first)
first = 0;
else
*cp++ = '|';
if (compact > 0) {
if ((ca = na2norm (na)) == NULLNA)
goto bad_pa;
(void) strcpy (cp, "NS+");
cp += strlen (cp);
cp += explode (cp, (u_char *) ca -> na_address, ca -> na_addrlen);
*cp = NULL;
continue;
}
for (ts = ts_interim; ts -> ts_name; ts++)
if (ts -> ts_subnet == na -> na_subnet)
break;
if (!ts -> ts_name) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("unable to find community #%d", na -> na_subnet));
goto bad_pa;
}
if (!ts -> ts_value) {
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("community \"%s\" (subnet #%d) has no corresponding MACRO",
ts -> ts_name, na -> na_subnet));
goto bad_pa;
}
(void) strcpy (dp = cp, ts -> ts_value);
cp += strlen (cp) - 1;
if (*cp != '+')
*++cp = '+', *++cp = NULL;
else
cp++;
switch (na -> na_type) {
case NA_NSAP:
cp += explode (cp, (u_char *) na -> na_address,
na -> na_addrlen);
*cp = NULL;
break;
case NA_TCP:
(void) strcpy (cp, na -> na_domain);
cp += strlen (cp);
if (na -> na_port) {
(void) sprintf (cp, "+%d", (int) ntohs (na -> na_port));
cp += strlen (cp);
if (na -> na_tset) {
(void) sprintf (cp, "+%d", (int) na -> na_tset);
cp += strlen (cp);
}
}
break;
case NA_X25:
case NA_BRG:
if (na -> na_subnet == SUBNET_INT_X25
&& na -> na_cudflen == 0
&& na -> na_pidlen == 0
&& na -> na_dte[0] != '0') {
(void) sprintf (cp = dp, "X121+%s", na -> na_dte);
cp += strlen (cp);
}
else {
(void) strcpy (cp, na -> na_dte);
cp += strlen (cp);
if (na -> na_pidlen > 0) {
(void) strcpy (cp, "+PID+");
cp += strlen (cp);
cp += explode (cp, (u_char *) na -> na_pid,
(int) na -> na_pidlen);
}
else
if (na -> na_cudflen > 0) {
(void) strcpy (cp, "+CUDF+");
cp += strlen (cp);
cp += explode (cp, (u_char *) na -> na_cudf,
(int) na -> na_cudflen);
cp += strlen (cp);
}
}
break;
default:
SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
("unknown address type 0x%x", na -> na_type));
goto bad_pa;
}
SLOG (addr_log, LLOG_DEBUG, NULLCP, ("dp = %s",dp));
if (!compact && (m = value2macro (dp))) {
char buffer[BUFSIZ];
(void) sprintf (buffer, "%s=%s", m -> m_name,
dp + strlen (m -> m_value));
(void) strcpy (dp, buffer);
cp = dp + strlen (dp);
}
}
*cp = NULL;
return bp;
}