Xinu7/src/serve11/sys/dgwrite.c

/* dgwrite.c - dgwrite */

#include <conf.h>
#include <kernel.h>
#include <network.h>

/*------------------------------------------------------------------------
 *  dgwrite  -  write one datagram to a datagram protocol pseudo-device
 *------------------------------------------------------------------------
 */
dgwrite(devptr, buff, len)
struct	devsw	*devptr;
struct	xgram	*buff;
int	len;
{
	struct	epacket	*packet;
	struct	ip	*ipptr;
	struct	udp	*udpptr;
	struct	dgblk	*dgptr;
	int	dstport;
	char	*dstIP;

	if (len < 0 || len > UMAXLEN)
		return(SYSERR);
	dgptr = (struct dgblk *) devptr->dvioblk;
	packet = (struct epacket *) getbuf(Net.netpool);
	ipptr = (struct ip *) packet->ep_data;
	udpptr = (struct udp *) ipptr->i_data;
	dstport = dgptr->dg_fport;
	dstIP = (char *) dgptr->dg_faddr;
	if ( (dgptr->dg_mode & DG_NMODE) != 0) {
		if (dstport == 0) {
			dstport = buff->xg_fport;
			dstIP = (char *) buff->xg_faddr;
		}
		blkcopy(udpptr->u_data, buff->xg_data, len);
	} else {
		if ( dstport == 0) {
			freebuf(packet);
			return(SYSERR);
		}
		blkcopy(udpptr->u_data, buff, len);
	}
	return( udpsend(dstIP, dstport,	dgptr->dg_lport, packet, len) );
}