Annotation of 43BSDReno/contrib/isode-beta/tsap/tsaprovider.c, revision 1.1

1.1     ! root        1: /* tsaprovider.c - implement the transport service */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/tsap/RCS/tsaprovider.c,v 7.3 90/03/23 17:31:50 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/tsap/RCS/tsaprovider.c,v 7.3 90/03/23 17:31:50 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       tsaprovider.c,v $
        !            12:  * Revision 7.3  90/03/23  17:31:50  mrose
        !            13:  * 8
        !            14:  * 
        !            15:  * Revision 7.2  90/01/11  18:38:09  mrose
        !            16:  * real-sync
        !            17:  * 
        !            18:  * Revision 7.1  89/12/07  01:07:53  mrose
        !            19:  * queued writes
        !            20:  * 
        !            21:  * Revision 7.0  89/11/23  22:30:56  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 <signal.h>
        !            41: #include "tpkt.h"
        !            42: #include "mpkt.h"
        !            43: #include "isoservent.h"
        !            44: #include "tailor.h"
        !            45: 
        !            46: 
        !            47: #define        selmask(fd,m,n) \
        !            48: { \
        !            49:     FD_SET (fd, &(m)); \
        !            50:     if ((fd) >= (n)) \
        !            51:        (n) = (fd) + 1; \
        !            52: }
        !            53: 
        !            54: /*    DATA */
        !            55: 
        !            56: static int once_only = 0;
        !            57: static struct tsapblk tsapque;
        !            58: static struct tsapblk *THead = &tsapque;
        !            59: 
        !            60: 
        !            61: #ifndef        SIGPOLL
        !            62: static int TPid = NOTOK;
        !            63: #endif
        !            64: 
        !            65: /*    T-DATA.REQUEST */
        !            66: 
        !            67: int     TDataRequest (sd, data, cc, td)
        !            68: int    sd;
        !            69: char   *data;
        !            70: int    cc;
        !            71: struct TSAPdisconnect *td;
        !            72: {
        !            73:     SBV     smask,
        !            74:            imask;
        !            75:     SFP            istat;
        !            76:     int     result;
        !            77:     struct udvec uvs[2];
        !            78:     register struct udvec *uv = uvs;
        !            79:     register struct tsapblk *tb;
        !            80: 
        !            81:     missingP (data);
        !            82:     if (cc <= 0)
        !            83:        return tsaplose (td, DR_PARAMETER, NULLCP,
        !            84:                    "illegal value for TSDU length (%d)", cc);
        !            85:     missingP (td);
        !            86: 
        !            87:     smask = sigioblock ();
        !            88: 
        !            89:     tsapPsig (tb, sd);
        !            90: 
        !            91:     if ((istat = signal (SIGINT, SIG_DFL)) != SIG_DFL) {
        !            92:        (void) signal (SIGINT, istat);
        !            93:        imask = siginblock ();
        !            94:     }
        !            95: 
        !            96:     uv -> uv_base = data, uv -> uv_len = cc, uv++;
        !            97:     uv -> uv_base = NULL;
        !            98: 
        !            99:     result = (*tb -> tb_writePfnx) (tb, uvs, 0, td);
        !           100: 
        !           101:     if (istat != SIG_DFL)
        !           102:        (void) siginmask (imask);
        !           103: 
        !           104:     (void) sigiomask (smask);
        !           105: 
        !           106:     return result;
        !           107: }
        !           108: 
        !           109: /*    T-EXPEDITED-DATA.REQUEST */
        !           110: 
        !           111: int     TExpdRequest (sd, data, cc, td)
        !           112: int    sd;
        !           113: char   *data;
        !           114: int    cc;
        !           115: struct TSAPdisconnect *td;
        !           116: {
        !           117:     SBV     smask,
        !           118:            imask;
        !           119:     SFP            istat;
        !           120:     int     result;
        !           121:     struct udvec uvs[2];
        !           122:     register struct udvec *uv = uvs;
        !           123:     register struct tsapblk *tb;
        !           124: 
        !           125:     missingP (data);
        !           126:     toomuchP (data, cc, TX_SIZE, "expedited");
        !           127:     if (cc <= 0)
        !           128:        return tsaplose (td, DR_PARAMETER, NULLCP,
        !           129:                    "illegal value for XSDU length (%d)", cc);
        !           130:     missingP (td);
        !           131: 
        !           132:     smask = sigioblock ();
        !           133: 
        !           134:     tsapPsig (tb, sd);
        !           135: 
        !           136:     if ((istat = signal (SIGINT, SIG_DFL)) != SIG_DFL) {
        !           137:        (void) signal (SIGINT, istat);
        !           138:        imask = siginblock ();
        !           139:     }
        !           140: 
        !           141:     uv -> uv_base = data, uv -> uv_len = cc, uv++;
        !           142:     uv -> uv_base = NULL;
        !           143: 
        !           144:     if (tb -> tb_flags & TB_EXPD)
        !           145:        result = (*tb -> tb_writePfnx) (tb, uvs, 1, td);
        !           146:     else
        !           147:        result = tsaplose (td, DR_OPERATION, NULLCP,
        !           148:                            "expedited service unavailable");
        !           149: 
        !           150:     if (istat != SIG_DFL)
        !           151:        (void) siginmask (imask);
        !           152: 
        !           153:     (void) sigiomask (smask);
        !           154: 
        !           155:     return result;
        !           156: }
        !           157: 
        !           158: /*    T-WRITE.REQUEST (pseudo; write user data vectors) */
        !           159: 
        !           160: int     TWriteRequest (sd, uv, td)
        !           161: int     sd;
        !           162: struct udvec *uv;
        !           163: struct TSAPdisconnect  *td;
        !           164: {
        !           165:     register int    n;
        !           166:     SBV     smask,
        !           167:            imask;
        !           168:     SFP            istat;
        !           169:     int     result;
        !           170:     register struct tsapblk *tb;
        !           171:     register struct udvec *vv;
        !           172: 
        !           173:     missingP (uv);
        !           174:     n = 0;
        !           175:     for (vv = uv; vv -> uv_base; vv++)
        !           176:        n += vv -> uv_len;
        !           177:     if (n == 0)
        !           178:        return tsaplose (td, DR_PARAMETER, NULLCP, "zero-length TSDU");
        !           179:     missingP (td);
        !           180: 
        !           181:     smask = sigioblock ();
        !           182: 
        !           183:     tsapPsig (tb, sd);
        !           184: 
        !           185:     if ((istat = signal (SIGINT, SIG_DFL)) != SIG_DFL) {
        !           186:        (void) signal (SIGINT, istat);
        !           187:        imask = siginblock ();
        !           188:     }
        !           189: 
        !           190:     result = (*tb -> tb_writePfnx) (tb, uv, 0, td);
        !           191: 
        !           192:     if (istat != SIG_DFL)
        !           193:        (void) siginmask (imask);
        !           194: 
        !           195:     (void) sigiomask (smask);
        !           196: 
        !           197:     return result;
        !           198: }
        !           199: 
        !           200: /*    T-READ.REQUEST (pseudo; synchronous read) */
        !           201: 
        !           202: int     TReadRequest (sd, tx, secs, td)
        !           203: int    sd;
        !           204: register struct TSAPdata *tx;
        !           205: int    secs;
        !           206: register struct TSAPdisconnect *td;
        !           207: {
        !           208:     SBV            smask,
        !           209:            imask;
        !           210:     SFP            istat;
        !           211:     int     nfds,
        !           212:            oob,
        !           213:             result;
        !           214:     fd_set  ifds,
        !           215:            efds,
        !           216:            mask;
        !           217:     register struct tsapblk *tb;
        !           218: 
        !           219:     missingP (tx);
        !           220:     missingP (td);
        !           221: 
        !           222:     smask = sigioblock ();
        !           223: 
        !           224:     tsapPsig (tb, sd);
        !           225: 
        !           226:     if ((istat = signal (SIGINT, SIG_DFL)) != SIG_DFL) {
        !           227:        (void) signal (SIGINT, istat);
        !           228:        imask = siginblock ();
        !           229:     }
        !           230: 
        !           231:     nfds = 0;
        !           232:     FD_ZERO (&mask);
        !           233:     selmask (tb -> tb_fd, mask, nfds);
        !           234: 
        !           235:     for (;;) {
        !           236:        ifds = efds = mask;             /* struct copy */
        !           237: 
        !           238:        if (tb -> tb_checkfnx == NULLIFP || (*tb -> tb_checkfnx) (tb) != OK)
        !           239:            switch ((*tb -> tb_selectfnx) (nfds, &ifds, NULLFD, &efds, secs)) {
        !           240:                case NOTOK:             /* let read function find error... */
        !           241:                    ifds = mask;
        !           242:                    break;
        !           243: 
        !           244:                case OK:
        !           245:                    result = tsaplose (td, DR_TIMER, NULLCP, NULLCP);
        !           246:                    goto out;
        !           247: 
        !           248:                default:
        !           249:                    break;
        !           250:            }
        !           251:        else
        !           252:            FD_ZERO (&efds);
        !           253: 
        !           254:        if ((oob = FD_ISSET (tb -> tb_fd, &efds))
        !           255:                || FD_ISSET (tb -> tb_fd, &ifds))
        !           256:            result = (*tb -> tb_readPfnx) (tb, tx, td, secs != NOTOK, oob);
        !           257:        else
        !           258:            result = DONE;
        !           259:        if (result != DONE)
        !           260:            break;
        !           261:        if (secs != NOTOK) {
        !           262:            result = tsaplose (td, DR_TIMER, NULLCP, NULLCP);
        !           263:            break;
        !           264:        }
        !           265:     }
        !           266: out: ;
        !           267: 
        !           268:     if (istat != SIG_DFL)
        !           269:        (void) siginmask (imask);
        !           270: 
        !           271:     (void) sigiomask (smask);
        !           272: 
        !           273:     return result;
        !           274: }
        !           275: 
        !           276: /*    T-DISCONNECT.REQUEST */
        !           277: 
        !           278: int     TDiscRequest (sd, data, cc, td)
        !           279: int    sd;
        !           280: char   *data;
        !           281: int    cc;
        !           282: register struct TSAPdisconnect *td;
        !           283: {
        !           284:     SBV     smask;
        !           285:     int     result;
        !           286:     register struct tsapblk *tb;
        !           287: 
        !           288:     toomuchP (data, cc, TD_SIZE, "disconnect");
        !           289: 
        !           290:     smask = sigioblock ();
        !           291: 
        !           292:     if ((tb = findtblk (sd)) == NULL) {
        !           293:        (void) sigiomask (smask);
        !           294:        return tsaplose (td, DR_PARAMETER, NULLCP,
        !           295:                         "invalid transport descriptor");
        !           296:     }
        !           297: 
        !           298:     result = (*tb -> tb_discPfnx) (tb, data, cc, td);
        !           299: 
        !           300:     (void) sigiomask (smask);
        !           301: 
        !           302:     return result;
        !           303: }
        !           304: 
        !           305: /*    set asynchronous event indications */
        !           306: 
        !           307: int    TSetIndications (sd, data, disc, td)
        !           308: int    sd;
        !           309: IFP    data,
        !           310:        disc;
        !           311: struct TSAPdisconnect *td;
        !           312: {
        !           313:     SBV            smask;
        !           314:     int     result;
        !           315:     register struct tsapblk *tb;
        !           316: 
        !           317:     if (data || disc) {
        !           318:        missingP (data);
        !           319:        missingP (disc);
        !           320:     }
        !           321: 
        !           322:     smask = sigioblock ();
        !           323: 
        !           324:     tsapPsig (tb, sd);
        !           325: 
        !           326:     if (tb -> tb_DataIndication = data)
        !           327:        tb -> tb_flags |= TB_ASYN;
        !           328:     else
        !           329:        tb -> tb_flags &= ~TB_ASYN;
        !           330:     tb -> tb_DiscIndication = disc;
        !           331: 
        !           332:     result = TWakeUp (tb, td);
        !           333: 
        !           334:     (void) sigiomask (smask);
        !           335: 
        !           336:     return result;
        !           337: }
        !           338: 
        !           339: /*    map transport descriptors for select() */
        !           340: 
        !           341: int    TSelectMask (sd, mask, nfds, td)
        !           342: int    sd;
        !           343: fd_set *mask;
        !           344: int    *nfds;
        !           345: register struct TSAPdisconnect *td;
        !           346: {
        !           347:     SBV     smask;
        !           348:     register struct tsapblk *tb;
        !           349: 
        !           350:     missingP (mask);
        !           351:     missingP (nfds);
        !           352: 
        !           353:     smask = sigioblock ();
        !           354: 
        !           355:     if ((tb = findtblk (sd)) == NULL) {
        !           356:        (void) sigiomask (smask);
        !           357:        return tsaplose (td, DR_PARAMETER, NULLCP,
        !           358:                            "invalid transport descriptor");
        !           359:     }
        !           360: 
        !           361:     if (tb -> tb_checkfnx && (*tb -> tb_checkfnx) (tb) == OK) {
        !           362:        (void) sigiomask (smask);
        !           363:        return tsaplose (td, DR_WAITING, NULLCP, NULLCP);
        !           364:     }
        !           365: 
        !           366:     selmask (tb -> tb_fd, *mask, *nfds);
        !           367: 
        !           368:     (void) sigiomask (smask);
        !           369: 
        !           370:     return OK;
        !           371: }
        !           372: 
        !           373: /*    NSAP interface: N-DATA.INDICATION */
        !           374: 
        !           375: /* ARGSUSED */
        !           376: 
        !           377: static SFD DATAser (sig, code, sc)
        !           378: int    sig;
        !           379: long   code;
        !           380: struct sigcontext *sc;
        !           381: {
        !           382:     int     n,
        !           383:            nfds,
        !           384:            oob,
        !           385:            sd;
        !           386:     fd_set  ifds,
        !           387:            efds,
        !           388:            imask,
        !           389:            emask;
        !           390: #ifndef        BSDSIGS
        !           391:     SBV            smask;
        !           392: #endif
        !           393:     IFP            disc;
        !           394:     register struct tsapblk *tb,
        !           395:                            *tb2;
        !           396:     struct TSAPdata txs;
        !           397:     register struct TSAPdata   *tx = &txs;
        !           398:     struct TSAPdisconnect   tds;
        !           399:     register struct TSAPdisconnect *td = &tds;
        !           400: 
        !           401: #ifndef        BSDSIGS
        !           402:     (void) signal (SIGEMT, DATAser);
        !           403: 
        !           404:     smask = sigioblock ();
        !           405: #endif
        !           406: 
        !           407:     for (;;) {
        !           408:        n = 0;
        !           409:        FD_ZERO (&ifds);
        !           410:        FD_ZERO (&efds);
        !           411:        for (tb = THead -> tb_forw; tb != THead; tb = tb -> tb_forw)
        !           412:            if (tb -> tb_fd != NOTOK && (tb -> tb_flags & TB_ASYN)) {
        !           413:                nfds = 0;
        !           414:                FD_ZERO (&imask);
        !           415:                selmask (tb -> tb_fd, imask, nfds);
        !           416:                emask = imask;          /* struct copy */
        !           417:                if ((*tb -> tb_selectfnx) (nfds, &imask, NULLFD, &emask, 0)
        !           418:                        > OK) {
        !           419:                    if (FD_ISSET (tb -> tb_fd, &imask))
        !           420:                        FD_SET (tb -> tb_fd, &ifds);
        !           421:                    if (FD_ISSET (tb -> tb_fd, &emask))
        !           422:                        FD_SET (tb -> tb_fd, &efds);
        !           423:                    n++;
        !           424:                }
        !           425:            }
        !           426: 
        !           427:        if (n == 0)
        !           428:            break;
        !           429: 
        !           430:        for (tb = THead -> tb_forw; tb != THead; tb = tb2) {
        !           431:            tb2 = tb -> tb_forw;
        !           432: 
        !           433:            sd = tb -> tb_fd;
        !           434:            if ((oob = FD_ISSET (sd, &efds)) || FD_ISSET (sd, &ifds)) {
        !           435:                disc = tb -> tb_DiscIndication;
        !           436:                switch ((*tb -> tb_readPfnx) (tb, tx, td, 1, oob)) {
        !           437:                    case NOTOK:
        !           438:                        (*disc) (sd, td);
        !           439:                        break;
        !           440: 
        !           441:                    case OK: 
        !           442:                        (*tb -> tb_DataIndication) (sd, tx);
        !           443:                        break;
        !           444: 
        !           445:                    case DONE:  /* partially assembled TSDU */
        !           446:                        break;
        !           447:                }
        !           448:            }
        !           449:        }
        !           450:     }
        !           451: 
        !           452: #ifndef        SIGPOLL
        !           453:     (void) kill (TPid, SIGEMT);
        !           454: #endif
        !           455: 
        !           456: #ifndef        BSDSIGS
        !           457:     (void) sigiomask (smask);
        !           458: #endif
        !           459: }
        !           460: 
        !           461: /*  */
        !           462: 
        !           463: #ifndef        SIGPOLL
        !           464: static int  TWakeUp (tb, td)
        !           465: register struct tsapblk *tb;
        !           466: struct TSAPdisconnect *td;
        !           467: {
        !           468:     int     i,
        !           469:             nfds;
        !           470:     fd_set  mask;
        !           471:     char    buf1[10],
        !           472:             buf2[10],
        !           473:             buf3[10];
        !           474:     register struct isoservent *is;
        !           475:     static int  inited = 0;
        !           476: 
        !           477:     if (TPid > OK) {
        !           478:        (void) kill (TPid, SIGTERM);
        !           479:        TPid = NOTOK;
        !           480:     }
        !           481: 
        !           482:     nfds = 0;
        !           483:     FD_ZERO (&mask);
        !           484:     for (tb = THead -> tb_forw; tb != THead; tb = tb -> tb_forw)
        !           485:        if (tb -> tb_fd != NOTOK && (tb -> tb_flags & TB_ASYN))
        !           486:            selmask (tb -> tb_fd, mask, nfds);
        !           487: 
        !           488:     if (nfds == 0)
        !           489:        return OK;
        !           490: 
        !           491:     if (nfds > sizeof (int) * 8)
        !           492:        return tsaplose (td, DR_CONGEST, NULLCP, "you lose");
        !           493:     if (!inited) {
        !           494: #ifndef        BSDSIGS
        !           495:        int    smask = sigsetmask (sigblock (0) & ~sigmask (SIGEMT));
        !           496: #endif
        !           497: 
        !           498:        (void) signal (SIGEMT, DATAser);
        !           499: #ifndef        BSDSIGS
        !           500:        (void) sigiomask (smask);
        !           501: #endif
        !           502:        inited++;
        !           503:     }
        !           504: 
        !           505:     if ((is = getisoserventbyname ("isore", "tsap")) == NULL)
        !           506:        return tsaplose (td, DR_CONGEST, NULLCP,
        !           507:                         "ISO service tsap/isore not found");
        !           508: 
        !           509:     (void) sprintf (buf1, "%d", nfds);
        !           510:     *is -> is_tail++ = buf1;
        !           511:     (void) sprintf (buf2, "0x%x", mask.fds_bits[0]);
        !           512:     *is -> is_tail++ = buf2;
        !           513:     (void) sprintf (buf3, "%d", getpid ());
        !           514:     *is -> is_tail++ = buf3;
        !           515:     *is -> is_tail = NULL;
        !           516: 
        !           517:     for (i = 0; i < 5; i++)
        !           518:        switch (TPid = vfork ()) {
        !           519:            case NOTOK: 
        !           520:                continue;
        !           521: 
        !           522:            case OK: 
        !           523:                (void) signal (SIGEMT, SIG_DFL);
        !           524:                (void) execv (*is -> is_vec, is -> is_vec);
        !           525:                _exit (1);
        !           526: 
        !           527:            default:
        !           528:                return OK;
        !           529:        }
        !           530: 
        !           531:     return tsaplose (td, DR_CONGEST, "isore", "unable to fork");
        !           532: }
        !           533: #else
        !           534: #ifdef BSDSIGS
        !           535: #include <fcntl.h>
        !           536: #include <sys/ioctl.h>
        !           537: #else
        !           538: #include <sys/stropts.h>
        !           539: #endif
        !           540: 
        !           541: 
        !           542: static int  TWakeUp (tb, td)
        !           543: register struct tsapblk *tb;
        !           544: struct TSAPdisconnect *td;
        !           545: {
        !           546:     int            result;
        !           547: #ifndef        notdef
        !           548:     int            pgrp;
        !           549: #endif
        !           550:     static int  inited = 0;
        !           551: 
        !           552:     if (tb -> tb_flags & TB_ASYN) {
        !           553:        if (!inited) {
        !           554:            (void) signal (SIGPOLL, DATAser);
        !           555: 
        !           556:            inited++;
        !           557:        }
        !           558: 
        !           559: #ifdef BSDSIGS
        !           560: #ifdef notdef
        !           561:        if (fcntl (tb -> tb_fd, F_SETOWN, getpid ()) == NOTOK)
        !           562:            return tsaplose (td, DR_CONGEST, "failed", "fcntl F_SETOWN");
        !           563: #else
        !           564:        pgrp = -getpid ();
        !           565:        if (ioctl (tb -> tb_fd, SIOCSPGRP, (char *) &pgrp) == NOTOK)
        !           566:            return tsaplose (td, DR_CONGEST, "failed", "ioctl SIOCSPGRP %d",
        !           567:                             pgrp);
        !           568: #endif
        !           569:        if ((result = fcntl (tb -> tb_fd, F_GETFL, 0x00)) == NOTOK)
        !           570:            return tsaplose (td, DR_CONGEST, "failed", "fcntl F_GETFL");
        !           571:        result |= FASYNC;
        !           572:        if (fcntl (tb -> tb_fd, F_SETFL, result) == NOTOK)
        !           573:            return tsaplose (td, DR_CONGEST, "failed", "fcntl F_SETFL 0x%x",
        !           574:                             result);
        !           575: #else
        !           576: #ifdef notdef
        !           577:        if (ioctl (tb -> tb_fd, I_GETSIG, &result) == NOTOK)
        !           578:            result = 0;
        !           579:        result |= S_INPUT;
        !           580:        if (ioctl (tb -> tb_fd, I_SETSIG, result) == NOTOK)
        !           581:            return tsaplose (td, DR_CONGEST, "failed", "ioctl I_SETSIG 0x%x",
        !           582:                             result);
        !           583: #else
        !           584:        return tsaplose (td, DR_CONGEST, NULLCP,
        !           585:                     "asynchronous operations not yet supported under SVR3");
        !           586: #endif
        !           587: #endif
        !           588:     }
        !           589:     else {
        !           590: #ifdef BSDSIGS
        !           591:        if ((result = fcntl (tb -> tb_fd, F_GETFL, 0x00)) == NOTOK)
        !           592:            return tsaplose (td, DR_CONGEST, "failed", "fcntl F_GETFL");
        !           593:        result &= ~FASYNC;
        !           594:        if (fcntl (tb -> tb_fd, F_SETFL, result) == NOTOK)
        !           595:            return tsaplose (td, DR_CONGEST, "failed", "fcntl F_SETFL 0x%x",
        !           596:                             result);
        !           597: #else
        !           598:        if (ioctl (tb -> tb_fd, I_GETSIG, &result) == NOTOK)
        !           599:            return tsaplose (td, DR_CONGEST, "failed", "ioctl I_GETSIG");
        !           600:        result &= ~S_INPUT;
        !           601:        if (ioctl (tb -> tb_fd, I_SETSIG, result) == NOTOK)
        !           602:            return tsaplose (td, DR_CONGEST, "failed", "ioctl I_SETSIG 0x%x",
        !           603:                             result);
        !           604: #endif
        !           605:     }
        !           606: 
        !           607:     return OK;
        !           608: }
        !           609: #endif
        !           610: 
        !           611: /*    INTERNAL */
        !           612: 
        !           613: struct tsapblk   *newtblk () {
        !           614:     register struct tsapblk *tb;
        !           615: 
        !           616:     tb = (struct tsapblk   *) calloc (1, sizeof *tb);
        !           617:     if (tb == NULL)
        !           618:        return NULL;
        !           619: 
        !           620:     tb -> tb_fd = NOTOK;
        !           621: 
        !           622:     tb -> tb_qbuf.qb_forw = tb -> tb_qbuf.qb_back = &tb -> tb_qbuf;
        !           623:     tb -> tb_qwrites.qb_forw = tb -> tb_qwrites.qb_back = &tb -> tb_qwrites;
        !           624: 
        !           625:     if (once_only == 0) {
        !           626:        THead -> tb_forw = THead -> tb_back = THead;
        !           627:        once_only++;
        !           628:     }
        !           629: 
        !           630:     insque (tb, THead -> tb_back);
        !           631: 
        !           632:     return tb;
        !           633: }
        !           634: 
        !           635: 
        !           636: freetblk (tb)
        !           637: register struct tsapblk *tb;
        !           638: {
        !           639:     SBV     smask;
        !           640: #ifndef        SIGPOLL
        !           641:     struct TSAPdisconnect   tds;
        !           642: #endif
        !           643: 
        !           644:     if (tb == NULL)
        !           645:        return;
        !           646: 
        !           647:     smask = sigioblock ();
        !           648: 
        !           649:     if (tb -> tb_fd != NOTOK) {
        !           650:        (void) (*tb -> tb_closefnx) (tb -> tb_fd);
        !           651: #ifdef  MGMT
        !           652:        if (tb -> tb_manfnx)
        !           653:            (*tb -> tb_manfnx) (DISCREQ, tb);
        !           654: #endif
        !           655:     }
        !           656: 
        !           657:     if (tb -> tb_retry)
        !           658:        freetpkt (tb -> tb_retry);
        !           659: 
        !           660:     if (tb -> tb_calling)
        !           661:        free ((char *) tb -> tb_calling);
        !           662:     if (tb -> tb_called)
        !           663:        free ((char *) tb -> tb_called);
        !           664:     if (tb -> tb_data)
        !           665:        free (tb -> tb_data);
        !           666: 
        !           667: #ifndef        SIGPOLL
        !           668:     if ((tb -> tb_flags & TB_ASYN) && TPid > OK) {
        !           669:        (void) kill (TPid, SIGTERM);
        !           670:        TPid = NOTOK;
        !           671:     }
        !           672: #endif
        !           673: 
        !           674:     QBFREE (&tb -> tb_qbuf);
        !           675: 
        !           676:     if (tb -> tb_queuePfnx)
        !           677:        (*tb -> tb_queuePfnx) (tb, 0, (struct TSAPdisconnect *) 0);
        !           678:     QBFREE (&tb -> tb_qwrites);
        !           679: 
        !           680:     remque (tb);
        !           681: 
        !           682:     free ((char *) tb);
        !           683: 
        !           684: #ifndef        SIGPOLL
        !           685:     for (tb = THead -> tb_forw; tb != THead; tb = tb -> tb_forw)
        !           686:        if (tb -> tb_fd != NOTOK && (tb -> tb_flags & TB_ASYN)) {
        !           687:            (void) TWakeUp (tb, &tds);
        !           688:            break;
        !           689:        }
        !           690: #endif
        !           691: 
        !           692:     (void) sigiomask (smask);
        !           693: }
        !           694: 
        !           695: /*  */
        !           696: 
        !           697: struct tsapblk   *findtblk (sd)
        !           698: register int sd;
        !           699: {
        !           700:     register struct tsapblk *tb;
        !           701: 
        !           702:     if (once_only == 0)
        !           703:        return NULL;
        !           704: 
        !           705:     for (tb = THead -> tb_forw; tb != THead; tb = tb -> tb_forw)
        !           706:        if (tb -> tb_fd == sd)
        !           707:            return tb;
        !           708: 
        !           709:     return NULL;
        !           710: }
        !           711: 
        !           712: /*  */
        !           713: 
        !           714: int    copyTSAPaddrX (in, out)
        !           715: struct tsapADDR *in;
        !           716: struct TSAPaddr *out;
        !           717: {
        !           718:     bzero ((char *) out, sizeof *out);
        !           719: 
        !           720:     bcopy (in -> ta_selector, out -> ta_selector,
        !           721:           out -> ta_selectlen = in -> ta_selectlen);
        !           722: 
        !           723:     if (in -> ta_present) {
        !           724:        out -> ta_addrs[0] = in -> ta_addr;             /* struct copy */
        !           725:        out -> ta_naddr = 1;
        !           726:     }
        !           727: }
        !           728: 
        !           729: 
        !           730: int    copyTSAPaddrY (in, out)
        !           731: struct TSAPaddr *in;
        !           732: struct tsapADDR *out;
        !           733: {
        !           734:     bzero ((char *) out, sizeof *out);
        !           735: 
        !           736:     bcopy (in -> ta_selector, out -> ta_selector,
        !           737:           out -> ta_selectlen = in -> ta_selectlen);
        !           738: 
        !           739:     if (out -> ta_present = (in -> ta_naddr >= 1) ? 1 : 0)
        !           740:        out -> ta_addr = in -> ta_addrs[0];             /* struct copy */
        !           741: }

unix.superglobalmegacorp.com

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