int smb_t2_init(struct smb_t2rq *t2p, struct smb_connobj *source, ushort_t *setup, int setupcnt, struct smb_cred *scred) { int i; int error; bzero(t2p, sizeof (*t2p)); mutex_init(&t2p->t2_lock, NULL, MUTEX_DRIVER, NULL); cv_init(&t2p->t2_cond, NULL, CV_DEFAULT, NULL); t2p->t2_source = source; t2p->t2_setupcount = (u_int16_t)setupcnt; t2p->t2_setupdata = t2p->t2_setup; for (i = 0; i < setupcnt; i++) t2p->t2_setup[i] = setup[i]; t2p->t2_fid = 0xffff; t2p->t2_cred = scred; t2p->t2_share = (source->co_level == SMBL_SHARE ? CPTOSS(source) : NULL); /* for smb up/down */ error = smb_rq_getenv(source, &t2p->t2_vc, NULL); if (error) return (error); return (0); }
static int smb_rq_getenv(struct smb_connobj *co, struct smb_vc **vcpp, struct smb_share **sspp) { struct smb_vc *vcp = NULL; struct smb_share *ssp = NULL; int error = EINVAL; if (co->co_flags & SMBO_GONE) { SMBSDEBUG("zombie CO\n"); error = EINVAL; goto out; } switch (co->co_level) { case SMBL_SHARE: ssp = CPTOSS(co); if ((co->co_flags & SMBO_GONE) || co->co_parent == NULL) { SMBSDEBUG("zombie share %s\n", ssp->ss_name); break; } /* instead of recursion... */ co = co->co_parent; /* FALLTHROUGH */ case SMBL_VC: vcp = CPTOVC(co); if ((co->co_flags & SMBO_GONE) || co->co_parent == NULL) { SMBSDEBUG("zombie VC %s\n", vcp->vc_srvname); break; } error = 0; break; default: SMBSDEBUG("invalid level %d passed\n", co->co_level); } out: if (!error) { if (vcpp) *vcpp = vcp; if (sspp) *sspp = ssp; } return (error); }
int smb_nt_init(struct smb_ntrq *ntp, struct smb_connobj *source, ushort_t fn, struct smb_cred *scred) { int error; bzero(ntp, sizeof (*ntp)); ntp->nt_source = source; ntp->nt_function = fn; ntp->nt_cred = scred; ntp->nt_share = (source->co_level == SMBL_SHARE ? CPTOSS(source) : NULL); /* for smb up/down */ error = smb_rq_getenv(source, &ntp->nt_vc, NULL); if (error) return (error); return (0); }
static int smb_rq_getenv(struct smb_connobj *layer, struct smb_vc **vcpp, struct smb_share **sspp) { struct smb_vc *vcp = NULL; struct smb_share *ssp = NULL; struct smb_connobj *cp; int error = 0; switch (layer->co_level) { case SMBL_VC: vcp = CPTOVC(layer); if (layer->co_parent == NULL) { SMBERROR("zombie VC %s\n", vcp->vc_srvname); error = EINVAL; break; } break; case SMBL_SHARE: ssp = CPTOSS(layer); cp = layer->co_parent; if (cp == NULL) { SMBERROR("zombie share %s\n", ssp->ss_name); error = EINVAL; break; } error = smb_rq_getenv(cp, &vcp, NULL); if (error) break; break; default: SMBERROR("invalid layer %d passed\n", layer->co_level); error = EINVAL; } if (vcpp) *vcpp = vcp; if (sspp) *sspp = ssp; return error; }