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