DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T a

⟦a1eb02df0⟧ TextFile

    Length: 6986 (0x1b4a)
    Types: TextFile
    Names: »acsapstub.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« 
        └─⟦de7628f85⟧ 
            └─⟦this⟧ »isode-6.0/acsap/acsapstub.c« 

TextFile

/* acsapstub.c - application entity titles -- stub directory service */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/acsap/RCS/acsapstub.c,v 7.0 89/11/23 21:22:00 mrose Rel $";
#endif

/* 
 * $Header: /f/osi/acsap/RCS/acsapstub.c,v 7.0 89/11/23 21:22:00 mrose Rel $
 *
 * RFC1085 (LPP) support contributed by the Wollongong Group, Inc.
 *
 *
 * $Log:	acsapstub.c,v $
 * Revision 7.0  89/11/23  21:22:00  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 "psap.h"
#include "isoaddrs.h"
#include "internet.h"
#include "tailor.h"


#ifdef	AETDBM
#define	fetch_aet	str2aet_dbm
#else
#define	fetch_aet	str2aet_seq
#endif

/* \f

   DATA */

static struct isoentity ies;

/* \f

 */

AEI	str2aei_stub (designator, qualifier)
char   *designator,
       *qualifier;
{
#ifdef	LPP
    register int    n;
    int	    tcp_port,
	    udp_port;
    register struct servent *sp;
#endif
    register char  *cp;
    register struct NSAPaddr *na;
    register struct isoentity  *ie = &ies;

    if (fetch_aet (designator, qualifier, &ies) == NOTOK) {
#ifdef	LPP
	if (lpp_aet (designator, qualifier, &ies) != NOTOK)
	    goto found_it;
#endif

	return NULLAEI;
    }

    if (ie -> ie_addr.pa_addr.sa_addr.ta_naddr <= 0) {
	register int	i;
	register struct TSAPaddr *ta = &ie -> ie_addr.pa_addr.sa_addr;

	na = ta -> ta_addrs, ta -> ta_naddr = 1;
	bzero ((char *) na, sizeof *na);

	/* guess at what sort of address we have on our hands */

	if ((i = strlen (cp = designator)) > 6
	        && cp[0] == '4' && cp[2] == '0' && cp[3] == '0') {
	    na -> na_type = NA_NSAP;
	    na -> na_subnet = ts_comm_nsap_default;
	    na -> na_addrlen = implode ((u_char *) na -> na_address,
					cp, strlen (cp));
	    goto found_it;
	}

	if (i <= NSAP_DTELEN + 1)
	   for (; *cp; cp++)
	       if (!isxdigit (*cp))
		   break;
	if (*cp) {
	    register struct hostent *hp = gethostbystring (designator);

	    na -> na_type = NA_TCP;
	    na -> na_subnet = ts_comm_tcp_default;
	    if (hp) {
#ifdef	h_addr
		register char **ap;
#endif

		(void) strcpy (na -> na_domain,
			       inet_ntoa (*(struct in_addr *) hp -> h_addr));
#ifdef	h_addr
		for (ap = hp -> h_addr_list + 1; *ap; ap++) {
		    ta -> ta_naddr++, na++;

		    if (ta -> ta_naddr >= NTADDR)
			break;

		    bzero ((char *) na, sizeof *na);
		    na -> na_type = NA_TCP;
		    na -> na_subnet = ts_comm_tcp_default;
		    (void) strcpy (na -> na_domain,
				   inet_ntoa (*(struct in_addr *) *ap));
		}
#endif
	    }
	    else
		(void) strncpy (na -> na_domain, designator,
				sizeof na -> na_domain);
	}
	else {
	   (void) strcpy (na -> na_dte, designator);
	   na -> na_dtelen = strlen (na -> na_dte);
#ifdef	BRIDGE_X25
	   na -> na_type = bridgediscrim (na) ? NA_BRG : NA_X25;
#else
	   na -> na_type = NA_X25;
#endif
	   na -> na_subnet = ts_comm_x25_default;
	}
    }

#ifdef	LPP
    for (na = ie -> ie_addr.pa_addr.sa_addr.ta_addrs,
	 	n = ie -> ie_addr.pa_addr.sa_addr.ta_naddr;
	     n > 0;
	     na++, n--)
	if (na -> na_type == NA_TCP && na -> na_port == 0) {
	    cp = strncmp (qualifier, "isode ", 6) ? qualifier : qualifier + 6;
	    if (sp = getservbyname (cp, "lpp"))
		tcp_port = udp_port = sp -> s_port;
	    else {
		tcp_port = (sp = getservbyname (cp, "tcp")) ? sp -> s_port : 0;
		udp_port = (sp = getservbyname (cp, "udp")) ? sp -> s_port : 0;
	    }
	    break;
	}

    for (na = ie -> ie_addr.pa_addr.sa_addr.ta_addrs,
	 	n = ie -> ie_addr.pa_addr.sa_addr.ta_naddr;
	     n > 0;
	     na++, n--)
	if (na -> na_type == NA_TCP && na -> na_port == 0) {
	    register struct TSAPaddr *ta;

	    if (tcp_port) {
		na -> na_port = (u_short) tcp_port;
		na -> na_tset = NA_TSET_TCP;

		if (udp_port
		        && (ta = &ie -> ie_addr.pa_addr.sa_addr) -> ta_naddr
		    		    < NTADDR) {
		    register struct NSAPaddr *ua =
					    ta -> ta_addrs + ta -> ta_naddr++;

		    bzero ((char *) ua, sizeof *ua);
		    ua -> na_type = NA_TCP;
		    ua -> na_subnet = ts_comm_tcp_default;
		    (void) strncpy (ua -> na_domain, na -> na_domain,
				    sizeof ua -> na_domain);
		    ua -> na_port = (u_short) udp_port;
		    ua -> na_tset = NA_TSET_UDP;
		}
	    }
	    else
		if (udp_port) {
		    na -> na_port = (u_short) udp_port;
		    na -> na_tset = NA_TSET_UDP;
		}
	}
#endif

found_it: ;
    if (addr_log -> ll_events & LLOG_DEBUG)
	_printent (ie);

    return oid2aei (&ie -> ie_identifier);
}

