|
|
Xinu for VAX
/* 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) );
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.