Annotation of 43BSDReno/contrib/isode-beta/compat/dgram.c, revision 1.1

1.1     ! root        1: /* dgram.c - datagram (CL-mode TS) abstractions */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/compat/RCS/dgram.c,v 7.7 90/07/09 14:31:43 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/compat/RCS/dgram.c,v 7.7 90/07/09 14:31:43 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       dgram.c,v $
        !            12:  * Revision 7.7  90/07/09  14:31:43  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.6  90/04/23  00:08:08  mrose
        !            16:  * touch-up
        !            17:  * 
        !            18:  * Revision 7.5  90/01/11  18:35:03  mrose
        !            19:  * real-sync
        !            20:  * 
        !            21:  * Revision 7.4  89/12/19  17:57:34  mrose
        !            22:  * touch-up
        !            23:  * 
        !            24:  * Revision 7.3  89/12/19  15:15:31  mrose
        !            25:  * dgram
        !            26:  * 
        !            27:  * Revision 7.2  89/12/17  18:30:11  mrose
        !            28:  * foo
        !            29:  * 
        !            30:  * Revision 7.1  89/12/11  16:22:25  mrose
        !            31:  * more dgram
        !            32:  * 
        !            33:  * Revision 7.0  89/12/01  10:42:35  mrose
        !            34:  * Release 6.0
        !            35:  * 
        !            36:  */
        !            37: 
        !            38: /*
        !            39:  *                               NOTICE
        !            40:  *
        !            41:  *    Acquisition, use, and distribution of this module and related
        !            42:  *    materials are subject to the restrictions of a license agreement.
        !            43:  *    Consult the Preface in the User's Manual for the full terms of
        !            44:  *    this agreement.
        !            45:  *
        !            46:  */
        !            47: 
        !            48: 
        !            49: /* LINTLIBRARY */
        !            50: 
        !            51: #include <errno.h>
        !            52: #include <stdio.h>
        !            53: #include "general.h"
        !            54: #include "manifest.h"
        !            55: #include "tailor.h"
        !            56: 
        !            57: #include "dgram.h"
        !            58: #ifdef TCP
        !            59: #include "internet.h"
        !            60: #endif
        !            61: #ifdef TP4
        !            62: #include "tp4.h"
        !            63: #endif
        !            64: 
        !            65: 
        !            66: #if    defined(SOCKETS) && (defined(TCP) || defined(CLTS))
        !            67: #ifndef        DEBUG
        !            68: #define        action(s,f,i)
        !            69: #endif
        !            70: 
        !            71: extern int  errno;
        !            72: 
        !            73: /*  */
        !            74: 
        !            75: union sockaddr_un {            /* 'cause sizeof (struct sockaddr_iso) == 32 */
        !            76:     struct sockaddr    sa;
        !            77: 
        !            78: #ifdef TCP
        !            79:     struct sockaddr_in sin;
        !            80: #endif
        !            81: 
        !            82: #ifdef BSD_TP4
        !            83:     union sockaddr_osi sosi;
        !            84: #endif
        !            85: };
        !            86: 
        !            87: 
        !            88: struct dgramblk {
        !            89:     int            dgram_parent;
        !            90:     union sockaddr_un dgram_peer;
        !            91: #ifdef BSD44
        !            92:     u_char  dgram_addrlen;
        !            93: #endif
        !            94: 
        !            95:     struct qbuf dgram_queue;
        !            96: };
        !            97: 
        !            98: 
        !            99: static int     maxpeers = 0;
        !           100: static struct dgramblk *peers = NULL;
        !           101: 
        !           102: /*  */
        !           103: 
        !           104: #ifdef TCP
        !           105: 
        !           106: /* ARGSUSED */
        !           107: 
        !           108: int    start_udp_server (sock, backlog, opt1, opt2)
        !           109: struct sockaddr_in *sock;
        !           110: int    backlog,
        !           111:        opt1,
        !           112:        opt2;
        !           113: {
        !           114:     register int    port;
        !           115:     int     sd;
        !           116: #ifdef BSD43
        !           117:     int            onoff;
        !           118: #endif
        !           119:     register struct dgramblk *up,
        !           120:                            *vp;
        !           121: 
        !           122:     if (peers == NULL) {
        !           123:        maxpeers = getdtablesize ();
        !           124:        peers = (struct dgramblk *) calloc ((unsigned)maxpeers, sizeof *peers);
        !           125:        if (peers == NULL)
        !           126:            return NOTOK;
        !           127: 
        !           128:        for (vp = (up = peers) + maxpeers; up < vp; up++) {
        !           129:            up -> dgram_parent = NOTOK;
        !           130:            up -> dgram_queue.qb_forw = up -> dgram_queue.qb_back =
        !           131:                &up -> dgram_queue;
        !           132:        }
        !           133:     }
        !           134: 
        !           135:     if ((sd = socket (AF_INET, SOCK_DGRAM, 0)) == NOTOK)
        !           136:        return NOTOK;
        !           137: 
        !           138:     if (sock -> sin_port != 0) {
        !           139:        action ("BIND", sd, (struct sockaddr *) sock);
        !           140: 
        !           141:        if (bind (sd, (struct sockaddr *) sock, sizeof *sock) != NOTOK)
        !           142:            goto got_socket;
        !           143: 
        !           144:        (void) close (sd);
        !           145:        return NOTOK;
        !           146:     }
        !           147:     else
        !           148:        sock -> sin_family = AF_INET;
        !           149: 
        !           150:     for (port = IPPORT_RESERVED;; port++) {
        !           151:        sock -> sin_port = htons ((u_short) port);
        !           152: 
        !           153:        action ("BIND", sd, (struct sockaddr *) sock);
        !           154: 
        !           155:        if (bind (sd, (struct sockaddr *) sock, sizeof *sock) != NOTOK)
        !           156:            break;
        !           157: 
        !           158:        switch (errno) {
        !           159:            case EADDRINUSE: 
        !           160:                continue;
        !           161: 
        !           162:            case EADDRNOTAVAIL: 
        !           163:            default: 
        !           164:                (void) close (sd);
        !           165:                return NOTOK;
        !           166:        }
        !           167:     }
        !           168: 
        !           169: got_socket: ;
        !           170: #ifdef DEBUG
        !           171:     {
        !           172:        int     len = sizeof *sock;
        !           173: 
        !           174:        action ("FOO1", sd, (struct sockaddr *) sock);
        !           175:        if (getsockname (sd, (struct sockaddr *) sock, &len) != NOTOK)
        !           176:            action ("FOO2", sd, (struct sockaddr *) sock);
        !           177:     }
        !           178: #endif
        !           179: 
        !           180: #ifndef        BSD43
        !           181:     if (opt1)
        !           182:        (void) setsockopt (sd, SOL_SOCKET, opt1, NULLCP, 0);
        !           183:     if (opt2)
        !           184:        (void) setsockopt (sd, SOL_SOCKET, opt2, NULLCP, 0);
        !           185: #else
        !           186:     onoff = 1;
        !           187:     if (opt1)
        !           188:        (void) setsockopt (sd, SOL_SOCKET, opt1, (char *)&onoff, sizeof onoff);
        !           189:     if (opt2)
        !           190:        (void) setsockopt (sd, SOL_SOCKET, opt2, (char *)&onoff, sizeof onoff);
        !           191: #endif
        !           192: 
        !           193:     return (peers[sd].dgram_parent = sd);
        !           194: }
        !           195: #endif
        !           196: 
        !           197: /*  */
        !           198: 
        !           199: #ifdef BSD_TP4
        !           200: 
        !           201: /* ARGSUSED */
        !           202: 
        !           203: int    start_clts_server (sock, backlog, opt1, opt2)
        !           204: union sockaddr_osi *sock;
        !           205: int    backlog,
        !           206:        opt1,
        !           207:        opt2;
        !           208: {
        !           209:     int     sd;
        !           210: #ifdef BSD43
        !           211:     int            onoff;
        !           212: #endif
        !           213:     u_char *cp;
        !           214:     register struct dgramblk *up,
        !           215:                            *vp;
        !           216:     struct sockaddr_iso *ifaddr = &sock -> osi_sockaddr;
        !           217: 
        !           218:     if (peers == NULL) {
        !           219:        maxpeers = getdtablesize ();
        !           220:        peers = (struct dgramblk *) calloc ((unsigned)maxpeers, sizeof *peers);
        !           221:        if (peers == NULL)
        !           222:            return NOTOK;
        !           223: 
        !           224:        for (vp = (up = peers) + maxpeers; up < vp; up++) {
        !           225:            up -> dgram_parent = NOTOK;
        !           226:            up -> dgram_queue.qb_forw = up -> dgram_queue.qb_back =
        !           227:                &up -> dgram_queue;
        !           228:        }
        !           229:     }
        !           230: 
        !           231:     if ((sd = socket (AF_ISO, SOCK_DGRAM, 0)) == NOTOK)
        !           232:        return NOTOK;
        !           233: 
        !           234:     if (ifaddr -> siso_tlen != 0) {
        !           235:        action ("BIND", sd, (struct sockaddr *) ifaddr);
        !           236: 
        !           237:        if (bind (sd, (struct sockaddr *) ifaddr, (int) ifaddr -> siso_len)
        !           238:                != NOTOK)
        !           239:            goto got_socket;
        !           240: 
        !           241:        (void) close (sd);
        !           242:        return NOTOK;
        !           243:     }
        !           244:     else
        !           245:        ifaddr -> siso_family = AF_ISO;
        !           246: 
        !           247:     {
        !           248:        int     pid;
        !           249:        u_char *dp,
        !           250:               *ep,
        !           251:               *fp;
        !           252: 
        !           253:        pid = getpid ();
        !           254:        cp = fp = (u_char *) ifaddr -> siso_data + ifaddr -> siso_nlen;
        !           255:        for (ep = (dp = (u_char *) &pid) + sizeof pid; dp < ep; dp++)
        !           256:            *cp++ = *dp;
        !           257:        ifaddr -> siso_tlen = (cp - fp) + 1;
        !           258:        ifaddr -> siso_slen = ifaddr -> siso_plen = 0;
        !           259:        ifaddr -> siso_len = sizeof *ifaddr;
        !           260:     }
        !           261: 
        !           262:     for (*cp = 0x00; *cp < 0xff; *cp += 1) {
        !           263:        action ("BIND", sd, (struct sockaddr *) ifaddr);
        !           264: 
        !           265:        if (bind (sd, (struct sockaddr *) ifaddr, (int) ifaddr -> siso_len)
        !           266:                != NOTOK)
        !           267:            goto got_socket;
        !           268: 
        !           269:        switch (errno) {
        !           270:            case EADDRINUSE:
        !           271:                continue;
        !           272: 
        !           273:            case EADDRNOTAVAIL:
        !           274:            default:
        !           275:                (void) close (sd);
        !           276:                return NOTOK;
        !           277:        }
        !           278:     }
        !           279:     (void) close (sd);
        !           280:     errno = EADDRNOTAVAIL;
        !           281:     return NOTOK;
        !           282: 
        !           283: got_socket: ;
        !           284: #ifdef DEBUG
        !           285:     {
        !           286:        int     len = sizeof *sock;
        !           287: 
        !           288:        action ("FOO1", sd, ifaddr);
        !           289:        if (getsockname (sd, (struct sockaddr *) ifaddr, &len) != NOTOK)
        !           290:            action ("FOO2", sd, ifaddr);
        !           291:     }
        !           292: #endif
        !           293: 
        !           294: #ifndef        BSD43
        !           295:     if (opt1)
        !           296:        (void) setsockopt (sd, SOL_SOCKET, opt1, NULLCP, 0);
        !           297:     if (opt2)
        !           298:        (void) setsockopt (sd, SOL_SOCKET, opt2, NULLCP, 0);
        !           299: #else
        !           300:     onoff = 1;
        !           301:     if (opt1)
        !           302:        (void) setsockopt (sd, SOL_SOCKET, opt1, (char *)&onoff, sizeof onoff);
        !           303:     if (opt2)
        !           304:        (void) setsockopt (sd, SOL_SOCKET, opt2, (char *)&onoff, sizeof onoff);
        !           305: #endif
        !           306: 
        !           307:     return (peers[sd].dgram_parent = sd);
        !           308: }
        !           309: #endif
        !           310: 
        !           311: /*  */
        !           312: 
        !           313: int    join_dgram_aux (fd, sock, newfd)
        !           314: int    fd,
        !           315:        newfd;
        !           316: struct sockaddr *sock;
        !           317: {
        !           318:     int            nfds,
        !           319:            sd;
        !           320:     fd_set  ifds;
        !           321:     register struct qbuf *qb;
        !           322:     register struct dgramblk *up;
        !           323: 
        !           324:     if (fd < 0 || fd >= maxpeers || peers[fd].dgram_parent != fd) {
        !           325:        errno = EINVAL;
        !           326:        return NOTOK;
        !           327:     }
        !           328: 
        !           329:     if (newfd) {
        !           330:        FD_ZERO (&ifds);
        !           331: 
        !           332:        nfds = fd + 1;
        !           333:        FD_SET (fd, &ifds);
        !           334:        if (select_dgram_socket (nfds, &ifds, NULLFD, NULLFD, OK) == NOTOK)
        !           335:            return NOTOK;
        !           336: 
        !           337:        up = &peers[fd];
        !           338:        if ((qb = up -> dgram_queue.qb_forw) == &up -> dgram_queue) {
        !           339:            errno = EWOULDBLOCK;
        !           340:            return NOTOK;
        !           341:        }
        !           342: 
        !           343:        if ((sd = dup (fd)) == NOTOK)
        !           344:            return NOTOK;
        !           345: 
        !           346:        up = &peers[sd];
        !           347: #ifdef BSD44
        !           348:        bcopy (qb -> qb_base, (caddr_t) sock,
        !           349:               ((struct sockaddr *) qb -> qb_base) -> sa_len);
        !           350: #else
        !           351:        *sock = *((struct sockaddr *) qb -> qb_base);   /* struct copy */
        !           352: #endif
        !           353: 
        !           354:        remque (qb);
        !           355:        insque (qb, up -> dgram_queue.qb_back);
        !           356:     }
        !           357:     else
        !           358:        up = &peers[fd];
        !           359: 
        !           360:     up -> dgram_parent = fd;
        !           361: #ifdef BSD44
        !           362:     if (sock -> sa_len == 0)
        !           363:        sock -> sa_len = sizeof *sock;
        !           364:     bcopy ((caddr_t) sock, (caddr_t) &up -> dgram_peer, sock -> sa_len);
        !           365:     {
        !           366:        struct sockaddr_in *sin;
        !           367: 
        !           368:        up -> dgram_addrlen = sock -> sa_family != AF_INET ? sock -> sa_len
        !           369:                                : sizeof *sin - sizeof sin -> sin_zero;
        !           370:     }
        !           371: #else
        !           372:     up -> dgram_peer.sa = *sock;       /* struct copy */
        !           373: #endif
        !           374: 
        !           375:     action ("JOIN", newfd ? sd : fd, sock);
        !           376: 
        !           377:     return (newfd ? sd : OK);
        !           378: }
        !           379: 
        !           380: /*  */
        !           381: 
        !           382: int    read_dgram_socket (fd, q)
        !           383: int    fd;
        !           384: struct qbuf **q;
        !           385: {
        !           386:     int            nfds;
        !           387:     fd_set  ifds,
        !           388:            mask;
        !           389:     register struct qbuf *qb;
        !           390:     register struct dgramblk *up;
        !           391: 
        !           392:     if (fd < 0
        !           393:            || fd >= maxpeers
        !           394:            || (up = &peers[fd]) -> dgram_parent == NOTOK) {
        !           395:        errno = EINVAL;
        !           396:        return NOTOK;
        !           397:     }
        !           398: 
        !           399:     if ((qb = up -> dgram_queue.qb_forw) == &up -> dgram_queue) {
        !           400:        FD_ZERO (&mask);
        !           401: 
        !           402:        nfds = fd + 1;
        !           403:        FD_SET (fd, &mask);
        !           404:        for (ifds = mask;; ifds = mask) {
        !           405:            if (select_dgram_socket (nfds, &ifds, NULLFD, NULLFD, NOTOK)
        !           406:                    == NOTOK)
        !           407:                return NOTOK;
        !           408: 
        !           409:            if ((qb = up -> dgram_queue.qb_forw) != &up -> dgram_queue)
        !           410:                break;
        !           411:        }
        !           412:     }
        !           413: 
        !           414:     remque (qb);
        !           415:     qb -> qb_forw = qb -> qb_back = qb;
        !           416: 
        !           417:     *q = qb;
        !           418: 
        !           419:     return qb -> qb_len;
        !           420: }
        !           421: 
        !           422: /*  */
        !           423: 
        !           424: int    hack_dgram_socket (fd, sock)
        !           425: int    fd;
        !           426: struct  sockaddr *sock;
        !           427: {
        !           428:     register struct dgramblk *up;
        !           429: 
        !           430:     if (fd < 0
        !           431:            || fd >= maxpeers
        !           432:            || (up = &peers[fd]) -> dgram_parent != fd) {
        !           433:        errno = EINVAL;
        !           434:        return NOTOK;
        !           435:     }
        !           436: 
        !           437:     if (sock == NULL) {
        !           438:        bzero ((caddr_t) &up -> dgram_peer, sizeof up -> dgram_peer);
        !           439:        return OK;
        !           440:     }
        !           441: 
        !           442: #ifdef BSD44
        !           443:     if (sock -> sa_len == 0)
        !           444:        sock -> sa_len = sizeof *sock;
        !           445:     bcopy ((caddr_t) sock, (caddr_t) &up -> dgram_peer, sock -> sa_len);
        !           446:     up -> dgram_addrlen = 0;
        !           447: #else
        !           448:     up -> dgram_peer.sa = *sock;       /* struct copy */
        !           449: #endif
        !           450: 
        !           451:     action ("HACK", fd, sock);
        !           452: 
        !           453:     return OK;
        !           454: }
        !           455: 
        !           456: 
        !           457: int    write_dgram_socket (fd, qb)
        !           458: int    fd;
        !           459: register struct qbuf *qb;
        !           460: {
        !           461:     register struct dgramblk *up;
        !           462: 
        !           463:     if (fd < 0
        !           464:            || fd >= maxpeers
        !           465:            || (up = &peers[fd]) -> dgram_parent == NOTOK
        !           466:            || up -> dgram_peer.sa.sa_family == 0) {
        !           467:        errno = EINVAL;
        !           468:        return NOTOK;
        !           469:     }
        !           470: 
        !           471:     action ("SENDTO", fd, &up -> dgram_peer.sa);
        !           472: 
        !           473: #ifdef BSD44
        !           474:     return sendto (fd, qb -> qb_data, qb -> qb_len, NULL,
        !           475:                   &up -> dgram_peer.sa, (int) up -> dgram_peer.sa.sa_len);
        !           476: #else
        !           477:     return sendto (fd, qb -> qb_data, qb -> qb_len, NULL,
        !           478:                   &up -> dgram_peer.sa, sizeof up -> dgram_peer.sa);
        !           479: #endif
        !           480: }
        !           481: 
        !           482: 
        !           483: /*  */
        !           484: 
        !           485: int    close_dgram_socket (fd)
        !           486: int    fd;
        !           487: {
        !           488:     register struct dgramblk *up,
        !           489:                            *vp;
        !           490: 
        !           491:     if (fd < 0
        !           492:            || fd >= maxpeers
        !           493:            || (up = &peers[fd]) -> dgram_parent == NOTOK) {
        !           494:        errno = EINVAL;
        !           495:        return NOTOK;
        !           496:     }
        !           497: 
        !           498:     action ("CLOSE", fd, &up -> dgram_peer.sa);
        !           499: 
        !           500:     up -> dgram_parent = NOTOK;
        !           501:     bzero ((char *) &up -> dgram_peer, sizeof up -> dgram_peer);
        !           502:     QBFREE (&up -> dgram_queue);
        !           503:     
        !           504:     for (vp = (up = peers) + maxpeers; up < vp; up++)
        !           505:        if (up -> dgram_parent == fd)
        !           506:            up -> dgram_parent = up - peers;
        !           507: 
        !           508:     return close (fd);
        !           509: }
        !           510: 
        !           511: /*  */
        !           512: 
        !           513: int    select_dgram_socket (nfds, rfds, wfds, efds, secs)
        !           514: int    nfds;
        !           515: fd_set *rfds,
        !           516:        *wfds,
        !           517:        *efds;
        !           518: int    secs;
        !           519: {
        !           520:     register int    fd;
        !           521:     int            cc,
        !           522:            mfds,
        !           523:            result;
        !           524:     fd_set  ifds,
        !           525:            jfds;
        !           526:     register struct qbuf *qb;
        !           527:     register struct dgramblk *up,
        !           528:                            *vp;
        !           529:     struct dgramblk *wp;
        !           530:     union sockaddr_un *sock;
        !           531: 
        !           532:     if (rfds) {
        !           533:        jfds = *rfds;
        !           534: 
        !           535:        if (secs != OK)
        !           536:            for (vp = (up = peers) + maxpeers, fd = 0; up < vp; up++, fd++)
        !           537:                if (up -> dgram_parent != NOTOK
        !           538:                        && FD_ISSET (fd, &jfds)
        !           539:                        && up -> dgram_queue.qb_forw != &up -> dgram_queue) {
        !           540:                    secs = OK;
        !           541:                    break;
        !           542:                }
        !           543:     }
        !           544: 
        !           545:     if ((result = selsocket (nfds, rfds, wfds, efds, secs)) == NOTOK
        !           546:            || rfds == NULLFD)
        !           547:        return result;
        !           548: 
        !           549:     ifds = *rfds;
        !           550:     if ((mfds = nfds) > maxpeers)
        !           551:        mfds = maxpeers;
        !           552:     for (fd = 0, up = peers; fd < mfds; fd++, up++)
        !           553:        if (FD_ISSET (fd, &ifds)) {
        !           554:            int     slen;
        !           555:            u_char  len;
        !           556:            char   *data;
        !           557: 
        !           558:            if (up -> dgram_parent == NOTOK)
        !           559:                continue;
        !           560: 
        !           561:            if ((qb = (struct qbuf *) malloc ((unsigned) (sizeof *qb
        !           562:                                                          + (slen
        !           563:                                                                = sizeof *sock)
        !           564:                                                          + MAXDGRAM)))
        !           565:                    == NULL)
        !           566:                return NOTOK;
        !           567: 
        !           568:            sock = (union sockaddr_un *) qb -> qb_base;
        !           569:            qb -> qb_data = qb -> qb_base + slen;
        !           570:            if ((cc = recvfrom (fd, qb -> qb_data, MAXDGRAM, NULL,
        !           571:                                &sock -> sa, &slen)) == NOTOK) {
        !           572:                free ((char *) qb);
        !           573:                return NOTOK;
        !           574:            }
        !           575: #ifdef BSD44
        !           576:            sock -> sa.sa_len = slen;
        !           577: #endif
        !           578:            qb -> qb_len = cc;
        !           579: 
        !           580:            action ("RECVFROM", fd, &sock -> sa);
        !           581: 
        !           582:            vp = up;
        !           583:            data = sock -> sa.sa_data;
        !           584:            switch (sock -> sa.sa_family) {
        !           585:                case AF_INET:   /* XXX: doesn't take into account padding */
        !           586:                    len = sizeof sock -> sin
        !           587:                        - sizeof sock -> sin.sin_zero;
        !           588:                    break;
        !           589: 
        !           590:                default:
        !           591: #ifdef BSD44
        !           592:                    len = sock -> sa.sa_len;
        !           593: #else
        !           594:                    len = sizeof sock -> sa;
        !           595: #endif
        !           596:                    break;
        !           597:            }
        !           598:            if (
        !           599: #ifdef BSD44
        !           600:                len != up -> dgram_addrlen ||
        !           601: #endif
        !           602:                bcmp (data, up -> dgram_peer.sa.sa_data, (int) len)
        !           603:                            != 0) {
        !           604:                for (wp = (vp = peers) + maxpeers; vp < wp; vp++)
        !           605:                    if (vp != up
        !           606:                            && vp -> dgram_parent == up -> dgram_parent
        !           607: #ifdef BSD44
        !           608:                            && len == vp -> dgram_addrlen
        !           609: #endif
        !           610:                            && bcmp (data, vp -> dgram_peer.sa.sa_data,
        !           611:                                     (int) len) == 0)
        !           612:                        break;
        !           613:                if (vp >= wp
        !           614:                        && (vp = &peers[up -> dgram_parent])
        !           615:                                            -> dgram_peer.sa.sa_family != 0) {
        !           616:                    free ((char *) qb);
        !           617:                    continue;
        !           618:                }
        !           619:            }
        !           620: 
        !           621:            insque (qb, vp -> dgram_queue.qb_back);
        !           622:        }
        !           623: 
        !           624:     for (vp = (up = peers) + maxpeers, fd = 0; up < vp; up++, fd++)
        !           625:        if (up -> dgram_parent != NOTOK && FD_ISSET (fd, &jfds))
        !           626:            if (up -> dgram_queue.qb_forw != &up -> dgram_queue)
        !           627:                FD_SET (fd, rfds);
        !           628:            else
        !           629:                FD_CLR (fd, rfds);
        !           630: 
        !           631:     result = 0;
        !           632:     ifds = *rfds;
        !           633:     if (wfds)
        !           634:        for (fd = 0; fd < nfds; fd++)
        !           635:            if (FD_ISSET (fd, wfds))
        !           636:                FD_SET (fd, &ifds);
        !           637:     if (efds)
        !           638:        for (fd = 0; fd < nfds; fd++)
        !           639:            if (FD_ISSET (fd, efds))
        !           640:                FD_SET (fd, &ifds);
        !           641:     for (fd = 0; fd < nfds; fd++)
        !           642:        if (FD_ISSET (fd, &ifds))
        !           643:            result++;
        !           644: 
        !           645:     return result;
        !           646: }
        !           647: 
        !           648: /*  */
        !           649: 
        !           650: #ifdef DEBUG
        !           651: 
        !           652: #ifdef TCP
        !           653: #include "isoaddrs.h"
        !           654: 
        !           655: 
        !           656: static inetprint (sin, bp)
        !           657: struct sockaddr_in *sin;
        !           658: char   *bp;
        !           659: {
        !           660:     (void) sprintf (bp, "Internet=%s+%d+%d", inet_ntoa (sin -> sin_addr),
        !           661:                    (int) ntohs (sin -> sin_port), NA_TSET_UDP);
        !           662: }
        !           663: #endif
        !           664: 
        !           665: /*  */
        !           666: 
        !           667: #ifdef CLTS
        !           668: /* prints OSI address using the format described in:
        !           669: 
        !           670:        "A string encoding of Presentation Address"
        !           671: 
        !           672:        S.E. Kille, Research Note RN/89/14, February 1989
        !           673:        Department of Computer Science
        !           674:        University College London
        !           675: 
        !           676:  */
        !           677: 
        !           678: #ifndef SSEL
        !           679: #define SSEL(s) ((s)->siso_tlen + TSEL(s))
        !           680: #define PSEL(s) ((s)->siso_slen + SSEL(s))
        !           681: #endif
        !           682: 
        !           683: 
        !           684: static isoprint (siso, bp)
        !           685: register struct sockaddr_iso *siso;
        !           686: char   *bp;
        !           687: {
        !           688:     int            didone = 0;
        !           689: 
        !           690:     if (siso -> siso_plen) {
        !           691:        hexprint (bp, siso -> siso_plen, PSEL (siso), "'", "'H");
        !           692:        bp += strlen (bp);
        !           693:        *bp++ = '/';
        !           694:        didone++;
        !           695:     }
        !           696:     if (siso -> siso_slen || didone) {
        !           697:        hexprint (bp, siso -> siso_slen, SSEL (siso), "'", "'H");
        !           698:        bp += strlen (bp);
        !           699:        *bp++ = '/';
        !           700:        didone++;
        !           701:     }
        !           702:     if (siso -> siso_tlen || didone) {
        !           703:        hexprint (bp, siso -> siso_tlen, TSEL (siso), "'", "'H");
        !           704:        bp += strlen (bp);
        !           705:        *bp++ = '/';
        !           706:        didone++;
        !           707:     }
        !           708:     hexprint (bp, siso -> siso_nlen, siso -> siso_data, "NS+", "");
        !           709: }
        !           710: 
        !           711: 
        !           712: static hexprint (bp, n, buf, start, stop)
        !           713: char   *bp;
        !           714: int    n;
        !           715: u_char *buf;
        !           716: char   *start,
        !           717:        *stop;
        !           718: {
        !           719:         register u_char *in = buf, *top = in + n;
        !           720:  
        !           721:         if (n == 0)
        !           722:            return;
        !           723: 
        !           724:        (void) strcpy (bp, start);
        !           725:        bp += strlen (bp);
        !           726: 
        !           727:         while (in < top) {
        !           728:            (void) sprintf (bp, "%02x", *in++ & 0xff);
        !           729:            bp += 2;
        !           730:        }
        !           731: 
        !           732:         (void) strcpy (bp, stop);
        !           733: }
        !           734: #endif
        !           735: 
        !           736: /*  */
        !           737: 
        !           738: static struct printent {
        !           739:     int            p_family;
        !           740:     IFP            p_function;
        !           741: } ents[] = {
        !           742: #ifdef TCP
        !           743:     AF_INET,   inetprint,
        !           744: #endif
        !           745: 
        !           746: #ifdef CLTS
        !           747:     AF_ISO,    isoprint,
        !           748: #endif
        !           749: 
        !           750:     NULL
        !           751: };
        !           752: 
        !           753: static action (s, fd, sock)
        !           754: char   *s;
        !           755: int    fd;
        !           756: struct sockaddr *sock;
        !           757: {
        !           758:     char    buffer[BUFSIZ];
        !           759:     register struct printent *p;
        !           760: 
        !           761:     if (!(compat_log -> ll_events & LLOG_TRACE))
        !           762:        return;
        !           763: 
        !           764:     for (p = ents; p -> p_family; p++)
        !           765:        if (p -> p_family == sock -> sa_family)
        !           766:            break;
        !           767:     if (!p -> p_family) {
        !           768:        DLOG (compat_log, LLOG_EXCEPTIONS,
        !           769:              ("unknown dgram address family 0x%x", sock -> sa_family));
        !           770:        return;
        !           771:     }
        !           772: 
        !           773:     (void) (*p -> p_function) (sock, buffer);
        !           774: 
        !           775:     DLOG (compat_log, LLOG_TRACE, ("%-10.10s %d %s", s, fd, buffer));
        !           776: }
        !           777: #endif
        !           778: 
        !           779: #else
        !           780: 
        !           781: /*  */
        !           782: 
        !           783: int    dgram_dummy () {}
        !           784: 
        !           785: #endif

unix.superglobalmegacorp.com

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