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

1.1       root        1: /* ts2x25.c - TPM: X.25 interface */
                      2: 
                      3: #ifndef lint
                      4: static char *rcsid = "$Header: /f/osi/tsap/RCS/ts2x25.c,v 7.3 90/07/09 14:51:23 mrose Exp $";
                      5: #endif
                      6: 
                      7: /*
                      8:  * $Header: /f/osi/tsap/RCS/ts2x25.c,v 7.3 90/07/09 14:51:23 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       ts2x25.c,v $
                     12:  * Revision 7.3  90/07/09  14:51:23  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.2  90/03/23  17:31:30  mrose
                     16:  * 8
                     17:  * 
                     18:  * Revision 7.1  89/12/07  01:07:39  mrose
                     19:  * queued writes
                     20:  * 
                     21:  * Revision 7.0  89/11/23  22:30:41  mrose
                     22:  * Release 6.0
                     23:  * 
                     24:  */
                     25: 
                     26: /*
                     27:  *                                NOTICE
                     28:  *
                     29:  *    Acquisition, use, and distribution of this module and related
                     30:  *    materials are subject to the restrictions of a license agreement.
                     31:  *    Consult the Preface in the User's Manual for the full terms of
                     32:  *    this agreement.
                     33:  *
                     34:  */
                     35: 
                     36: 
                     37: /* LINTLIBRARY */
                     38: 
                     39: #include <stdio.h>
                     40: #include "tpkt.h"
                     41: #include "tailor.h"
                     42: 
                     43: #ifdef  X25
                     44: #include "x25.h"
                     45: #include <sys/ioctl.h>
                     46: 
                     47: static  fd_set  inprogress;
                     48: static  struct NSAPaddr **peers = NULL;
                     49: 
                     50: extern int errno;
                     51: 
                     52: /*    N-CONNECT.REQUEST */
                     53: 
                     54: int     x25open (tb, local, remote, td, async)
                     55: register struct tsapblk *tb;
                     56: struct NSAPaddr *local,
                     57:                 *remote;
                     58: struct TSAPdisconnect *td;
                     59: {
                     60:     register int    fd;
                     61:     int     onoff;
                     62: 
                     63:         /*
                     64:          * start_x25_client does nothing with its arguments in the CAMTEC
                     65:          * case but there's less #ifdef code this way so...
                     66:          */
                     67:     if ((fd = start_x25_client (local)) == NOTOK)
                     68:         return tsaplose (td, DR_CONGEST, "socket", "unable to start");
                     69: 
                     70:     if (async) {
                     71:         if (ioctl (fd, FIONBIO, (onoff = 1, (char *) &onoff)) < 0) {
                     72:             (void) tsaplose (td, DR_CONGEST, "ioctl", "FIONBIO");
                     73:             (void) close_x25_socket (fd);
                     74:             return NOTOK;
                     75:         }
                     76:     }
                     77:     tb -> tb_fd = fd;
                     78:     (void) XTService (tb);
                     79: 
                     80:     if (join_x25_server (fd, remote) == NOTOK) {
                     81:         if (async)
                     82:             switch (errno) {
                     83:                 case EINPROGRESS:
                     84:                     if (peers == NULL) {
                     85:                         peers = (struct NSAPaddr **)
                     86:                                         calloc ((unsigned) getdtablesize (),
                     87:                                                 sizeof *peers);
                     88:                         if (peers == NULL) {
                     89:                             (void) tsaplose (td, DR_CONGEST, NULLCP,
                     90:                                              "out of memory");
                     91:                             (void) close_x25_socket (fd);
                     92:                             return (tb -> tb_fd = NOTOK);
                     93:                         }
                     94: 
                     95:                         FD_ZERO (&inprogress);
                     96:                     }
                     97:                    if (peers[fd] == NULL
                     98:                            && (peers[fd] = (struct NSAPaddr *)
                     99:                                                malloc (sizeof **peers))
                    100:                                    == NULL) {
                    101:                        (void) tsaplose (td, DR_CONGEST, NULLCP,
                    102:                                         "out of memory");
                    103:                        (void) close_x25_socket (fd);
                    104:                        return (tb -> tb_fd = NOTOK);
                    105:                    }
                    106:                    *(peers[fd]) = *remote;     /* struct copy */
                    107:                     FD_SET (fd, &inprogress);
                    108:                     return OK;
                    109: 
                    110:                 case EISCONN:
                    111:                     goto done;
                    112: 
                    113:                 default:
                    114:                     break;
                    115:             }
                    116: 
                    117:         (void) tsaplose (td, DR_REFUSED, "connection", "unable to establish");
                    118:         LLOG (x25_log, LLOG_NOTICE,
                    119:              ("connection to %s failed", na2str (remote)));
                    120:         (void) close_x25_socket (fd);
                    121:         return (tb -> tb_fd = NOTOK);
                    122:     }
                    123: done: ;
                    124: 
                    125:     if (async)
                    126:         if (ioctl (fd, FIONBIO, (onoff = 0, (char *) &onoff)) < 0) {
                    127:             (void) tsaplose (td, DR_CONGEST, "ioctl", "FIONBIO");
                    128:             (void) close_x25_socket (fd);
                    129:             return NOTOK;
                    130:         }
                    131: 
                    132:     (void) XTService (tb);      /* in case pktsize changed... */
                    133:     LLOG (x25_log, LLOG_NOTICE,
                    134:          ("connection %d to %s", fd, na2str (remote)));
                    135: 
                    136:     return DONE;
                    137: }
                    138: 
                    139: /*  */
                    140: 
                    141: static int  x25retry (tb, td)
                    142: struct tsapblk *tb;
                    143: struct TSAPdisconnect *td;
                    144: {
                    145:     int     onoff;
                    146:     int     fd = tb -> tb_fd;
                    147:     fd_set  mask;
                    148:     struct NSAPaddr *remote = peers[fd];
                    149: 
                    150:     FD_ZERO (&mask);
                    151:     FD_SET (fd, &mask);
                    152:     if (xselect (fd + 1, NULLFD, &mask, NULLFD, 0) < 1)
                    153:         return OK;
                    154: 
                    155:     if (!FD_ISSET (fd, &inprogress))
                    156:         return DONE;
                    157: 
                    158:     if (join_x25_server (fd, remote) == NOTOK) {
                    159:         switch (errno) {
                    160:             case EINPROGRESS:
                    161:                 return OK;
                    162: 
                    163:             case EISCONN:
                    164:                 goto done;
                    165: 
                    166:             case EINVAL:        /* UNIX bug: could be any socket errno, e.g.,
                    167:                                    ETIMEDOUT */
                    168:                 errno = ECONNREFUSED;
                    169:                 /* and fall */
                    170:             default:
                    171:                 break;
                    172:         }
                    173: 
                    174:         (void) tsaplose (td, DR_REFUSED, "connection", "unable to establish");
                    175:         FD_CLR (fd, &inprogress);
                    176:         (void) close_x25_socket (fd);
                    177:         LLOG (x25_log, LLOG_NOTICE,
                    178:              ("connection to %s failed", na2str (remote)));
                    179:         return (tb -> tb_fd = NOTOK);
                    180:     }
                    181: done: ;
                    182: 
                    183:     (void) ioctl (fd, FIONBIO, (onoff = 0, (char *) &onoff));
                    184:     FD_CLR (fd, &inprogress);
                    185: 
                    186:     (void) XTService (tb);      /* in case pktsize changed... */
                    187:     LLOG (x25_log, LLOG_NOTICE,
                    188:          ("connection %d to %s", fd, na2str (remote)));
                    189: 
                    190:     return DONE;
                    191: }
                    192: 
                    193: /*    init for read from network */
                    194: 
                    195: static char nsdu[MAXNSDU];
                    196: static char *np;
                    197: static int  bl;
                    198: 
                    199: 
                    200: static int  x25init (fd, t)
                    201: int     fd;
                    202: register struct tsapkt *t;
                    203: {
                    204:     register int    cc;
                    205: 
                    206: /* XXX: cc should be set to the maximum acceptable NSDU length.
                    207:    Longer NSDUs will be truncated without notification.
                    208:    Should be configurable (or set during N-CONNECT and remembered) */
                    209: 
                    210:     cc = sizeof nsdu;
                    211: 
                    212:     switch (cc = read_x25_socket (fd, nsdu, cc)) {
                    213:         case OK:                /* no data ? */
                    214:         case NOTOK:
                    215: #ifdef  SUN_X25
                    216:             if (compat_log -> ll_events & LLOG_EXCEPTIONS)
                    217:                 (void) log_cause_and_diag(fd);
                    218: #endif
                    219:             return DR_NETWORK;
                    220: 
                    221:         default:
                    222:             t -> t_length = cc + sizeof t -> t_pkthdr;
                    223:             break;
                    224:     }
                    225: 
                    226:     if (t -> t_length < TPKT_HDRLEN (t))
                    227:         return DR_LENGTH;
                    228: 
                    229:     t -> t_li = nsdu[0];
                    230:     t -> t_code = nsdu[1];
                    231: 
                    232:     np = nsdu + 2;
                    233:     bl = t -> t_length - TPKT_HDRLEN (t);
                    234: 
                    235:     t -> t_vrsn = TPKT_VRSN;    /* Not really needed! */
                    236: 
                    237:     return OK;
                    238: }
                    239: 
                    240: 
                    241: /* ARGSUSED */
                    242: 
                    243: static int  read_nsdu_buffer (fd, buffer, cc)
                    244: int     fd;
                    245: register char  *buffer;
                    246: register int    cc;
                    247: {
                    248:     if (cc > bl)
                    249:         cc = bl;
                    250: 
                    251:     if (cc > 0) {
                    252:         bcopy (np, buffer, cc);
                    253:         np += cc, bl -= cc;
                    254:     }
                    255: 
                    256:     return cc;
                    257: }
                    258: 
                    259: /*  */
                    260: 
                    261: /* ARGSUSED */
                    262: 
                    263: char   *x25save (fd, dte1, l1, dte2, l2, td)
                    264: int     fd;
                    265: char   *dte1;
                    266: int     l1;
                    267: char   *dte2;
                    268: int     l2;
                    269: struct TSAPdisconnect *td;
                    270: {
                    271:     static char buffer[BUFSIZ];
                    272: 
                    273:     (void) sprintf (buffer, "%c%d %*s %*s",
                    274:                         NT_X25, fd, l1, dte1, l2, dte2);
                    275: 
                    276:     return buffer;
                    277: }
                    278: 
                    279: 
                    280: int     x25restore (tb, buffer, td)
                    281: register struct tsapblk *tb;
                    282: char   *buffer;
                    283: struct TSAPdisconnect *td;
                    284: {
                    285:     int     fd;
                    286:     char    dte1[NSAP_DTELEN + 1],
                    287:             dte2[NSAP_DTELEN + 1];
                    288:     register struct NSAPaddr   *na;
                    289:     register struct tsapADDR   *ta;
                    290: 
                    291:     if (sscanf (buffer, "%d %s %s", &fd, dte1, dte2) != 3 || fd < 0)
                    292:         return tsaplose (td, DR_PARAMETER, NULLCP,
                    293:                 "bad initialization vector \"%s\"", buffer);
                    294: 
                    295:     ta = &tb -> tb_initiating;
                    296:     ta -> ta_present = 1;
                    297:     na = &ta -> ta_addr;
                    298:     na -> na_stack = NA_X25;
                    299:     na -> na_community = ts_comm_x25_default;
                    300:     bcopy(dte1, na -> na_dte, strlen(dte1));
                    301:     na -> na_dtelen = strlen (na -> na_dte);
                    302: 
                    303:     tb -> tb_fd = fd;
                    304:     (void) XTService (tb);
                    305: 
                    306:     ta = &tb -> tb_responding;
                    307:     ta -> ta_present = 1;
                    308:     na = &ta -> ta_addr;
                    309:     na -> na_stack = NA_X25;
                    310:     na -> na_community = ts_comm_x25_default;
                    311:     bcopy(dte2, na -> na_dte, strlen(dte2));
                    312:     na -> na_dtelen = strlen (na -> na_dte);
                    313: 
                    314: #ifdef  SUN_X25
                    315:     (void) set_x25_facilities (tb -> tb_fd, -1, "Negotiated");
                    316: #endif
                    317: 
                    318:     return OK;
                    319: }
                    320: 
                    321: /*  */
                    322: 
                    323: int     XTService (tb)
                    324: register struct tsapblk *tb;
                    325: {
                    326: #ifndef        UBC_X25
                    327:     int     maxnsdu = MAXNSDU;
                    328: #else
                    329:     int     maxnsdu = X25_PACKETSIZE;
                    330: #endif
                    331: 
                    332:     tb -> tb_flags |= TB_X25;
                    333: 
                    334: #ifdef  notyet
                    335:     if (recvpktsize > DT_MAGIC && recvpktsize < maxnsdu)
                    336:         maxnsdu = recvpktsize;
                    337:     if (sendpktsize > DT_MAGIC && sendpktsize < maxnsdu)
                    338:         maxnsdu = sendpktsize;
                    339: #endif
                    340:     tb -> tb_tsdusize = maxnsdu - (tb -> tb_tpduslop = DT_MAGIC);
                    341: 
                    342:     tb -> tb_retryfnx = x25retry;
                    343: 
                    344:     tb -> tb_initfnx = x25init;
                    345:     tb -> tb_readfnx = read_nsdu_buffer;
                    346:     tb -> tb_writefnx = tp0write;
                    347:     tb -> tb_closefnx = close_x25_socket;
                    348:     tb -> tb_selectfnx = select_x25_socket;
                    349: 
                    350:     tp0init (tb);
                    351: }
                    352: #endif

unix.superglobalmegacorp.com

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