|
|
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