/* * Exports IPC$ or Admin shares */ static int smb_kshare_export_trans(smb_server_t *sv, char *name, char *path, char *cmnt) { smb_kshare_t *shr; ASSERT(name); ASSERT(path); shr = kmem_cache_alloc(smb_kshare_cache_share, KM_SLEEP); bzero(shr, sizeof (smb_kshare_t)); shr->shr_magic = SMB_SHARE_MAGIC; shr->shr_refcnt = 1; shr->shr_flags = SMB_SHRF_TRANS | smb_kshare_is_admin(shr->shr_name); if (strcasecmp(name, "IPC$") == 0) shr->shr_type = STYPE_IPC; else shr->shr_type = STYPE_DISKTREE; shr->shr_type |= smb_kshare_is_special(shr->shr_name); shr->shr_name = smb_mem_strdup(name); if (path) shr->shr_path = smb_mem_strdup(path); if (cmnt) shr->shr_cmnt = smb_mem_strdup(cmnt); shr->shr_oemname = smb_kshare_oemname(name); return (smb_kshare_export(sv, shr)); }
static int smb_ofile_netinfo_init(smb_ofile_t *of, smb_netfileinfo_t *fi) { smb_user_t *user; smb_tree_t *tree; smb_node_t *node; char *path; char *buf; int rc; ASSERT(of); user = of->f_user; tree = of->f_tree; ASSERT(user); ASSERT(tree); buf = kmem_zalloc(MAXPATHLEN, KM_SLEEP); switch (of->f_ftype) { case SMB_FTYPE_DISK: node = of->f_node; ASSERT(node); fi->fi_permissions = of->f_granted_access; fi->fi_numlocks = smb_lock_get_lock_count(node, of); path = kmem_zalloc(MAXPATHLEN, KM_SLEEP); if (node != tree->t_snode) { rc = smb_node_getshrpath(node, tree, path, MAXPATHLEN); if (rc != 0) (void) strlcpy(path, node->od_name, MAXPATHLEN); } (void) snprintf(buf, MAXPATHLEN, "%s:%s", tree->t_sharename, path); kmem_free(path, MAXPATHLEN); break; case SMB_FTYPE_MESG_PIPE: ASSERT(of->f_pipe); fi->fi_permissions = FILE_READ_DATA | FILE_WRITE_DATA | FILE_EXECUTE; fi->fi_numlocks = 0; (void) snprintf(buf, MAXPATHLEN, "\\PIPE\\%s", of->f_pipe->p_name); break; default: kmem_free(buf, MAXPATHLEN); return (-1); } fi->fi_fid = of->f_fid; fi->fi_uniqid = of->f_uniqid; fi->fi_pathlen = strlen(buf) + 1; fi->fi_path = smb_mem_strdup(buf); kmem_free(buf, MAXPATHLEN); fi->fi_namelen = user->u_domain_len + user->u_name_len + 2; fi->fi_username = kmem_alloc(fi->fi_namelen, KM_SLEEP); (void) snprintf(fi->fi_username, fi->fi_namelen, "%s\\%s", user->u_domain, user->u_name); return (0); }
/* * Decodes share information in an nvlist format into a smb_kshare_t * structure. * * This is a temporary function and will be replaced by functions * provided by libsharev2 code after it's available. */ static smb_kshare_t * smb_kshare_decode(nvlist_t *share) { smb_kshare_t tmp; smb_kshare_t *shr; nvlist_t *smb; char *csc_name = NULL; int rc; ASSERT(share); bzero(&tmp, sizeof (smb_kshare_t)); rc = nvlist_lookup_string(share, "name", &tmp.shr_name); rc |= nvlist_lookup_string(share, "path", &tmp.shr_path); (void) nvlist_lookup_string(share, "desc", &tmp.shr_cmnt); ASSERT(tmp.shr_name && tmp.shr_path); rc |= nvlist_lookup_nvlist(share, "smb", &smb); if (rc != 0) { cmn_err(CE_WARN, "kshare: failed looking up SMB properties" " (%d)", rc); return (NULL); } rc = nvlist_lookup_uint32(smb, "type", &tmp.shr_type); if (rc != 0) { cmn_err(CE_WARN, "kshare[%s]: failed getting the share type" " (%d)", tmp.shr_name, rc); return (NULL); } (void) nvlist_lookup_string(smb, SHOPT_AD_CONTAINER, &tmp.shr_container); (void) nvlist_lookup_string(smb, SHOPT_NONE, &tmp.shr_access_none); (void) nvlist_lookup_string(smb, SHOPT_RO, &tmp.shr_access_ro); (void) nvlist_lookup_string(smb, SHOPT_RW, &tmp.shr_access_rw); tmp.shr_flags |= smb_kshare_decode_bool(smb, SHOPT_ABE, SMB_SHRF_ABE); tmp.shr_flags |= smb_kshare_decode_bool(smb, SHOPT_CATIA, SMB_SHRF_CATIA); tmp.shr_flags |= smb_kshare_decode_bool(smb, SHOPT_GUEST, SMB_SHRF_GUEST_OK); tmp.shr_flags |= smb_kshare_decode_bool(smb, SHOPT_DFSROOT, SMB_SHRF_DFSROOT); tmp.shr_flags |= smb_kshare_decode_bool(smb, "Autohome", SMB_SHRF_AUTOHOME); if ((tmp.shr_flags & SMB_SHRF_AUTOHOME) == SMB_SHRF_AUTOHOME) { rc = nvlist_lookup_uint32(smb, "uid", &tmp.shr_uid); rc |= nvlist_lookup_uint32(smb, "gid", &tmp.shr_gid); if (rc != 0) { cmn_err(CE_WARN, "kshare: failed looking up uid/gid" " (%d)", rc); return (NULL); } } (void) nvlist_lookup_string(smb, SHOPT_CSC, &csc_name); smb_kshare_csc_flags(&tmp, csc_name); shr = kmem_cache_alloc(smb_kshare_cache_share, KM_SLEEP); bzero(shr, sizeof (smb_kshare_t)); shr->shr_magic = SMB_SHARE_MAGIC; shr->shr_refcnt = 1; shr->shr_name = smb_mem_strdup(tmp.shr_name); shr->shr_path = smb_mem_strdup(tmp.shr_path); if (tmp.shr_cmnt) shr->shr_cmnt = smb_mem_strdup(tmp.shr_cmnt); if (tmp.shr_container) shr->shr_container = smb_mem_strdup(tmp.shr_container); if (tmp.shr_access_none) shr->shr_access_none = smb_mem_strdup(tmp.shr_access_none); if (tmp.shr_access_ro) shr->shr_access_ro = smb_mem_strdup(tmp.shr_access_ro); if (tmp.shr_access_rw) shr->shr_access_rw = smb_mem_strdup(tmp.shr_access_rw); shr->shr_oemname = smb_kshare_oemname(shr->shr_name); shr->shr_flags = tmp.shr_flags | smb_kshare_is_admin(shr->shr_name); shr->shr_type = tmp.shr_type | smb_kshare_is_special(shr->shr_name); shr->shr_uid = tmp.shr_uid; shr->shr_gid = tmp.shr_gid; if ((shr->shr_flags & SMB_SHRF_AUTOHOME) == SMB_SHRF_AUTOHOME) shr->shr_autocnt = 1; return (shr); }