tsbridge.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 824 行 · 第 1/2 页

C
824
字号
		nta -> ta_naddr = 1;		return nta;	}	isnew = 0;	/* try old form... */	bcopy (ta -> ta_selector, buffer, ta -> ta_selectlen);	buffer[ta -> ta_selectlen] = NULL;	if ((nta = str2taddr (buffer)) == NULLTA) {		ts_close (sd, "unable to translate address");		adios (NULLCP, "unable to translate \"%s\"", buffer);	}	newta = *nta;	return &newta;}/*  */static struct TSAPaddr *maketa (ta, type, ctp)struct TSAPaddr *ta;long	type;ContTbl *ctp;{    static struct TSAPaddr newta;    register struct TSAPaddr *nta = &newta;    char	*p;    int	i;    struct PSAPaddr pas;    struct PSAPaddr *pa = &pas;    if (ctp -> flags & CONN_NOMUNGE) {	*nta = *ta;	/* struct copy */    }    if (!(ctp -> flags & CONN_NOMUNGE) || (ctp -> flags & CONN_FORCEMUNGE)) {	if (isnew == 0) {	    bzero ((char *)pa, sizeof *pa);	    pa -> pa_addr.sa_addr = *ta;	    if ((p = _paddr2str (pa, NULLNA, -1)) == NULL ||		(nta -> ta_selectlen = strlen (p)) >= TSSIZE) {		if (ctp -> flags & CONN_STRICT)		    adios (NULLCP, "new selector not encodable");		advise (LLOG_NOTICE, NULLCP,			"new selector not encodable");		nta -> ta_selectlen = 0;	    }	    else		bcopy (p, nta -> ta_selector, TSSIZE);	}	else {	    struct NSAPaddr *nna = na2norm (&ta -> ta_addrs[0]);	    if ((nta -> ta_selectlen = 2 + nna -> na_addrlen +		 ta -> ta_selectlen) >= TSSIZE)		nta -> ta_selectlen = 0;	    else {		bcopy (nna -> na_address, &nta -> ta_selector[2],		       nna -> na_addrlen);		bcopy (ta -> ta_selector,		       &nta -> ta_selector[2 + nna -> na_addrlen],		       ta -> ta_selectlen);		nta -> ta_selector[0] = nta -> ta_selector[1] =		    nna -> na_addrlen;	    }	}    }    for (i = 0; i < ctp -> src.ta_naddr; i++) {	if (ctp -> src.ta_addrs[i].na_stack == type) {	    /* our address */	    nta -> ta_addrs[0] = ctp->src.ta_addrs[i]; 	    nta -> ta_naddr = 1;	    return nta;	}    }    /*     * This requires an explanation:     * If NOMUNGE && FORCEMUNGE  we have a semi-transparent bridge     * and since [at least on my machine] the recipient of a "transparent"     * call sees it as coming from the bridge host, ie the effect is that     * of a strict call, the structure that is now in nta, viz:     * "calling address"/calling address     * is going to get clobbered and appear at the final host as originating     * "calling address"/bridge host     * anyway.  This is what I want.     * => return nta     */    if ((ctp -> flags & CONN_NOMUNGE) 	&& (ctp -> flags & CONN_FORCEMUNGE)	&& !(ctp -> flags & CONN_STRICT)) {	return nta;    }    if (ctp -> flags & CONN_STRICT)	adios (NULLCP, "not listening on this network (%d)", type);    advise (LLOG_NOTICE, NULLCP,	    "not listening on this network (%d)", type);    return ta;}/*  */static ContTbl *find_connection (ta)struct TSAPaddr *ta;{    ContTbl *ctp;    struct NSAPaddr *na1, *na2;    na2 = &ta -> ta_addrs[0];    for (ctp = con_tbl; ctp < &con_tbl[con_tbl_cnt]; ctp ++) {	if (na2 -> na_type == NA_NSAP && ctp->src.ta_naddr == 0 &&	    ta -> ta_selectlen == ctp -> src.ta_selectlen &&	    bcmp (ta -> ta_selector, ctp -> src.ta_selector,		  ta -> ta_selectlen) == 0)	    return ctp;	for (na1 = &ctp -> src.ta_addrs[0];	     na1 < &ctp -> src.ta_addrs[ctp->src.ta_naddr]; na1++)	{	    if (na1 -> na_type != na2 -> na_type)		    continue;		switch (na1 -> na_stack) {		case NA_NSAP:		if ((na1 -> na_addrlen == 0 ||		     (na1 -> na_addrlen == na2 -> na_addrlen &&			bcmp (na1 -> na_address, na2 -> na_address,			  na1 -> na_addrlen) == 0))		    &&			ta -> ta_selectlen == ctp -> src.ta_selectlen &&			bcmp (ta -> ta_selector, ctp -> src.ta_selector,			      ta -> ta_selectlen) == 0)			return ctp;		    break;		case NA_TCP:		    if (na1 -> na_port == na2 -> na_port &&		       strcmp (na1 -> na_domain, na2 -> na_domain) == 0)			return ctp;		    break;		case NA_X25:		    if (na1 -> na_dtelen == na2 -> na_dtelen &&			bcmp (na1 -> na_dte, na2 -> na_dte,			      na1 -> na_dtelen) == 0 &&			na1 -> na_pidlen == na2 -> na_pidlen &&			bcmp (na1 -> na_pid, na2 -> na_pid,			      na1 -> na_pidlen) == 0)			return ctp;		    break;		}	    }	}    return NULL;}/*  */static void	arginit (vec)char	**vec;{	register char   *ap;	register struct TSAPaddr *ta;	if (myname = rindex (*vec, '/'))		myname++;	if (myname == NULL || *myname == NULL)		myname = *vec;	for (vec++; ap = *vec; vec++) {	    if (*ap == '-' && ap[1])		switch (*++ap) {		    case 'T':		    	if ((ap = *++vec) == NULL || *ap == '-')			    adios (NULLCP, "usage: %s -T tailorfile", myname);		    	(void) isodesetailor (ap);			isodetailor (myname, 0);			ll_hdinit (pgm_log, myname);			continue;		    case 'a':			isodetailor (myname, 0);			ll_hdinit (pgm_log, myname);		        if ((ap = *++vec) == NULL || *ap == '-')			    adios (NULLCP, "usage: %s -a address", myname);			if ((ta = str2taddr (ap)) == NULLTA)			    adios (NULLCP, "bad address \"%s\"", ap);			con_tbl[0].src = *ta; /* struct copy */			con_tbl[0].flags =  0;			con_tbl_cnt = 1;		        continue;		    case 's':			con_tbl[0].flags |= CONN_STRICT;			continue;		    default:			adios (NULLCP, "unknown switch -%s", ap);		}	    else		break;	    	}	isodetailor (myname, 0);	ll_hdinit (pgm_log, myname);	for (; ap = *vec; vec++)	    read_file (ap);	if (con_tbl_cnt <= 0) {	    if ((ta = str2taddr (tsb_default_address)) == NULLTA)		adios (NULLCP, "bad default address \"%s\"",		       tsb_default_address);	    con_tbl[0].src = *ta; /* struct copy */	    con_tbl_cnt = 1;	}}/*  */static void read_file (file)char	*file;{    FILE	*fp;    char	buf[BUFSIZ];    char	*vec[50];    char	*ap;    int		vecp, i;    ContTbl	*ctp;    struct TSAPaddr *ta;    if (strcmp (file, "-") == 0)	fp = stdin;    else if ((fp = fopen (file, "r")) == NULL)	adios (file, "Can't open ");    while (fgets (buf, sizeof buf, fp) != NULLCP) {	if (buf[0] == '#' || buf[0] == '\n')	    continue;	vecp = sstr2arg (buf, 50, vec, " \t,\n");	if (vecp <= 0)	    continue;	if ((ta = str2taddr (vec[0])) == NULLTA)	    adios (NULLCP, "Bad address \"%s\" in file %s", vec[0], file);	ctp = &con_tbl[con_tbl_cnt];	ctp -> src = *ta; /* struct copy */	con_tbl_cnt ++;	for (i = 1; i < vecp; i++) {	    ap = vec[i];	    if (*ap == '\0')		continue;	    if (*ap == '-') {		switch (*++ap) {		case 's':		    ctp -> flags |= CONN_STRICT;		    break;		case 't':		    ctp -> flags |= CONN_TRANS;		    break;		case 'n':		    ctp -> flags |= CONN_NOMUNGE;		    break;		case 'f':		    ctp -> flags |= CONN_FORCEMUNGE;		    break;		default:		    adios (NULLCP, "Unknown option -%c", *ap);		}	    }	    else {		if ((ta = str2taddr (ap)) == NULLTA)		    adios (NULLCP, "Bad address \"%s\" in file %s",			   ap, file);		ctp -> dest = *ta; /* struct copy */		ctp -> flags |= (CONN_TRANS|CONN_NOMUNGE);	    }	}    }    if (strcmp (file, "-") != 0)	(void) fclose (fp);}/*  */static	void envinit () {	int     i,		sd;	nbits = getdtablesize ();	if (!(debug = isatty (2))) {		for (i = 0; i < 5; i++) {			switch (fork ()) {			    case NOTOK: 				sleep (5);				continue;			    case OK: 				break;			    default: 				_exit (0);			}			break;		}		(void) chdir ("/");		if ((sd = open ("/dev/null", O_RDWR)) == NOTOK)			adios ("/dev/null", "unable to read");		if (sd != 0)			(void) dup2 (sd, 0), (void) close (sd);		(void) dup2 (0, 1);		(void) dup2 (0, 2);#ifdef	SETSID		if (setsid () == NOTOK)		    advise (LLOG_EXCEPTIONS, "failed", "setsid");#endif#ifdef  TIOCNOTTY		if ((sd = open ("/dev/tty", O_RDWR)) != NOTOK) {			(void) ioctl (sd, TIOCNOTTY, NULLCP);			(void) close (sd);		}#else#ifdef  SYS5		(void) setpgrp ();		(void) signal (SIGINT, SIG_IGN);		(void) signal (SIGQUIT, SIG_IGN);#endif#endif	}	else		ll_dbinit (pgm_log, myname);#ifndef sun			/* damn YP... */	for (sd = 3; sd < nbits; sd++)	    if (pgm_log -> ll_fd != sd)		(void) close (sd);#endif	(void) signal (SIGPIPE, SIG_IGN);	ll_hdinit (pgm_log, myname);	advise (LLOG_NOTICE, NULLCP, "starting");}/*    ERRORS */#ifndef lintstatic void    adios (va_alist)va_dcl{    va_list ap;    va_start (ap);    _ll_log (pgm_log, LLOG_FATAL, ap);    va_end (ap);    _exit (1);}#else/* VARARGS */static void    adios (what, fmt)char   *what,       *fmt;{    adios (what, fmt);}#endif#ifndef lintstatic void    advise (va_alist)va_dcl{    int     code;    va_list ap;    va_start (ap);    code = va_arg (ap, int);    _ll_log (pgm_log, code, ap);    va_end (ap);}#else/* VARARGS */static void    advise (code, what, fmt)char   *what,       *fmt;int     code;{    advise (code, what, fmt);}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?