/* backend for tree connect call */ NTSTATUS smbsrv_tcon_backend(struct smbsrv_request *req, union smb_tcon *con) { NTSTATUS status; if (con->generic.level == RAW_TCON_TCON) { DATA_BLOB password; password = data_blob_string_const(con->tcon.in.password); status = make_connection(req, con->tcon.in.service, password, con->tcon.in.dev); if (!NT_STATUS_IS_OK(status)) { return status; } con->tcon.out.max_xmit = req->smb_conn->negotiate.max_recv; con->tcon.out.tid = req->tcon->tid; return status; } /* TODO: take a look at tconx.in.flags! */ status = make_connection(req, con->tconx.in.path, con->tconx.in.password, con->tconx.in.device); if (!NT_STATUS_IS_OK(status)) { return status; } con->tconx.out.tid = req->tcon->tid; con->tconx.out.dev_type = talloc_strdup(req, req->tcon->ntvfs->dev_type); con->tconx.out.fs_type = talloc_strdup(req, req->tcon->ntvfs->fs_type); con->tconx.out.options = SMB_SUPPORT_SEARCH_BITS | (share_int_option(req->tcon->ntvfs->config, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT) << 2); if (share_bool_option(req->tcon->ntvfs->config, SHARE_MSDFS_ROOT, SHARE_MSDFS_ROOT_DEFAULT) && lp_host_msdfs(req->smb_conn->lp_ctx)) { con->tconx.out.options |= SMB_SHARE_IN_DFS; } return status; }
/* setup config options for a posix share */ static void pvfs_setup_options(struct pvfs_state *pvfs) { struct share_config *scfg = pvfs->ntvfs->ctx->config; const char *eadb; bool def_perm_override = false; if (share_bool_option(scfg, SHARE_MAP_HIDDEN, SHARE_MAP_HIDDEN_DEFAULT)) pvfs->flags |= PVFS_FLAG_MAP_HIDDEN; if (share_bool_option(scfg, SHARE_MAP_ARCHIVE, SHARE_MAP_ARCHIVE_DEFAULT)) pvfs->flags |= PVFS_FLAG_MAP_ARCHIVE; if (share_bool_option(scfg, SHARE_MAP_SYSTEM, SHARE_MAP_SYSTEM_DEFAULT)) pvfs->flags |= PVFS_FLAG_MAP_SYSTEM; if (share_bool_option(scfg, SHARE_READONLY, SHARE_READONLY_DEFAULT)) pvfs->flags |= PVFS_FLAG_READONLY; if (share_bool_option(scfg, SHARE_STRICT_SYNC, SHARE_STRICT_SYNC_DEFAULT)) pvfs->flags |= PVFS_FLAG_STRICT_SYNC; if (share_bool_option(scfg, SHARE_STRICT_LOCKING, SHARE_STRICT_LOCKING_DEFAULT)) pvfs->flags |= PVFS_FLAG_STRICT_LOCKING; if (share_bool_option(scfg, SHARE_CI_FILESYSTEM, SHARE_CI_FILESYSTEM_DEFAULT)) pvfs->flags |= PVFS_FLAG_CI_FILESYSTEM; if (share_bool_option(scfg, PVFS_FAKE_OPLOCKS, PVFS_FAKE_OPLOCKS_DEFAULT)) pvfs->flags |= PVFS_FLAG_FAKE_OPLOCKS; if (share_bool_option(scfg, PVFS_AIO, false)) pvfs->flags |= PVFS_FLAG_LINUX_AIO; #if defined(O_DIRECTORY) && defined(O_NOFOLLOW) /* set PVFS_PERM_OVERRIDE by default only if the system * supports the necessary capabilities to make it secure */ def_perm_override = true; #endif if (share_bool_option(scfg, PVFS_PERM_OVERRIDE, def_perm_override)) pvfs->flags |= PVFS_FLAG_PERM_OVERRIDE; /* file perm options */ pvfs->options.create_mask = share_int_option(scfg, SHARE_CREATE_MASK, SHARE_CREATE_MASK_DEFAULT); pvfs->options.dir_mask = share_int_option(scfg, SHARE_DIR_MASK, SHARE_DIR_MASK_DEFAULT); pvfs->options.force_dir_mode = share_int_option(scfg, SHARE_FORCE_DIR_MODE, SHARE_FORCE_DIR_MODE_DEFAULT); pvfs->options.force_create_mode = share_int_option(scfg, SHARE_FORCE_CREATE_MODE, SHARE_FORCE_CREATE_MODE_DEFAULT); /* this must be a power of 2 */ pvfs->alloc_size_rounding = share_int_option(scfg, PVFS_ALLOCATION_ROUNDING, PVFS_ALLOCATION_ROUNDING_DEFAULT); pvfs->search.inactivity_time = share_int_option(scfg, PVFS_SEARCH_INACTIVITY, PVFS_SEARCH_INACTIVITY_DEFAULT); #if HAVE_XATTR_SUPPORT if (share_bool_option(scfg, PVFS_XATTR, PVFS_XATTR_DEFAULT)) pvfs->flags |= PVFS_FLAG_XATTR_ENABLE; #endif pvfs->sharing_violation_delay = share_int_option(scfg, PVFS_SHARE_DELAY, PVFS_SHARE_DELAY_DEFAULT); pvfs->oplock_break_timeout = share_int_option(scfg, PVFS_OPLOCK_TIMEOUT, PVFS_OPLOCK_TIMEOUT_DEFAULT); pvfs->writetime_delay = share_int_option(scfg, PVFS_WRITETIME_DELAY, PVFS_WRITETIME_DELAY_DEFAULT); pvfs->share_name = talloc_strdup(pvfs, scfg->name); pvfs->fs_attribs = FS_ATTR_CASE_SENSITIVE_SEARCH | FS_ATTR_CASE_PRESERVED_NAMES | FS_ATTR_UNICODE_ON_DISK | FS_ATTR_SPARSE_FILES; /* allow xattrs to be stored in a external tdb */ eadb = share_string_option(scfg, PVFS_EADB, NULL); if (eadb != NULL) { pvfs->ea_db = tdb_wrap_open(pvfs, eadb, 50000, TDB_DEFAULT, O_RDWR|O_CREAT, 0600, pvfs->ntvfs->ctx->lp_ctx); if (pvfs->ea_db != NULL) { pvfs->flags |= PVFS_FLAG_XATTR_ENABLE; } else { DEBUG(0,("Failed to open eadb '%s' - %s\n", eadb, strerror(errno))); pvfs->flags &= ~PVFS_FLAG_XATTR_ENABLE; } } if (pvfs->flags & PVFS_FLAG_XATTR_ENABLE) { pvfs->fs_attribs |= FS_ATTR_NAMED_STREAMS; } if (pvfs->flags & PVFS_FLAG_XATTR_ENABLE) { pvfs->fs_attribs |= FS_ATTR_PERSISTANT_ACLS; } pvfs->sid_cache.creator_owner = dom_sid_parse_talloc(pvfs, SID_CREATOR_OWNER); pvfs->sid_cache.creator_group = dom_sid_parse_talloc(pvfs, SID_CREATOR_GROUP); /* check if the system really supports xattrs */ if (pvfs->flags & PVFS_FLAG_XATTR_ENABLE) { pvfs_xattr_probe(pvfs); } /* enable an ACL backend */ pvfs->acl_ops = pvfs_acl_backend_byname(share_string_option(scfg, PVFS_ACL, "xattr")); }
/* setup config options for a posix share */ static void pvfs_setup_options(struct pvfs_state *pvfs) { struct share_config *scfg = pvfs->ntvfs->ctx->config; const char *eadb; if (share_bool_option(scfg, SHARE_MAP_HIDDEN, SHARE_MAP_HIDDEN_DEFAULT)) pvfs->flags |= PVFS_FLAG_MAP_HIDDEN; if (share_bool_option(scfg, SHARE_MAP_ARCHIVE, SHARE_MAP_ARCHIVE_DEFAULT)) pvfs->flags |= PVFS_FLAG_MAP_ARCHIVE; if (share_bool_option(scfg, SHARE_MAP_SYSTEM, SHARE_MAP_SYSTEM_DEFAULT)) pvfs->flags |= PVFS_FLAG_MAP_SYSTEM; if (share_bool_option(scfg, SHARE_READONLY, SHARE_READONLY_DEFAULT)) pvfs->flags |= PVFS_FLAG_READONLY; if (share_bool_option(scfg, SHARE_STRICT_SYNC, SHARE_STRICT_SYNC_DEFAULT)) pvfs->flags |= PVFS_FLAG_STRICT_SYNC; if (share_bool_option(scfg, SHARE_STRICT_LOCKING, SHARE_STRICT_LOCKING_DEFAULT)) pvfs->flags |= PVFS_FLAG_STRICT_LOCKING; if (share_bool_option(scfg, SHARE_CI_FILESYSTEM, SHARE_CI_FILESYSTEM_DEFAULT)) pvfs->flags |= PVFS_FLAG_CI_FILESYSTEM; if (share_bool_option(scfg, PVFS_FAKE_OPLOCKS, PVFS_FAKE_OPLOCKS_DEFAULT)) { pvfs->flags |= PVFS_FLAG_FAKE_OPLOCKS; } /* this must be a power of 2 */ pvfs->alloc_size_rounding = share_int_option(scfg, PVFS_ALLOCATION_ROUNDING, PVFS_ALLOCATION_ROUNDING_DEFAULT); pvfs->search.inactivity_time = share_int_option(scfg, PVFS_SEARCH_INACTIVITY, PVFS_SEARCH_INACTIVITY_DEFAULT); #if HAVE_XATTR_SUPPORT if (share_bool_option(scfg, PVFS_XATTR, PVFS_XATTR_DEFAULT)) pvfs->flags |= PVFS_FLAG_XATTR_ENABLE; #endif pvfs->sharing_violation_delay = share_int_option(scfg, PVFS_SHARE_DELAY, PVFS_SHARE_DELAY_DEFAULT); pvfs->share_name = talloc_strdup(pvfs, scfg->name); pvfs->fs_attribs = FS_ATTR_CASE_SENSITIVE_SEARCH | FS_ATTR_CASE_PRESERVED_NAMES | FS_ATTR_UNICODE_ON_DISK | FS_ATTR_SPARSE_FILES; /* allow xattrs to be stored in a external tdb */ eadb = share_string_option(scfg, PVFS_EADB, NULL); if (eadb != NULL) { pvfs->ea_db = tdb_wrap_open(pvfs, eadb, 50000, TDB_DEFAULT, O_RDWR|O_CREAT, 0600); if (pvfs->ea_db != NULL) { pvfs->flags |= PVFS_FLAG_XATTR_ENABLE; } else { DEBUG(0,("Failed to open eadb '%s' - %s\n", eadb, strerror(errno))); pvfs->flags &= ~PVFS_FLAG_XATTR_ENABLE; } } if (pvfs->flags & PVFS_FLAG_XATTR_ENABLE) { pvfs->fs_attribs |= FS_ATTR_NAMED_STREAMS; } if (pvfs->flags & PVFS_FLAG_XATTR_ENABLE) { pvfs->fs_attribs |= FS_ATTR_PERSISTANT_ACLS; } pvfs->sid_cache.creator_owner = dom_sid_parse_talloc(pvfs, SID_CREATOR_OWNER); pvfs->sid_cache.creator_group = dom_sid_parse_talloc(pvfs, SID_CREATOR_GROUP); /* check if the system really supports xattrs */ if (pvfs->flags & PVFS_FLAG_XATTR_ENABLE) { pvfs_xattr_probe(pvfs); } /* enable an ACL backend */ pvfs->acl_ops = pvfs_acl_backend_byname(share_string_option(scfg, PVFS_ACL, "xattr")); }