/* \f

 */

#ifdef	LPP
static unsigned int elements[NELEM + 1];
static char objent[BUFSIZ];


static int  lpp_aet (designator, qualifier, ie)
char   *designator,
       *qualifier;
register struct isoentity *ie;
{
    register int    nelem;
    int	    tcp_port,
	    udp_port;
    char   *cp;
    register struct servent *sp;
    register OID	oid = &ie -> ie_identifier;
    register struct PSAPaddr *pa = &ie -> ie_addr;
    register struct TSAPaddr *ta = &pa -> pa_addr.sa_addr;
    register struct NSAPaddr *na;

    cp = strncmp (qualifier, "isode ", 6) ? qualifier : qualifier + 6;
    if (sp = getservbyname (cp, "lpp"))
	tcp_port = udp_port = sp -> s_port;
    else
	if ((tcp_port = (sp = getservbyname (cp, "tcp")) ? sp -> s_port : 0)
	    	    == 0
		&& (udp_port = (sp = getservbyname (cp, "udp")) ? sp -> s_port 
								: 0) == 0)
	    return NOTOK;

    nelem = 0;
    elements[nelem++] = 1, elements[nelem++] = 17, elements[nelem++] = 4,
    elements[nelem++] = 0, elements[nelem++] = 0;

    oid -> oid_elements = elements;
    oid -> oid_nelem = nelem;
    (void) sprintf (ie -> ie_descriptor = objent, "%s-%s", designator,
		    qualifier);

    (void) bzero ((char *) pa, sizeof *pa);
    na = ta -> ta_addrs;
    if (tcp_port) {
	na -> na_type = NA_TCP;
	na -> na_subnet = ts_comm_tcp_default;
	(void) strncpy (na -> na_domain, designator, sizeof na -> na_domain);
	na -> na_port = (u_short) tcp_port;
	na -> na_tset = NA_TSET_TCP;
	na++;
    }
    if (udp_port) {
	na -> na_type = NA_TCP;
	na -> na_subnet = ts_comm_tcp_default;
	(void) strncpy (na -> na_domain, designator, sizeof na -> na_domain);
	na -> na_port = (u_short) udp_port;
	na -> na_tset = NA_TSET_UDP;
	na++;
    }
    ta -> ta_naddr = na - ta -> ta_addrs;
    
    return OK;
}
#endif

/* \f

 */

struct PSAPaddr *aei2addr_stub (aei)
AEI	aei;
{
    register struct isoentity  *ie = &ies;
    register struct PSAPaddr   *pa;

    if (aei -> aei_ap_title
	    ? oid_cmp (&ie -> ie_identifier, prim2oid (aei -> aei_ap_title))
	    : ie -> ie_identifier.oid_nelem > 0) {
	SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
	      ("aei2addr_stub cache miss on %s", sprintaei (aei)));

	return NULLPA;
    }
    pa = &ie -> ie_addr;
    if (addr_log -> ll_events & LLOG_DEBUG)
	_printent (ie);

    return (pa -> pa_addr.sa_addr.ta_naddr > 0 ? pa : NULLPA);
}