Annotation of xinu/sys/dgread.c, revision 1.1

1.1     ! root        1: /* dgread.c - dgread */
        !             2: 
        !             3: #include <conf.h>
        !             4: #include <kernel.h>
        !             5: #include <proc.h>
        !             6: #include <network.h>
        !             7: 
        !             8: /*------------------------------------------------------------------------
        !             9:  *  dgread  -  read one datagram from a datagram protocol pseudo-device
        !            10:  *------------------------------------------------------------------------
        !            11:  */
        !            12: dgread(devptr, buff, len)
        !            13: struct devsw   *devptr;
        !            14: struct xgram   *buff;
        !            15: int    len;
        !            16: {
        !            17:        struct  dgblk   *dgptr;
        !            18:        struct  epacket *packet;
        !            19:        struct  udp     *udpptr;
        !            20:        struct  ip      *ipptr;
        !            21:        struct  netq    *nqptr;
        !            22:        int     datalen;
        !            23:        PStype  ps;
        !            24: 
        !            25:        disable(ps);
        !            26:        dgptr = (struct dgblk *)devptr->dvioblk;
        !            27:        if (dgptr->dg_mode & DG_TMODE) {
        !            28:                nqptr = &Net.netqs[dgptr->dg_netq];
        !            29:                if ( !isbadpid(nqptr->pid) ) {
        !            30:                        restore(ps);
        !            31:                        return(SYSERR);
        !            32:                }
        !            33:                if (pcount(dgptr->dg_xport) <= 0) {
        !            34:                        nqptr->pid = getpid();
        !            35:                        if (recvtim(DG_TIME) == TIMEOUT) {
        !            36:                                nqptr->pid = BADPID;
        !            37:                                restore(ps);
        !            38:                                return(TIMEOUT);
        !            39:                        }
        !            40:                }
        !            41:        }
        !            42:        packet = (struct epacket *) preceive(dgptr->dg_xport);
        !            43: 
        !            44:        /* copy data into user's buffer & set length */
        !            45: 
        !            46:        ipptr = (struct ip *) packet->ep_data;
        !            47:        udpptr = (struct udp *)ipptr->i_data;
        !            48:        datalen = net2hs(udpptr->u_udplen) - UHLEN;
        !            49:        if (dgptr->dg_mode & DG_NMODE) {
        !            50:                if ( (datalen+XGHLEN) > len) {
        !            51:                        freebuf(packet);
        !            52:                        restore(ps);
        !            53:                        return(SYSERR);
        !            54:                }
        !            55:                blkcopy(buff->xg_faddr, ipptr->i_src, IPLEN);
        !            56:                buff->xg_fport = net2hs(udpptr->u_sport);
        !            57:                buff->xg_lport = dgptr->dg_lport;
        !            58:                blkcopy(buff->xg_data, udpptr->u_data, datalen);
        !            59:        } else {
        !            60:                if (datalen > len)
        !            61:                        datalen = len;
        !            62:                blkcopy(buff, udpptr->u_data, datalen);
        !            63:        }
        !            64:        freebuf(packet);
        !            65:        restore(ps);
        !            66:        return(datalen);
        !            67: }

unix.superglobalmegacorp.com

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