int smb_rq_simple(struct smb_rq *rqp) { struct smbioc_rq krq; struct mbdata *mbp; char *data; mbp = smb_rq_getrequest(rqp); m_lineup(mbp->mb_top, &mbp->mb_top); data = mtod(mbp->mb_top, char*); bzero(&krq, sizeof(krq)); krq.ioc_cmd = rqp->rq_cmd; krq.ioc_twc = rqp->rq_wcount; krq.ioc_twords = data; krq.ioc_tbc = mbp->mb_count; krq.ioc_tbytes = data + rqp->rq_wcount * 2; mbp = smb_rq_getreply(rqp); krq.ioc_rpbufsz = mbp->mb_top->m_maxlen; krq.ioc_rpbuf = mtod(mbp->mb_top, char *); if (ioctl(rqp->rq_ctx->ct_fd, SMBIOC_REQUEST, &krq) == -1) return errno; mbp->mb_top->m_len = krq.ioc_rwc * 2 + krq.ioc_rbc; rqp->rq_wcount = krq.ioc_rwc; rqp->rq_bcount = krq.ioc_rbc; return 0; }
int nbns_rq_prepare(struct nbns_rq *rqp) { struct nb_ctx *ctx = rqp->nr_nbd; struct mbdata *mbp = &rqp->nr_rq; uint16_t ofr; /* opcode, flags, rcode */ int error; error = mb_init_sz(&rqp->nr_rp, NBDG_MAXSIZE); if (error) return (error); /* * When looked into the ethereal trace, 'nmblookup' command sets this * flag. We will also set. */ mb_put_uint16be(mbp, rqp->nr_trnid); ofr = ((rqp->nr_opcode & 0x1F) << 11) | ((rqp->nr_nmflags & 0x7F) << 4); /* rcode=0 */ mb_put_uint16be(mbp, ofr); mb_put_uint16be(mbp, rqp->nr_qdcount); mb_put_uint16be(mbp, rqp->nr_ancount); mb_put_uint16be(mbp, rqp->nr_nscount); error = mb_put_uint16be(mbp, rqp->nr_arcount); if (rqp->nr_qdcount) { if (rqp->nr_qdcount > 1) return (EINVAL); (void) nb_name_encode(mbp, rqp->nr_qdname); mb_put_uint16be(mbp, rqp->nr_qdtype); error = mb_put_uint16be(mbp, rqp->nr_qdclass); } if (error) return (error); error = m_lineup(mbp->mb_top, &mbp->mb_top); if (error) return (error); if (ctx->nb_timo == 0) ctx->nb_timo = 1; /* by default 1 second */ return (0); }