Annotation of 43BSDReno/contrib/isode-beta/psap2-lpp/ps2tcp.c, revision 1.1.1.1

1.1       root        1: /* psaptcp.c - PPM: TCP backing */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/psap2-lpp/RCS/ps2tcp.c,v 7.2 90/07/09 14:45:01 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/psap2-lpp/RCS/ps2tcp.c,v 7.2 90/07/09 14:45:01 mrose Exp $
                      9:  *
                     10:  * Contributed by The Wollongong Group, Inc.
                     11:  *
                     12:  *
                     13:  * $Log:       ps2tcp.c,v $
                     14:  * Revision 7.2  90/07/09  14:45:01  mrose
                     15:  * sync
                     16:  * 
                     17:  * Revision 7.1  90/07/01  21:05:19  mrose
                     18:  * pepsy
                     19:  * 
                     20:  * Revision 7.0  89/11/23  22:15:50  mrose
                     21:  * Release 6.0
                     22:  * 
                     23:  */
                     24: 
                     25: /*
                     26:  *                               NOTICE
                     27:  *
                     28:  *    Acquisition, use, and distribution of this module and related
                     29:  *    materials are subject to the restrictions of a license agreement.
                     30:  *    Consult the Preface in the User's Manual for the full terms of
                     31:  *    this agreement.
                     32:  *
                     33:  */
                     34: 
                     35: 
                     36: /* LINTLIBRARY */
                     37: 
                     38: #include <stdio.h>
                     39: #define        LPP
                     40: #include "PS-types.h"
                     41: #include "ppkt.h"
                     42: #include "tsap.h"
                     43: #include "tailor.h"
                     44: 
                     45: #include "internet.h"
                     46: #include <errno.h>
                     47: #ifdef BSD42
                     48: #include <sys/ioctl.h>
                     49: #endif
                     50: 
                     51: /*    DATA */
                     52: 
                     53: #ifdef FIONBIO
                     54: static  fd_set  inprogress;
                     55: static struct sockaddr_in *peers = NULL;
                     56: #endif
                     57: 
                     58: extern int  errno;
                     59: 
                     60: /*  */
                     61: 
                     62: int    tcpopen (pb, calling, called, pi, async)
                     63: register struct psapblk *pb;
                     64: struct NSAPaddr *calling,
                     65:                *called;
                     66: struct PSAPindication *pi;
                     67: int    async;
                     68: {
                     69:     int     fd;
                     70: #ifdef FIONBIO
                     71:     int            onoff;
                     72: #endif
                     73:     struct sockaddr_in  lo_socket,
                     74:                         in_socket;
                     75:     register struct sockaddr_in *lsock = &lo_socket,
                     76:                                *isock = &in_socket;
                     77:     register struct hostent *hp;
                     78: 
                     79: #ifndef        FIONBIO
                     80:     if (async)
                     81:        return psaplose (pi, PC_PARAMETER, NULLCP,
                     82:                         "asynchronous not supported");
                     83: #endif
                     84: 
                     85:     bzero ((char *) isock, sizeof *isock);
                     86: 
                     87:     if (called -> na_port == 0)
                     88:        return psaplose (pi, PC_ADDRESS, NULLCP,
                     89:                         "TCP port of called address not specified");
                     90:     else
                     91:        isock -> sin_port = called -> na_port;
                     92: 
                     93:     if ((hp = gethostbystring (called -> na_domain)) == NULL)
                     94:        return psaplose (pi, PC_ADDRESS, NULLCP, "%s: unknown host",
                     95:                    called -> na_domain);
                     96: #ifdef notanymore
                     97:     (void) strncpy (called -> na_domain, hp -> h_name,
                     98:                        sizeof called -> na_domain);
                     99: #endif
                    100: 
                    101:     isock -> sin_family = hp -> h_addrtype;
                    102:     inaddr_copy (hp, isock);
                    103: 
                    104: #ifndef        notanymore
                    105:     (void) strcpy (called -> na_domain, inet_ntoa (isock -> sin_addr));
                    106: #endif
                    107: 
                    108:     if (calling && calling -> na_domain[0]) {
                    109:        bzero ((char *) lsock, sizeof *lsock);
                    110: 
                    111:        if ((hp = gethostbystring (calling -> na_domain)) == NULL)
                    112:            return psaplose (pi, PC_ADDRESS, NULLCP, "%s: unknown host",
                    113:                    calling -> na_domain);
                    114: 
                    115:        if ((lsock -> sin_family = hp -> h_addrtype) != isock -> sin_family)
                    116:            return psaplose (pi, PC_ADDRESS, NULLCP,
                    117:                    "address family mismatch");
                    118: 
                    119:        inaddr_copy (hp, lsock);
                    120:     }
                    121:     else
                    122:        lsock = NULL;
                    123: 
                    124:     if ((fd = start_tcp_client (lsock, 0)) == NOTOK)
                    125:        return psaplose (pi, PC_CONGEST, "socket", "unable to start");
                    126: 
                    127: #ifdef FIONBIO
                    128:     if (async)
                    129:        (void) ioctl (fd, FIONBIO, (onoff = 1, (char *) &onoff));
                    130: #endif
                    131:     PTservice (pb, fd);
                    132: 
                    133:     if (join_tcp_server (fd, isock) == NOTOK) {
                    134: #ifdef FIONBIO
                    135:        if (async)
                    136:            switch (errno) {
                    137:                case EINPROGRESS: 
                    138:                    if (peers == NULL) {
                    139:                        peers = (struct sockaddr_in *)
                    140:                                        calloc ((unsigned) getdtablesize (),
                    141:                                                sizeof *peers);
                    142:                        if (peers == NULL) {
                    143:                            (void) psaplose (pi, PC_CONGEST, NULLCP,
                    144:                                             "out of memory");
                    145:                            (void) close_tcp_socket (fd);
                    146:                            return (pb -> pb_fd = NOTOK);
                    147:                        }
                    148: 
                    149:                        FD_ZERO (&inprogress);
                    150:                    }
                    151:                    FD_SET (fd, &inprogress);
                    152:                    peers[fd] = *isock;/* struct copy */
                    153:                    return OK;
                    154: 
                    155:                case EISCONN: 
                    156:                    goto done;
                    157: 
                    158:                default: 
                    159:                    break;
                    160:            }
                    161: #endif
                    162: 
                    163:        (void) psaplose (pi, PC_REFUSED, "connection", "unable to establish");
                    164:        (void) close_tcp_socket (fd);
                    165:        return (pb -> pb_fd = NOTOK);
                    166:     }
                    167: #ifdef FIONBIO
                    168: done: ;
                    169: 
                    170:     if (async)
                    171:        (void) ioctl (fd, FIONBIO, (onoff = 0, (char *) &onoff));
                    172: #endif
                    173: 
                    174:     if (tcpready (pb, pi) == NOTOK) {
                    175:        (void) close_tcp_socket (fd);
                    176:        pb -> pb_fd = NOTOK;
                    177:     }
                    178: 
                    179:     return DONE;
                    180: }
                    181: 
                    182: /*  */
                    183: 
                    184: /* ARGSUSED */
                    185: 
                    186: char   *tcpsave (fd, sin, cp1, cp2, td)
                    187: int    fd;
                    188: struct sockaddr_in *sin;
                    189: char   *cp1,
                    190:        *cp2;
                    191: struct TSAPdisconnect *td;
                    192: {
                    193:     static char        buffer[BUFSIZ];
                    194: 
                    195:     (void) sprintf (buffer, "%c%d %s %s", PT_TCP, fd, cp1, cp2);
                    196: 
                    197:     return buffer;
                    198: }
                    199: 
                    200: 
                    201: int    tcprestore (pb, buffer, pi)
                    202: register struct psapblk *pb;
                    203: char   *buffer;
                    204: struct PSAPindication *pi;
                    205: {
                    206:     int            fd;
                    207:     char    domain[NSAP_DOMAINLEN + 1];
                    208:     register struct NSAPaddr *na;
                    209: 
                    210:     na = &pb -> pb_initiating;
                    211:     na -> na_stack = NA_TCP;
                    212:     na -> na_community = ts_comm_tcp_default;
                    213: 
                    214:     if (sscanf (buffer, "%d %s %s", &fd, na -> na_domain, domain) != 3
                    215:            || fd < 0)
                    216:        return psaplose (pi, PC_PARAMETER, NULLCP,
                    217:                         "bad initialization vector");
                    218: 
                    219:     PTservice (pb, fd);
                    220: 
                    221:     na = pb -> pb_responding.pa_addr.sa_addr.ta_addrs;
                    222:     na -> na_stack = NA_TCP;
                    223:     na -> na_community = ts_comm_tcp_default;
                    224:     (void) strncpy (na -> na_domain, domain, sizeof na -> na_domain);
                    225: 
                    226:     if ((pb -> pb_stream = ps_alloc (fdx_open)) == NULLPS
                    227:            || fdx_setup (pb -> pb_stream, pb -> pb_fd) == NOTOK)
                    228:        return psaplose (pi, PC_CONGEST, NULLCP, NULLCP);
                    229: 
                    230:     return OK;
                    231: }
                    232: 
                    233: /*  */
                    234: 
                    235: static int  tcpretry (pb, pi)
                    236: register struct psapblk *pb;
                    237: struct PSAPindication *pi;
                    238: {
                    239: #ifdef FIONBIO
                    240:     int            onoff;
                    241:     int            fd = pb -> pb_fd;
                    242:     fd_set  mask;
                    243:     struct sockaddr_in *isock = &peers[fd];
                    244: 
                    245:     if (!FD_SET (fd, &inprogress))
                    246:        return psaplose (pi, PC_PARAMETER, NULLCP,
                    247:                         "connection not in progress");
                    248:     FD_ZERO (&mask);
                    249:     FD_SET (fd, &mask);
                    250: 
                    251:     if (xselect (fd + 1, NULLFD, &mask, NULLFD, 0) < 1)
                    252:        return OK;
                    253: 
                    254:     isock = &peers[fd];
                    255:     if (join_tcp_server (fd, isock) == NOTOK) {
                    256:        switch (errno) {
                    257:            case EINPROGRESS:
                    258:                return OK;
                    259: 
                    260:            case EISCONN:
                    261:                goto done;
                    262: 
                    263:            case EINVAL:        /* UNIX bug: could be any socket errno, e.g.,
                    264:                                   ETIMEDOUT */
                    265:                errno = ECONNREFUSED;
                    266:                /* and fall */
                    267:            default:
                    268:                break;
                    269:        }
                    270: 
                    271:        (void) psaplose (pi, PC_REFUSED, "connection", "unable to establish");
                    272:        FD_CLR (fd, &inprogress);
                    273:        (void) close_tcp_socket (fd);
                    274:        return (pb -> pb_fd = NOTOK);
                    275:     }
                    276: done: ;
                    277: 
                    278:     (void) ioctl (fd, FIONBIO, (onoff = 0, (char *) &onoff));
                    279:     FD_CLR (fd, &inprogress);
                    280: 
                    281:     if (tcpready (pb, pi) == NOTOK) {
                    282:        (void) close_tcp_socket (fd);
                    283:        return (pb -> pb_fd = NOTOK);
                    284:     }
                    285: 
                    286:     return DONE;
                    287: #else
                    288:     return psaplose (pi, PC_OPERATION, NULLCP, "connection not in progress");
                    289: #endif
                    290: }
                    291: 
                    292: /*  */
                    293: 
                    294: static int  tcpready (pb, pi)
                    295: register struct psapblk *pb;
                    296: struct PSAPindication *pi;
                    297: {
                    298:     PS     ps;
                    299: 
                    300:     if ((pb -> pb_stream = ps_alloc (fdx_open)) == NULLPS
                    301:            || fdx_setup (pb -> pb_stream, pb -> pb_fd) == NOTOK)
                    302:        return psaplose (pi, PC_CONGEST, NULLCP, NULLCP);
                    303: 
                    304:     PLOGP (psap2_log,PS_PDUs, pb -> pb_retry, "ConnectRequest-PDU", 0);
                    305: 
                    306:     if (pe2ps (ps = pb -> pb_stream, pb -> pb_retry) == NOTOK)
                    307:        return pslose (pi, ps -> ps_errno);
                    308: 
                    309:     pe_free (pb -> pb_retry);
                    310:     pb -> pb_retry = NULLPE;
                    311: 
                    312:     if ((pb -> pb_response = ps2pe (pb -> pb_stream)) == NULLPE)
                    313:        return pslose (pi, ps -> ps_errno);
                    314: 
                    315:     return OK;
                    316: }
                    317: 
                    318: /*  */
                    319: 
                    320: #define        tcpclose        close_tcp_socket
                    321: #define        tcpselect       select_tcp_socket
                    322: 
                    323: 
                    324: static int  PTservice (pb, fd)
                    325: register struct psapblk *pb;
                    326: int    fd;
                    327: {
                    328:     pb -> pb_fd = fd;
                    329: 
                    330:     pb -> pb_reliability = HIGH_QUALITY;
                    331: 
                    332:     pb -> pb_retryfnx = tcpretry;
                    333:     pb -> pb_closefnx = tcpclose;
                    334:     pb -> pb_selectfnx = tcpselect;
                    335: }

unix.superglobalmegacorp.com

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