Annotation of 43BSDReno/contrib/isode-beta/compat/bridge.c, revision 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.