|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.