Annotation of 43BSDReno/contrib/isode-beta/compat/dgram.c, revision 1.1.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.