Exemple #1
0
int
nbdgramsend(NbDgramSendParameters *p, uint8_t *data, int32_t datalen)
{
	NbDgram s;
	uint8_t dstip[IPaddrlen];
	s.type = p->type;
	switch (p->type) {
	case NbDgramBroadcast:
	case NbDgramDirectGroup:
		ipmove(dstip, nbglobals.bcastaddr);
		break;
	case NbDgramDirectUnique:
		if (!nbnameresolve(p->to, dstip)) {
			werrstr("nbdgramsend: name resolution failed");
			return 0;
		}
		break;
	default:
		werrstr("nbdgramsend: illegal datagram type");
		return 0;
	}
	s.flags = NbDgramFirst;
	s.id = nextdgramid();
	ipmove(s.srcip, nbglobals.myipaddr);
	s.srcport = NbDgramPort;
	s.datagram.offset = 0;
	s.datagram.data = data;
	s.datagram.length = datalen;
	nbnamecpy(s.datagram.dstname, p->to);
	nbnamecpy(s.datagram.srcname, nbglobals.myname);
	return nbdgramsendto(dstip, NbDgramPort, &s);
}
Exemple #2
0
int
nbsslisten(NbName to, NbName from,int (*accept)(void *magic, NbSession *s, NBSSWRITEFN **writep), void *magic)
{
	Listen *l;
	qlock(&tcp);
	if (tcp.thread < 0) {
		fmtinstall('B', nbnamefmt);
		tcp.acfd = announce("tcp!*!netbios", tcp.adir);
		if (tcp.acfd < 0) {
			print("nbsslisten: can't announce: %r\n");
			qunlock(&tcp);
			return -1;
		}
		tcp.thread = proccreate(tcplistener, nil, 16384);
	}
	qunlock(&tcp);
	l = nbemalloc(sizeof(Listen));
	nbnamecpy(l->to, to);
	nbnamecpy(l->from, from);
	l->accept = accept;
	l->magic = magic;
	qlock(&listens);
	l->next = listens.head;
	listens.head = l;
	qunlock(&listens);
	return 0;
}
Exemple #3
0
int
nbnameresolve(NbName nbname, uchar *ipaddr)
{
	ulong r, ttl;
	char name[NETPATHLEN];
	NbName copy;
	Ndbtuple *t;

	/* for now, just use dns */
	if (nbremotenametablefind(nbname, ipaddr)) {
//print("%B found in cache\n", nbname);
		return 1;
	}
	if (nbnsfindname(nil, nbname, ipaddr, &ttl) == 0) {
		nbremotenametableadd(nbname, ipaddr, ttl);
		return 1;
	}
	nbnamecpy(copy, nbname);
	copy[NbNameLen - 1] = 0;
	nbmkstringfromname(name, sizeof(name), copy);
	t = dnsquery("/net", name, "ip");
	if (t == nil)
		return 0;
	r = parseip(ipaddr, t->line->val);
	ndbfree(t);
	return r != -1;
}
Exemple #4
0
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;
}