if (nbytes < 0) {  return 0; }
rxi_ReadPacket(int socket, struct rx_packet *p,	       u_long *host, u_short *port){    struct sockaddr_in from;    int nbytes;    long rlen;    long tlen;    long _tlen;    struct msghdr msg;    u_int32_t dummy;			       /* was using rlen but had aliasing				        * problems */    rx_computelen(p, tlen);    rx_SetDataSize(p, tlen);	       /* this is the size of the user data				        * area */    tlen += RX_HEADER_SIZE;	       /* now this is the size of the entire				        * packet */    rlen = rx_maxReceiveSize;	       /* this is what I am advertising.				        * Only check it once in order to				        * avoid races.  */    _tlen = rlen - tlen;    if (_tlen > 0) {	_tlen = rxi_AllocDataBuf(p, _tlen);	if (_tlen >0) {	    _tlen = rlen - _tlen;	}	else _tlen = rlen;    }    else _tlen = rlen;    tlen=(tlen>_tlen)?tlen:_tlen;    /*     * set up this one iovec for padding, it's just to make sure that the     * read doesn't return more data than we expect, and is done to get     * around our problems caused by the lack of a length field in the rx     * header.     */    p->wirevec[p->niovecs].iov_base = (caddr_t) & dummy;    p->wirevec[p->niovecs++].iov_len = 4;    memset(&msg, 0, sizeof(msg));    msg.msg_name = (char *) &from;    msg.msg_namelen = sizeof(struct sockaddr_in);    msg.msg_iov = p->wirevec;    msg.msg_iovlen = p->niovecs;#if 0    msg.msg_accrights = NULL;    msg.msg_accrightslen = 0;#endif    nbytes = recvmsg(socket, &msg, 0);    /* restore the vec to its correct state */    p->wirevec[--p->niovecs].iov_base = NULL;    p->wirevec[p->niovecs].iov_len = 0;    p->length = (nbytes - RX_HEADER_SIZE);    if ((nbytes > tlen) || (nbytes < (int)RX_HEADER_SIZE)) { /* Bogus packet */	if (nbytes > 0)	    rxi_MoreCbufs(rx_Window);	if (nbytes > tlen)	    rxi_AllocDataBuf(p, nbytes - tlen);	else if (nbytes < 0 && errno == EWOULDBLOCK)	    rx_stats.noPacketOnRead++;	else {	    rx_stats.bogusPacketOnRead++;	    rx_stats.bogusHost = from.sin_addr.s_addr;	    dpf(("B: bogus packet from [%x,%d] nb=%d", from.sin_addr.s_addr,		 from.sin_port, nbytes));	}	return 0;    } else {	/* Extract packet header. */	rxi_DecodePacketHeader(p);	*host = from.sin_addr.s_addr;	*port = from.sin_port; 	if (p->header.type > 0 && p->header.type < RX_N_PACKET_TYPES)	    rx_stats.packetsRead[p->header.type - 1]++;	return 1;    }}