示例#1
0
文件: nbdgram.c 项目: rminnich/harvey
int
nbdgramsendto(uint8_t *ipaddr, uint16_t port, NbDgram *s)
{
	Udphdr *u;
	uint8_t msg[NbDgramMaxPacket + Udphdrsize];
	int l;
	int rv;
	char *e;

	e = startlistener();
	if (e != nil)
		return 0;

	l = nbdgramconvS2M(msg + nbudphdrsize, msg + sizeof(msg), s);
	if (l == 0) {
		print("conv failed\n");
		return 0;
	}
	u = (Udphdr *)msg;
	ipmove(u->laddr, nbglobals.myipaddr);
	hnputs(u->lport, NbDgramPort);
	ipmove(u->raddr, ipaddr);
	hnputs(u->rport, port);
//nbdumpdata(msg, l + nbudphdrsize);
//print("transmitting\n");
	rv = write(udp.fd, msg, l + nbudphdrsize);
//print("rv %d l %d hdrsize %d error %r\n", rv, l, nbudphdrsize);
	return rv == l + nbudphdrsize;
}
示例#2
0
文件: nbdgram.c 项目: rminnich/harvey
char *
nbdgramlisten(NbName to, int (*deliver)(void *magic, NbDgram *s), void *magic)
{
	Listen *l;
	char *e;
	nbnametablefind(to, 1);
	e = startlistener();
	if (e)
		return e;
	l = nbemalloc(sizeof(Listen));
	nbnamecpy(l->to, to);
	l->deliver = deliver;
	l->magic = magic;
	qlock(&listens);
	l->next = listens.head;
	listens.head = l;
	qunlock(&listens);
	return 0;
}
示例#3
0
NbnsTransaction *
nbnstransactionnew(NbnsMessage *s, uchar *ipaddr)
{
	NbnsTransaction *t;
	uchar msg[Udphdrsize + 576];
	Udphdr *u;
	int len;

	startlistener();
	len = nbnsconvS2M(s, msg + nbudphdrsize, sizeof(msg) - nbudphdrsize);
	if (len == 0)
		return 0;
	t = mallocz(sizeof(*t), 1);
	if (t == nil)
		return nil;
	t->id = s->id;	
	t->c = chancreate(sizeof(NbnsMessage *), 3);
	if (t->c == nil) {
		free(t);
		return nil;
	}
	qlock(&transactionlist);
	t->next = transactionlist.head;
	transactionlist.head = t;
	qunlock(&transactionlist);
	u = (Udphdr *)msg;
	ipmove(u->laddr, nbglobals.myipaddr);
	hnputs(u->lport, NbnsPort);
	if (s->broadcast || ipaddr == nil)
		ipmove(u->raddr, nbglobals.bcastaddr);
	else
		ipmove(u->raddr, ipaddr);
	hnputs(u->rport, NbnsPort);
	write(udp.fd, msg, len + nbudphdrsize);
	return t;
}