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); }
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; }
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; }
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; }