Annotation of 43BSDReno/contrib/isode-beta/compat/bridge.c, revision 1.1.1.1

1.1       root        1: /* bridge.c - X.25 abstractions for TCP bridge to X25 */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/compat/RCS/bridge.c,v 7.1 90/07/09 14:31:32 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/compat/RCS/bridge.c,v 7.1 90/07/09 14:31:32 mrose Exp $
                      9:  *
                     10:  * Contributed by Julian Onions, Nottingham University in the UK
                     11:  *
                     12:  *
                     13:  * $Log:       bridge.c,v $
                     14:  * Revision 7.1  90/07/09  14:31:32  mrose
                     15:  * sync
                     16:  * 
                     17:  * Revision 7.0  89/11/23  21:22:55  mrose
                     18:  * Release 6.0
                     19:  * 
                     20:  */
                     21: 
                     22: /*
                     23:  *                               NOTICE
                     24:  *
                     25:  *    Acquisition, use, and distribution of this module and related
                     26:  *    materials are subject to the restrictions of a license agreement.
                     27:  *    Consult the Preface in the User's Manual for the full terms of
                     28:  *    this agreement.
                     29:  *
                     30:  */
                     31: 
                     32: 
                     33: /* LINTLIBRARY */
                     34: 
                     35: #include <errno.h>
                     36: #include <stdio.h>
                     37: #include "general.h"
                     38: #include "manifest.h"
                     39: #include "tailor.h"
                     40: #include "internet.h"
                     41: #include "tpkt.h"
                     42: 
                     43: /*     TCP/X.25 BRIDGE */
                     44: 
                     45: #ifdef BRIDGE_X25
                     46: 
                     47: 
                     48: static int     assfd[FD_SETSIZE];
                     49: static char    bridge_inited = 0;
                     50: 
                     51: /*  */
                     52: 
                     53: /* ARGSUSED */
                     54: 
                     55: int    start_bridge_client (local)
                     56: struct NSAPaddr        *local;
                     57: {
                     58:     int     sd;
                     59:     u_short port;
                     60:     register struct servent *sp;
                     61: 
                     62:     if ((sp = getservbyname ("x25bridge", "tcp")) == NULL)
                     63:        port = x25_bridge_port;
                     64:     else
                     65:        port = sp -> s_port;
                     66: 
                     67:     if ((sd = in_connect (x25_bridge_host, port)) == NOTOK)
                     68:        return NOTOK;
                     69: 
                     70:     if (write_tcp_socket (sd, "\01", 1) != 1) {
                     71:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("initial write"));
                     72: 
                     73:        (void) close_tcp_socket (sd);
                     74:        return NOTOK;
                     75:     }
                     76: 
                     77:     return sd;
                     78: }
                     79: 
                     80: /*  */
                     81: 
                     82: static int  in_connect (addr, port)
                     83: char   *addr;
                     84: u_short port;
                     85: {
                     86:     int     sd;
                     87:     struct sockaddr_in in_socket;
                     88:     register struct sockaddr_in *isock = &in_socket;
                     89:     register struct hostent *hp;
                     90: 
                     91:     if ((hp = gethostbystring (addr)) == NULL) {
                     92:        SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ("%s: unknown host", addr));
                     93: 
                     94:        return NOTOK;
                     95:     }
                     96: 
                     97:     bzero ((char *) isock, sizeof *isock);
                     98:     isock -> sin_family = hp -> h_addrtype;
                     99:     isock -> sin_port = port;
                    100:     inaddr_copy (hp, isock);
                    101: 
                    102:     if ((sd = start_tcp_client ((struct sockaddr_in *) NULL, 0)) == NOTOK) {
                    103:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("start_tcp_client"));
                    104: 
                    105:        return NOTOK;
                    106:     }
                    107: 
                    108:     if (join_tcp_server (sd, isock) == NOTOK) {
                    109:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("join_tcp_server"));
                    110: 
                    111:        (void) close_tcp_socket (sd);
                    112:        return NOTOK;
                    113:     }
                    114: 
                    115:     return sd;
                    116: }
                    117: 
                    118: /*  */
                    119: 
                    120: int    join_bridge_server (fd, remote)
                    121: int    fd;
                    122: register struct NSAPaddr *remote;
                    123: {
                    124:     if (remote != NULLNA)
                    125:         remote -> na_stack = NA_BRG, remote -> na_community = ts_comm_x25_default;
                    126:     if (bridge_write_nsap_addr (fd, remote, write_tcp_socket) == NOTOK) {
                    127:        SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP, ("write of NSAP failed"));
                    128: 
                    129:        return NOTOK;
                    130:     }
                    131: 
                    132:     return fd;
                    133: }
                    134: 
                    135: /*  */
                    136: 
                    137: int    start_bridge_server (local, backlog, opt1, opt2)
                    138: struct NSAPaddr *local;
                    139: int    backlog,
                    140:        opt1,
                    141:        opt2;
                    142: {
                    143:     int     len,
                    144:             new,
                    145:             sd;
                    146:     u_short port;
                    147:     struct servent *sp;
                    148:     struct sockaddr_in in_socket;
                    149:     register struct sockaddr_in *isock = &in_socket;
                    150: 
                    151:     if (bridge_inited == 0) {
                    152:        for (sd = 0; sd < FD_SETSIZE; sd++)
                    153:            assfd[sd] = NOTOK;
                    154:        bridge_inited = 1;
                    155:     }
                    156:     if ((sp = getservbyname ("x25bridge", "tcp")) == NULL)
                    157:        port = x25_bridge_port;
                    158:     else
                    159:        port = sp -> s_port;
                    160: 
                    161:     if ((sd = in_connect (x25_bridge_host, port)) == NOTOK)
                    162:        return NOTOK;
                    163: 
                    164:     if (write_tcp_socket (sd, "\02", 1) != 1) {
                    165:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("initial write"));
                    166: 
                    167:        (void) close_tcp_socket (sd);
                    168:        return NOTOK;
                    169:     }
                    170: 
                    171:     if (local != NULLNA)
                    172:        local -> na_stack = NA_BRG, local -> na_community = ts_comm_x25_default;
                    173:     if (local != NULLNA && local -> na_dtelen == 0)
                    174:     {
                    175:        (void) strcpy (local -> na_dte, x25_bridge_addr);
                    176:        local -> na_dtelen = strlen(x25_bridge_addr);
                    177:     }
                    178:     if (local != NULLNA) {
                    179:        DLOG (compat_log, LLOG_DEBUG,
                    180:              ("addr", "type=%d '%s' len=%d",
                    181:               local -> na_stack, local -> na_dte,local -> na_dtelen));
                    182:        DLOG (compat_log, LLOG_DEBUG,
                    183:              ("addr", "pid='%s'(%d) fac='%s'(%d) cudf='%s'(%d)",
                    184:               local -> na_pid, local -> na_pidlen,
                    185:               local -> na_fac, local -> na_faclen,
                    186:               local -> na_pid, local -> na_pidlen,
                    187:               local -> na_cudf, local -> na_cudflen));
                    188:     }
                    189: 
                    190:     if (bridge_write_nsap_addr (sd, local, write_tcp_socket) == NOTOK) {
                    191:        SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP, ("write of NSAP failed"));
                    192: 
                    193:        (void) close_tcp_socket (sd);
                    194:        return NOTOK;
                    195:     }
                    196: 
                    197:     if ((new = in_listen (backlog, opt1, opt2)) == NOTOK) {
                    198:        (void) close_tcp_socket (sd);
                    199:        return NOTOK;
                    200:     }
                    201: 
                    202:     len = sizeof *isock;
                    203:     if (getsockname (new, (struct sockaddr *) isock, &len) == NOTOK) {
                    204:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("getsockname"));
                    205: 
                    206: out: ;
                    207:        (void) close_tcp_socket (sd);
                    208:        (void) close_tcp_socket (new);
                    209:        return NOTOK;
                    210:     }
                    211: 
                    212:     isock -> sin_family = htons (isock -> sin_family);
                    213:     if (write_tcp_socket (sd, (char *)isock, sizeof *isock) != sizeof *isock) {
                    214:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("write of sockaddr_in"));
                    215: 
                    216:        goto out;
                    217:     }
                    218:     assfd[new] = sd;
                    219: 
                    220:     return new;
                    221: }
                    222: 
                    223: int    get_bridge_assfd(fd)
                    224: int    fd;
                    225: {
                    226:     if (!bridge_inited)
                    227:        return NOTOK;
                    228:     return assfd[fd];
                    229: }
                    230: 
                    231: /*  */
                    232: 
                    233: static int  in_listen (backlog, opt1, opt2)
                    234: int    backlog,
                    235:        opt1,
                    236:        opt2;
                    237: {
                    238:     int     sd;
                    239:     char   *cp;
                    240:     struct sockaddr_in  lo_socket;
                    241:     register struct sockaddr_in *lsock = &lo_socket;
                    242:     register struct hostent *hp;
                    243: 
                    244:     if ((hp = gethostbystring (cp = getlocalhost ())) == NULL) {
                    245:        SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ("%s: unknown host", cp));
                    246: 
                    247:        return NOTOK;
                    248:     }
                    249: 
                    250:     bzero ((char *) lsock, sizeof *lsock);
                    251:     lsock -> sin_family = hp -> h_addrtype;
                    252:     inaddr_copy (hp, lsock);
                    253: 
                    254:     if ((sd = start_tcp_server (lsock, backlog, opt1, opt2)) == NOTOK) {
                    255:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("start_tcp_server"));
                    256: 
                    257:        return NOTOK;
                    258:     }
                    259: 
                    260:     return sd;
                    261: }
                    262: 
                    263: /*  */
                    264: 
                    265: int    join_bridge_client (fd, remote)
                    266: int    fd;
                    267: struct NSAPaddr        *remote;
                    268: {
                    269:     int     new;
                    270:     struct sockaddr_in  in_socket;
                    271:     struct NSAPaddr    sock;
                    272: 
                    273:     if ((new = join_tcp_client (fd, &in_socket)) == NOTOK) {
                    274:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("join_tcp_client"));
                    275: 
                    276:        return NOTOK;
                    277:     }
                    278: 
                    279:     if (bridge_read_nsap_addr (new, &sock, read_tcp_socket) == NOTOK) {
                    280:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("read of NSAP"));
                    281: 
                    282:        (void) close_tcp_socket (new);
                    283:        return NOTOK;
                    284:     }
                    285:     DLOG (compat_log, LLOG_DEBUG,
                    286:          ("addr", "type=%d '%s' len=%d", sock.na_stack, sock.na_dte,
                    287:           sock.na_dtelen));
                    288:     DLOG (compat_log, LLOG_DEBUG,
                    289:          ("addr", "pid='%s'(%d) fac='%s'(%d) cudf='%s'(%d)",
                    290:           sock.na_pid, sock.na_pidlen,
                    291:           sock.na_fac, sock.na_faclen,
                    292:           sock.na_pid, sock.na_pidlen,
                    293:           sock.na_cudf, sock.na_cudflen));
                    294:     sock.na_stack = ntohl (sock.na_stack);
                    295:     *remote = sock;
                    296:     DLOG (compat_log, LLOG_DEBUG,
                    297:          ("addr", "type=%d '%s' len=%d",
                    298:           remote -> na_stack, remote -> na_dte,remote -> na_dtelen));
                    299:     DLOG (compat_log, LLOG_DEBUG,
                    300:          ("addr", "pid='%s'(%d) fac='%s'(%d) cudf='%s'(%d)",
                    301:           remote -> na_pid, remote -> na_pidlen,
                    302:           remote -> na_fac, remote -> na_faclen,
                    303:           remote -> na_pid, remote -> na_pidlen,
                    304:           remote -> na_cudf, remote -> na_cudflen));
                    305:     return new;
                    306: }
                    307: 
                    308: int    close_bridge_socket (sd)
                    309: int    sd;
                    310: {
                    311:        if (bridge_inited && assfd[sd] != NOTOK)
                    312:                (void) close_tcp_socket (assfd[sd]);
                    313:        assfd[sd] = NOTOK;
                    314:        return close_tcp_socket (sd);
                    315: }
                    316: 
                    317: /* ARGSUSED */
                    318: 
                    319: int    bridgediscrim (na)
                    320: struct NSAPaddr *na;
                    321: {
                    322: #ifndef        X25
                    323:     return 1;  /* must be bridge */
                    324: #else
                    325:     int len = strlen (x25_bridge_discrim);
                    326: 
                    327:     if (len == 1 && *x25_bridge_discrim == '-')
                    328:        return 0;
                    329: 
                    330:     return (len == 0 ? 1
                    331:                     : strncmp (na -> na_dte, x25_bridge_discrim, len) == 0);
                    332: #endif
                    333: }
                    334: #endif
                    335: 
                    336: /*
                    337:  * Structure is as follows :-
                    338:  * 0-1         type
                    339:  * 2-17        dte
                    340:  * 18          dte len
                    341:  * 19-22       pid
                    342:  * 23          pid len
                    343:  * 24-39       user data
                    344:  * 40          user data len
                    345:  * 41-46       facilities
                    346:  * 47          facility length
                    347:  */
                    348:  
                    349: int bridge_write_nsap_addr (fd, nsap, writefnx)
                    350: int    fd;
                    351: struct NSAPaddr *nsap;
                    352: IFP    writefnx;
                    353: {
                    354:     u_short    na_stack;
                    355:     char       buffer[50];
                    356: 
                    357:     if (nsap == NULLNA || (na_stack = nsap -> na_stack) != NA_BRG)
                    358:        return NOTOK;
                    359:     na_stack = htons(na_stack);
                    360:     bcopy ((char *)&na_stack, buffer, sizeof(na_stack));
                    361:     bcopy (nsap -> na_dte, &buffer[2], 16);
                    362:     buffer[18] = nsap -> na_dtelen;
                    363:     bcopy (nsap -> na_pid, &buffer[19], 4);
                    364:     buffer[23] = nsap -> na_pidlen;
                    365:     bcopy (nsap -> na_cudf, &buffer[24], 16);
                    366:     buffer[40] = nsap -> na_cudflen;
                    367:     bcopy (nsap -> na_fac, &buffer[41], 6);
                    368:     buffer[47] = nsap -> na_faclen;
                    369:     if ((*writefnx) (fd, buffer, 48) != 48)
                    370:        return NOTOK;
                    371:     return OK;
                    372: }
                    373: 
                    374: int    bridge_read_nsap_addr (fd, nsap, readfnx)
                    375: int    fd;
                    376: struct NSAPaddr *nsap;
                    377: IFP    readfnx;
                    378: {
                    379:     u_short    na_stack;
                    380:     char       buffer[50];
                    381: 
                    382:     if (readx (fd, buffer, 48, readfnx) != 48)
                    383:        return NOTOK;
                    384:     bcopy (buffer, (char *)&na_stack, sizeof(na_stack));
                    385:     na_stack = ntohs(na_stack);
                    386:     if (na_stack != NA_BRG)
                    387:        return NOTOK;
                    388:     nsap -> na_stack = na_stack;
                    389:     bcopy (&buffer[2], nsap -> na_dte, 16);
                    390:     nsap -> na_dtelen = buffer[18];
                    391:     bcopy (&buffer[19], nsap -> na_pid, 4);
                    392:     nsap -> na_pidlen = buffer[23];
                    393:     bcopy (&buffer[24], nsap -> na_cudf, 16);
                    394:     nsap -> na_cudflen = buffer[40];
                    395:     bcopy (&buffer[41], nsap -> na_fac, 6);
                    396:     nsap -> na_faclen = buffer[47];
                    397:     return OK;
                    398: }
                    399: 
                    400: static int  readx (fd, buffer, n, readfnx)
                    401: int     fd;
                    402: char    *buffer;
                    403: int     n;
                    404: IFP     readfnx;
                    405: {
                    406:     register int    i,
                    407:     cc;
                    408:     register char   *bp;
                    409: 
                    410:     for (bp = buffer, i = n; i > 0; bp += cc, i -= cc) {
                    411:        switch (cc = (*readfnx) (fd, bp, i)) {
                    412:            case NOTOK:
                    413:                return (i = bp - buffer) ? i : NOTOK;
                    414: 
                    415:            case OK:
                    416:                break;
                    417: 
                    418:            default:
                    419:                continue;
                    420:        }
                    421:        break;
                    422:     }
                    423: 
                    424:     return (bp - buffer);
                    425: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.