/* * Executes map and unmap command for shares. */ int smb_kshare_exec(smb_server_t *sv, smb_shr_execinfo_t *execinfo) { int exec_rc = 0; (void) smb_kdoor_upcall(sv, SMB_DR_SHR_EXEC, execinfo, smb_shr_execinfo_xdr, &exec_rc, xdr_int); return (exec_rc); }
/* * Obtains any host access restriction on the specified * share for the given host (ipaddr) by calling smbd */ uint32_t smb_kshare_hostaccess(smb_kshare_t *shr, smb_session_t *session) { smb_shr_hostaccess_query_t req; smb_inaddr_t *ipaddr = &session->ipaddr; uint32_t host_access = SMB_SHRF_ACC_OPEN; uint32_t flag = SMB_SHRF_ACC_OPEN; uint32_t access; if (smb_inet_iszero(ipaddr)) return (ACE_ALL_PERMS); if ((shr->shr_access_none == NULL || *shr->shr_access_none == '\0') && (shr->shr_access_ro == NULL || *shr->shr_access_ro == '\0') && (shr->shr_access_rw == NULL || *shr->shr_access_rw == '\0')) return (ACE_ALL_PERMS); if (shr->shr_access_none != NULL) flag |= SMB_SHRF_ACC_NONE; if (shr->shr_access_ro != NULL) flag |= SMB_SHRF_ACC_RO; if (shr->shr_access_rw != NULL) flag |= SMB_SHRF_ACC_RW; req.shq_none = shr->shr_access_none; req.shq_ro = shr->shr_access_ro; req.shq_rw = shr->shr_access_rw; req.shq_flag = flag; req.shq_ipaddr = *ipaddr; (void) smb_kdoor_upcall(session->s_server, SMB_DR_SHR_HOSTACCESS, &req, smb_shr_hostaccess_query_xdr, &host_access, xdr_uint32_t); switch (host_access) { case SMB_SHRF_ACC_RO: access = ACE_ALL_PERMS & ~ACE_ALL_WRITE_PERMS; break; case SMB_SHRF_ACC_OPEN: case SMB_SHRF_ACC_RW: access = ACE_ALL_PERMS; break; case SMB_SHRF_ACC_NONE: default: access = 0; } return (access); }
/* * Get referral information for the specified path from user space * using a door call. */ static uint32_t smb_dfs_referrals_get(smb_request_t *sr, char *dfs_path, dfs_reftype_t reftype, dfs_referral_response_t *refrsp) { dfs_referral_query_t req; int rc; req.rq_type = reftype; req.rq_path = dfs_path; bzero(refrsp, sizeof (dfs_referral_response_t)); refrsp->rp_status = NT_STATUS_NOT_FOUND; rc = smb_kdoor_upcall(sr->sr_server, SMB_DR_DFS_GET_REFERRALS, &req, dfs_referral_query_xdr, refrsp, dfs_referral_response_xdr); if (rc != 0 || refrsp->rp_status != ERROR_SUCCESS) { return (NT_STATUS_NO_SUCH_DEVICE); } (void) strsubst(refrsp->rp_referrals.i_uncpath, '/', '\\'); return (NT_STATUS_SUCCESS); }