|
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 c
Length: 5591 (0x15d7) Types: TextFile Names: »consaddr.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/compat/consaddr.c«
/* consaddr.c - CONS level generic <-> interface address munging */ #ifndef lint static char *rcsid = "$Header: /f/osi/compat/RCS/consaddr.c,v 6.0 89/03/18 23:25:04 mrose Rel $"; #endif /* * $Header: /f/osi/compat/RCS/consaddr.c,v 6.0 89/03/18 23:25:04 mrose Rel $ * * Contributed by Keith Ruttle, CAMTEC Electronics Ltd * * $Log: consaddr.c,v $ * Revision 6.0 89/03/18 23:25:04 mrose * Release 5.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 */ /* * for *really* generic address translation */ #include <errno.h> #include <stdio.h> #include "general.h" #include "manifest.h" #include "internet.h" #include "tailor.h" #include "tpkt.h" #ifdef CONS #ifdef CAMTEC_CCL #include <sys/file.h> #include "cons.h" /* \f */ /* * convert from the generic CONS structure to interface specific */ /* ARGSUSED */ CONN_DB *gen2if (generic, specific, context) struct NSAPaddr *generic; CONN_DB *specific; int context; { struct iovec *iov; char *a, *b; int i; if (generic == NULLNA || specific == (CONN_DB *) 0 || generic -> na_type != NA_NSAP || generic -> na_addrlen == 0) return (CONN_DB *)0; bzero ((char *)specific, sizeof *specific); switch (context) { case ADDR_REMOTE: iov = &(specific -> ccl_iovec[0]); if (cons_is_ybts) iov -> iov_len = generic -> na_addrlen; else iov -> iov_len = generic -> na_addrlen + 1; iov -> iov_base = malloc(iov -> iov_len + 1); bzero(iov -> iov_base, iov -> iov_len + 1); a = iov -> iov_base; b = generic -> na_address; for (i = 0; i < generic -> na_addrlen; i++) { if (cons_is_ybts) { *a++ = *b++; continue; } if (*b == '.') { *a++ = *b++; *a++ = strlen(b); } else *a++ = *b++; } case ADDR_LOCAL: iov = &(specific -> ccl_iovec[1]); if (cons_is_ybts) iov -> iov_len = strlen(cons_local_address) + 1; else iov -> iov_len = strlen(cons_local_address) + 2; iov -> iov_base = malloc (iov -> iov_len + 1); bzero(iov -> iov_base, iov->iov_len + 1); a = iov->iov_base; if (cons_is_ybts) *a++ = '/'; else { *a++ = '.'; *a++ = strlen(cons_local_address); } bcopy(cons_local_address, a, iov -> iov_len); break; case ADDR_LISTEN: iov = &(specific -> ccl_iovec[0]); iov -> iov_len = strlen(cons_listen_str); iov -> iov_base = malloc (iov -> iov_len + 1); bzero(iov -> iov_base, iov->iov_len + 1); bcopy (cons_listen_str, iov->iov_base, iov -> iov_len); return (specific); } return(specific); } /* * convert from interface specific format to generic CONS structure */ /* ARGSUSED */ struct NSAPaddr *if2gen (generic, specific, context) struct NSAPaddr *generic; CONN_DB *specific; int context; { struct iovec *iov; char *a; if (generic == NULLNA || specific == (CONN_DB *) 0) return NULLNA; bzero ((char *)generic, sizeof *generic); generic -> na_type = NA_NSAP; switch (context) { case ADDR_REMOTE: iov = &(specific -> ccl_iovec[1]); if (iov -> iov_len) { generic -> na_addrlen = iov -> iov_len - 1; bcopy ((iov -> iov_base)+1, generic -> na_address, generic -> na_addrlen); } else generic -> na_addrlen = 0; break; case ADDR_LOCAL: iov = &(specific -> ccl_iovec[0]); if (iov -> iov_len) { generic -> na_addrlen = iov -> iov_len -1; bcopy ((iov -> iov_base)+1, generic -> na_address, generic -> na_addrlen); } else generic -> na_addrlen = 0; break; case ADDR_LISTEN: return; } return(generic); } /* \f */ char *tsel2addr(tsel, na) char *tsel; struct NSAPaddr *na; { register char *p = tsel; register char *q; int i; switch (*p++) { case NT_X25: na -> na_type = NA_X25; if (*p >= '0' && *p <= '9') { for (q = (char *)na -> na_dte, i = 0; i < sizeof(na->na_dte) && *p && *p != SEPARATOR; i++) *q++ = *p++; *q = 0; na -> na_dtelen = i; p++; for (q = (char *)na -> na_pid, i = 0; i < sizeof(na->na_pid) && *p && *p != SEPARATOR;i++) *q ++ = *p ++; na->na_pidlen = i; if (*p && *p != SEPARATOR) { for (q = (char *)na -> na_cudf, i = 0; i < sizeof(na->na_cudf) && *p && *p != SEPARATOR; i++) *q++ = *p++; na -> na_cudflen = i; } if (*p && *p == SEPARATOR) p++; } break; case NT_TCP: na -> na_type = NA_TCP; for( q = na->na_domain, i = 0; i < sizeof(na->na_domain) && *p && *p != SEPARATOR; i++) *q ++ = *p ++; *q = 0; p ++; na -> na_port = atoi (p); while(*p && *p != SEPARATOR) p ++; if (*p == SEPARATOR) p ++; break; case NT_CONS: na -> na_type = NA_NSAP; (void) strcpy (na -> na_address, p); na -> na_addrlen = strlen (p); /* arghhh */ break; } return p; } char *addr2tsel(na, tsel) struct NSAPaddr *na; char *tsel; { switch (na -> na_type) { case NA_TCP: (void) sprintf (tsel, "%c%s%c%d%c", NT_TCP, na->na_domain, SEPARATOR, na->na_port, SEPARATOR); break; case NA_X25: (void) sprintf (tsel, "%c%s%c%*.*s%*.*s%c", NT_X25, na->na_dte, SEPARATOR, na->na_pidlen, na->na_pidlen, na->na_pid, na->na_cudflen, na->na_cudflen, na->na_cudf, SEPARATOR); break; case NA_NSAP: (void) sprintf (tsel, "%c%s%c", NT_CONS, na -> na_address, SEPARATOR); break; } return tsel; } #endif #endif