Lines Matching refs:rqp

55 static void nbns_rq_done(struct nbns_rq *rqp);
56 static int nbns_rq_getrr(struct nbns_rq *rqp, struct nbns_rr *rrp);
57 static int nbns_rq_prepare(struct nbns_rq *rqp);
58 static int nbns_rq(struct nbns_rq *rqp);
65 struct nbns_rq *rqp;
73 error = nbns_rq_create(NBNS_OPCODE_QUERY, ctx, &rqp);
80 rqp->nr_nmflags = NBNS_NMFLAG_RD;
81 rqp->nr_qdname = &nn;
82 rqp->nr_qdtype = NBNS_QUESTION_TYPE_NB;
83 rqp->nr_qdclass = NBNS_QUESTION_CLASS_IN;
84 rqp->nr_qdcount = 1;
85 dest = &rqp->nr_dest;
94 rqp->nr_flags |= NBRQF_BROADCAST;
95 error = nbns_rq_prepare(rqp);
97 nbns_rq_done(rqp);
102 error = nbns_rq(rqp);
105 if ((rqp->nr_rpnmflags & NBNS_NMFLAG_AA) == 0) {
110 error = nbns_rq_getrr(rqp, &rr);
113 error = nbns_rq_getrr(rqp, &rr);
117 rqp->nr_flags &= ~NBRQF_BROADCAST;
120 if (rqp->nr_rpancount == 0) {
124 error = nbns_rq_getrr(rqp, &rr);
137 ctx->nb_lastns = rqp->nr_sender;
140 nbns_rq_done(rqp);
147 struct nbns_rq *rqp;
151 rqp = malloc(sizeof(*rqp));
152 if (rqp == NULL)
154 bzero(rqp, sizeof(*rqp));
155 error = mb_init(&rqp->nr_rq, NBDG_MAXSIZE);
157 free(rqp);
160 rqp->nr_opcode = opcode;
161 rqp->nr_nbd = ctx;
162 rqp->nr_trnid = trnid++;
163 *rqpp = rqp;
168 nbns_rq_done(struct nbns_rq *rqp)
170 if (rqp == NULL)
172 if (rqp->nr_fd >= 0)
173 close(rqp->nr_fd);
174 mb_done(&rqp->nr_rq);
175 mb_done(&rqp->nr_rp);
176 free(rqp);
184 nbns_rq_getrr(struct nbns_rq *rqp, struct nbns_rr *rrp)
186 struct mbdata *mbp = &rqp->nr_rp;
209 nbns_rq_prepare(struct nbns_rq *rqp)
211 struct nb_ctx *ctx = rqp->nr_nbd;
212 struct mbdata *mbp = &rqp->nr_rq;
217 error = mb_init(&rqp->nr_rp, NBDG_MAXSIZE);
220 if (rqp->nr_dest.sin_addr.s_addr == INADDR_BROADCAST) {
221 rqp->nr_nmflags |= NBNS_NMFLAG_BCAST;
228 rqp->nr_nmflags &= ~NBNS_NMFLAG_BCAST;
229 mb_put_uint16be(mbp, rqp->nr_trnid);
230 nmflags = ((rqp->nr_opcode & 0x1F) << 3) | ((rqp->nr_nmflags & 0x70) >> 4);
232 mb_put_uint8(mbp, (rqp->nr_nmflags & 0x0f) << 4 /* rcode */);
233 mb_put_uint16be(mbp, rqp->nr_qdcount);
234 mb_put_uint16be(mbp, rqp->nr_ancount);
235 mb_put_uint16be(mbp, rqp->nr_nscount);
236 mb_put_uint16be(mbp, rqp->nr_arcount);
237 if (rqp->nr_qdcount) {
238 if (rqp->nr_qdcount > 1)
240 len = nb_name_len(rqp->nr_qdname);
244 nb_name_encode(rqp->nr_qdname, cp);
245 mb_put_uint16be(mbp, rqp->nr_qdtype);
246 mb_put_uint16be(mbp, rqp->nr_qdclass);
255 nbns_rq_recv(struct nbns_rq *rqp)
257 struct mbdata *mbp = &rqp->nr_rp;
262 int s = rqp->nr_fd;
270 tv.tv_sec = rqp->nr_nbd->nb_timo;
286 rqp->nr_sender = sender;
291 nbns_rq_opensocket(struct nbns_rq *rqp)
296 s = rqp->nr_fd = socket(AF_INET, SOCK_DGRAM, 0);
299 if (rqp->nr_flags & NBRQF_BROADCAST) {
303 if (rqp->nr_if == NULL)
308 locaddr.sin_addr = rqp->nr_if->id_addr;
309 rqp->nr_dest.sin_addr.s_addr = rqp->nr_if->id_addr.s_addr | ~rqp->nr_if->id_mask.s_addr;
317 nbns_rq_send(struct nbns_rq *rqp)
319 struct mbdata *mbp = &rqp->nr_rq;
320 int s = rqp->nr_fd;
323 (struct sockaddr*)&rqp->nr_dest, sizeof(rqp->nr_dest)) < 0)
329 nbns_rq(struct nbns_rq *rqp)
331 struct mbdata *mbp = &rqp->nr_rq;
336 rqp->nr_if = nb_iflist;
338 error = nbns_rq_opensocket(rqp);
343 error = nbns_rq_send(rqp);
346 error = nbns_rq_recv(rqp);
349 if ((rqp->nr_nmflags & NBNS_NMFLAG_BCAST) &&
350 rqp->nr_if != NULL &&
351 rqp->nr_if->id_next != NULL) {
352 rqp->nr_if = rqp->nr_if->id_next;
353 close(rqp->nr_fd);
361 mbp = &rqp->nr_rp;
365 if (rpid != rqp->nr_trnid)
370 rqp->nr_rpnmflags = (nmflags & 7) << 4;
372 rqp->nr_rpnmflags |= (nmflags & 0xf0) >> 4;
373 rqp->nr_rprcode = nmflags & 0xf;
374 if (rqp->nr_rprcode)
375 return NBERROR(rqp->nr_rprcode);
377 mb_get_uint16be(mbp, &rqp->nr_rpancount);
378 mb_get_uint16be(mbp, &rqp->nr_rpnscount);
379 mb_get_uint16be(mbp, &rqp->nr_rparcount);