Annotation of 43BSDReno/contrib/isode-beta/tsap/ts2tcp.c, revision 1.1.1.1

1.1       root        1: /* ts2tcp.c - TPM: TCP interface */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/tsap/RCS/ts2tcp.c,v 7.5 90/07/09 14:51:21 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/tsap/RCS/ts2tcp.c,v 7.5 90/07/09 14:51:21 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       ts2tcp.c,v $
                     12:  * Revision 7.5  90/07/09  14:51:21  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.4  90/03/23  17:31:28  mrose
                     16:  * 8
                     17:  * 
                     18:  * Revision 7.3  90/02/19  13:07:26  mrose
                     19:  * update
                     20:  * 
                     21:  * Revision 7.2  89/12/08  09:41:39  mrose
                     22:  * touch-up
                     23:  * 
                     24:  * Revision 7.1  89/12/07  01:07:36  mrose
                     25:  * queued writes
                     26:  * 
                     27:  * Revision 7.0  89/11/23  22:30:40  mrose
                     28:  * Release 6.0
                     29:  * 
                     30:  */
                     31: 
                     32: /*
                     33:  *                               NOTICE
                     34:  *
                     35:  *    Acquisition, use, and distribution of this module and related
                     36:  *    materials are subject to the restrictions of a license agreement.
                     37:  *    Consult the Preface in the User's Manual for the full terms of
                     38:  *    this agreement.
                     39:  *
                     40:  */
                     41: 
                     42: 
                     43: /* LINTLIBRARY */
                     44: 
                     45: #include <stdio.h>
                     46: #include "tpkt.h"
                     47: #include "tailor.h"
                     48: 
                     49: #ifdef TCP
                     50: #include "internet.h"
                     51: #include <errno.h>
                     52: #ifdef BSD42
                     53: #include <sys/ioctl.h>
                     54: #endif
                     55: 
                     56: #define        MAX1006         2048            /* could be as high as TPKT_MAXLEN */
                     57: 
                     58: /*    DATA */
                     59: 
                     60: #ifdef FIONBIO
                     61: #define        NODELAY
                     62: #endif
                     63: 
                     64: #ifdef NODELAY
                     65: static  fd_set  inprogress;
                     66: static struct sockaddr_in *peers = NULL;
                     67: #endif
                     68: 
                     69: 
                     70: extern int  errno;
                     71: 
                     72: /*    N-CONNECT.REQUEST */
                     73: 
                     74: int    tcpopen (tb, local, remote, td, async)
                     75: register struct tsapblk *tb;
                     76: struct NSAPaddr *local,
                     77:                *remote;
                     78: struct TSAPdisconnect *td;
                     79: int    async;
                     80: {
                     81:     int     fd;
                     82: #ifdef FIONBIO
                     83:     int            onoff;
                     84: #endif
                     85:     struct sockaddr_in  lo_socket,
                     86:                         in_socket;
                     87:     register struct sockaddr_in *lsock = &lo_socket,
                     88:                                *isock = &in_socket;
                     89:     register struct hostent *hp;
                     90:     register struct servent *sp;
                     91: 
                     92: #ifndef        NODELAY
                     93:     if (async)
                     94:        return tsaplose (td, DR_PARAMETER, NULLCP,
                     95:                         "asynchronous not supported");
                     96: #endif
                     97: 
                     98:     bzero ((char *) isock, sizeof *isock);
                     99: 
                    100:     if (remote -> na_port == 0) {
                    101:        if ((sp = getservbyname ("tsap", "tcp")) == NULL)
                    102:            sp = getservbyname ("iso-tsap", "tcp");
                    103:        isock -> sin_port = sp ? sp -> s_port : htons ((u_short) 102);
                    104:     }
                    105:     else
                    106:        isock -> sin_port = remote -> na_port;
                    107: 
                    108:     if ((hp = gethostbystring (remote -> na_domain)) == NULL)
                    109:        return tsaplose (td, DR_ADDRESS, NULLCP, "%s: unknown host",
                    110:                    remote -> na_domain);
                    111: #ifdef notanymore
                    112:     (void) strncpy (remote -> na_domain, hp -> h_name,
                    113:                    sizeof remote -> na_domain);
                    114: #endif
                    115: 
                    116:     isock -> sin_family = hp -> h_addrtype;
                    117:     inaddr_copy (hp, isock);
                    118: 
                    119: #ifndef        notanymore
                    120:     (void) strcpy (remote -> na_domain, inet_ntoa (isock -> sin_addr));
                    121: #endif
                    122: 
                    123:     if (local && local -> na_domain[0]) {
                    124:        bzero ((char *) lsock, sizeof *lsock);
                    125: 
                    126:        if ((hp = gethostbystring (local -> na_domain)) == NULL)
                    127:            return tsaplose (td, DR_ADDRESS, NULLCP, "%s: unknown host",
                    128:                    local -> na_domain);
                    129: 
                    130:        if ((lsock -> sin_family = hp -> h_addrtype) != isock -> sin_family)
                    131:            return tsaplose (td, DR_ADDRESS, NULLCP,
                    132:                    "address family mismatch");
                    133: 
                    134:        inaddr_copy (hp, lsock);
                    135:     }
                    136:     else
                    137:        lsock = NULL;
                    138: 
                    139:     if ((fd = start_tcp_client (lsock, 0)) == NOTOK)
                    140:        return tsaplose (td, DR_CONGEST, "socket", "unable to start");
                    141: 
                    142: #ifdef FIONBIO
                    143:     if (async)
                    144:        (void) ioctl (fd, FIONBIO, (onoff = 1, (char *) &onoff));
                    145: #endif
                    146:     tb -> tb_fd = fd;
                    147:     (void) TTService (tb);
                    148: 
                    149:     if (join_tcp_server (fd, isock) == NOTOK) {
                    150: #ifdef NODELAY
                    151:        if (async)
                    152:            switch (errno) {
                    153:                case EINPROGRESS: 
                    154:                    if (peers == NULL) {
                    155:                        peers = (struct sockaddr_in *)
                    156:                                        calloc ((unsigned) getdtablesize (),
                    157:                                                sizeof *peers);
                    158:                        if (peers == NULL) {
                    159:                            (void) tsaplose (td, DR_CONGEST, NULLCP,
                    160:                                             "out of memory");
                    161:                            (void) close_tcp_socket (fd);
                    162:                            return (tb -> tb_fd = NOTOK);
                    163:                        }
                    164: 
                    165:                        FD_ZERO (&inprogress);
                    166:                    }
                    167:                    FD_SET (fd, &inprogress);
                    168:                    peers[fd] = *isock;/* struct copy */
                    169:                    return OK;
                    170: 
                    171:                case EISCONN: 
                    172:                    goto done;
                    173: 
                    174:                default: 
                    175:                    break;
                    176:            }
                    177: #endif
                    178: 
                    179:        (void) tsaplose (td, DR_REFUSED, "connection", "unable to establish");
                    180:        (void) close_tcp_socket (fd);
                    181:        return (tb -> tb_fd = NOTOK);
                    182:     }
                    183: #ifdef NODELAY
                    184: done: ;
                    185: #endif
                    186: 
                    187: #ifdef FIONBIO
                    188:     if (async)
                    189:        (void) ioctl (fd, FIONBIO, (onoff = 0, (char *) &onoff));
                    190: #endif
                    191: 
                    192:     return DONE;
                    193: }
                    194: 
                    195: /*  */
                    196: 
                    197: #ifndef        NODELAY
                    198: /* ARGSUSED */
                    199: #endif
                    200: 
                    201: static int  tcpretry (tb, td)
                    202: struct tsapblk *tb;
                    203: struct TSAPdisconnect *td;
                    204: {
                    205: #ifdef NODELAY
                    206: #ifdef FIONBIO
                    207:     int            onoff;
                    208: #endif
                    209:     int            fd = tb -> tb_fd;
                    210:     fd_set  mask;
                    211:     struct sockaddr_in *isock = &peers[fd];
                    212: 
                    213:     FD_ZERO (&mask);
                    214:     FD_SET (fd, &mask);
                    215:     if (xselect (fd + 1, NULLFD, &mask, NULLFD, 0) < 1)
                    216:        return OK;
                    217: 
                    218:     if (!FD_ISSET (fd, &inprogress))
                    219:        return DONE;
                    220: 
                    221:     isock = &peers[fd];
                    222:     if (join_tcp_server (fd, isock) == NOTOK) {
                    223:        switch (errno) {
                    224:            case EINPROGRESS:
                    225:                return OK;
                    226: 
                    227:            case EISCONN:
                    228:                goto done;
                    229: 
                    230:            case EINVAL:        /* UNIX bug: could be any socket errno, e.g.,
                    231:                                   ETIMEDOUT */
                    232:                errno = ECONNREFUSED;
                    233:                /* and fall */
                    234:            default:
                    235:                break;
                    236:        }
                    237: 
                    238:        (void) tsaplose (td, DR_REFUSED, "connection", "unable to establish");
                    239:        FD_CLR (fd, &inprogress);
                    240:        (void) close_tcp_socket (fd);
                    241:        return (tb -> tb_fd = NOTOK);
                    242:     }
                    243: done: ;
                    244: 
                    245: #ifdef FIONBIO
                    246:     (void) ioctl (fd, FIONBIO, (onoff = 0, (char *) &onoff));
                    247: #endif
                    248: 
                    249:     FD_CLR (fd, &inprogress);
                    250: 
                    251:     return DONE;
                    252: #else
                    253:     return tsaplose (td, DR_OPERATION, NULLCP, "connection not in progress");
                    254: #endif
                    255: }
                    256: 
                    257: /*    init for read from network */
                    258: 
                    259: #ifndef        BRIDGE_X25
                    260: static
                    261: #endif
                    262: int    tcpinit (fd, t)
                    263: int    fd;
                    264: register struct tsapkt *t;
                    265: {
                    266:     register int    cc,
                    267:                     i;
                    268:     register char  *bp;
                    269: 
                    270:     for (bp = (char *) &t -> t_pkthdr, i = TPKT_HDRLEN (t);
                    271:            i > 0;
                    272:            bp += cc, i -= cc)
                    273:        switch (cc = read_tcp_socket (fd, bp, i)) {
                    274:            case NOTOK: 
                    275:            case OK: 
                    276:                return DR_NETWORK;
                    277: 
                    278:            default: 
                    279:                break;
                    280:        }
                    281: 
                    282:     if (t -> t_vrsn != TPKT_VRSN)
                    283:        return DR_PROTOCOL;
                    284: 
                    285:     if ((t -> t_length = ntohs (t -> t_length)) < TPKT_HDRLEN (t))
                    286:        return DR_LENGTH;
                    287: 
                    288:     return OK;
                    289: }
                    290: 
                    291: /*  */
                    292: 
                    293: /* ARGSUSED */
                    294: 
                    295: char   *tcpsave (fd, sin, cp1, cp2, td)
                    296: int    fd;
                    297: struct sockaddr_in *sin;
                    298: char   *cp1,
                    299:        *cp2;
                    300: struct TSAPdisconnect *td;
                    301: {
                    302:     static char buffer[BUFSIZ];
                    303: 
                    304:     (void) sprintf (buffer, "%c%d %s %s", NT_TCP, fd, cp1, cp2);
                    305: 
                    306:     return buffer;
                    307: }
                    308: 
                    309: /*  */
                    310: 
                    311: int    tcprestore (tb, buffer, td)
                    312: register struct tsapblk *tb;
                    313: char   *buffer;
                    314: struct TSAPdisconnect *td;
                    315: {
                    316:     int     fd;
                    317:     char    domain[NSAP_DOMAINLEN + 1];
                    318:     register struct NSAPaddr *na;
                    319:     register struct tsapADDR *ta;
                    320:     
                    321:     ta = &tb -> tb_initiating;
                    322:     ta -> ta_present = 1;
                    323:     na = &ta -> ta_addr;
                    324:     na -> na_stack = NA_TCP;
                    325:     na -> na_community = ts_comm_tcp_default;
                    326: 
                    327:     if (sscanf (buffer, "%d %s %s", &fd, na -> na_domain, domain) != 3
                    328:                || fd < 0)
                    329:        return tsaplose (td, DR_PARAMETER, NULLCP,
                    330:                         "bad initialization vector \"%s\"", buffer);
                    331: 
                    332:     tb -> tb_fd = fd;
                    333:     (void) TTService (tb);
                    334:     
                    335:     ta = &tb -> tb_responding;
                    336:     ta -> ta_present = 1;
                    337:     na = &ta -> ta_addr;
                    338:     na -> na_stack = NA_TCP;
                    339:     na -> na_community = ts_comm_tcp_default;
                    340:     (void) strncpy (na -> na_domain, domain, sizeof na -> na_domain);
                    341:     
                    342:     return OK;
                    343: }
                    344: 
                    345: /*  */
                    346: 
                    347: int    TTService (tb)
                    348: register struct tsapblk *tb;
                    349: {
                    350:     struct tsapkt *t;
                    351: 
                    352:     tb -> tb_flags |= TB_TCP;
                    353: 
                    354:     tb -> tb_tsdusize = MAX1006
                    355:                    - (tb -> tb_tpduslop = sizeof t -> t_pkthdr + DT_MAGIC);
                    356: 
                    357:     tb -> tb_retryfnx = tcpretry;
                    358: 
                    359:     tb -> tb_initfnx = tcpinit;
                    360:     tb -> tb_readfnx = read_tcp_socket;
                    361:     tb -> tb_writefnx = tp0write;
                    362:     tb -> tb_closefnx = close_tcp_socket;
                    363:     tb -> tb_selectfnx = select_tcp_socket;
                    364: 
                    365:     tp0init (tb);
                    366: }
                    367: #endif

unix.superglobalmegacorp.com

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