/* * TRANS2 request implementation */ int smb_t2_alloc(struct smb_connobj *layer, u_short setup, struct smb_cred *scred, struct smb_t2rq **t2pp) { struct smb_t2rq *t2p; int error; t2p = kmalloc(sizeof(*t2p), M_SMBRQ, M_WAITOK); error = smb_t2_init(t2p, layer, setup, scred); t2p->t2_flags |= SMBT2_ALLOCED; if (error) { smb_t2_done(t2p); return error; } *t2pp = t2p; return 0; }
/* * TRANS2 request implementation * TRANS implementation is in the "t2" routines * NT_TRANSACTION implementation is the separate "nt" stuff */ int smb_t2_alloc(struct smb_connobj *layer, ushort_t setup, struct smb_cred *scred, struct smb_t2rq **t2pp) { struct smb_t2rq *t2p; int error; t2p = (struct smb_t2rq *)kmem_alloc(sizeof (*t2p), KM_SLEEP); if (t2p == NULL) return (ENOMEM); error = smb_t2_init(t2p, layer, &setup, 1, scred); t2p->t2_flags |= SMBT2_ALLOCED; if (error) { smb_t2_done(t2p); return (error); } *t2pp = t2p; return (0); }
int smb_usr_t2request(struct smb_share *ssp, struct smbioc_t2rq *dp, struct smb_cred *scred) { struct smb_t2rq t2, *t2p = &t2; struct mdchain *mdp; int error, len; if (dp->ioc_setupcnt > 3) return EINVAL; error = smb_t2_init(t2p, SSTOCP(ssp), dp->ioc_setup[0], scred); if (error) return error; len = t2p->t2_setupcount = dp->ioc_setupcnt; if (len > 1) t2p->t2_setupdata = dp->ioc_setup; if (dp->ioc_name) { t2p->t_name = smb_strdupin(dp->ioc_name, 128); if (t2p->t_name == NULL) { error = ENOMEM; goto bad; } } t2p->t2_maxscount = 0; t2p->t2_maxpcount = dp->ioc_rparamcnt; t2p->t2_maxdcount = dp->ioc_rdatacnt; error = smb_cpdatain(&t2p->t2_tparam, dp->ioc_tparamcnt, dp->ioc_tparam); if (error) goto bad; error = smb_cpdatain(&t2p->t2_tdata, dp->ioc_tdatacnt, dp->ioc_tdata); if (error) goto bad; error = smb_t2_request(t2p); if (error) goto bad; mdp = &t2p->t2_rparam; if (mdp->md_top) { len = m_fixhdr(mdp->md_top); if (len > dp->ioc_rparamcnt) { error = EMSGSIZE; goto bad; } dp->ioc_rparamcnt = len; error = md_get_mem(mdp, dp->ioc_rparam, len, MB_MUSER); if (error) goto bad; } else dp->ioc_rparamcnt = 0; mdp = &t2p->t2_rdata; if (mdp->md_top) { len = m_fixhdr(mdp->md_top); if (len > dp->ioc_rdatacnt) { error = EMSGSIZE; goto bad; } dp->ioc_rdatacnt = len; error = md_get_mem(mdp, dp->ioc_rdata, len, MB_MUSER); } else dp->ioc_rdatacnt = 0; bad: if (t2p->t_name) smb_strfree(t2p->t_name); smb_t2_done(t2p); return error; }