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 + -
显示快捷键?