19fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 29fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * CDDL HEADER START 39fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 49fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The contents of this file are subject to the terms of the 59fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Common Development and Distribution License (the "License"). 69fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * You may not use this file except in compliance with the License. 79fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 89fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 99fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * or http://www.opensolaris.org/os/licensing. 109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * See the License for the specific language governing permissions 119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and limitations under the License. 129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * When distributing Covered Code, include this CDDL HEADER in each 149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If applicable, add the following below this CDDL HEADER, with the 169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fields enclosed by brackets "[]" replaced with your own identifying 179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * information: Portions Copyright [yyyy] [name of copyright owner] 189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * CDDL HEADER END 209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 22*fd9ee8b5Sjoyce mcintosh * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_kproto.h> 269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_fsops.h> 279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smbinfo.h> 289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_fssize_t 319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * volume_units and volume avail are the total allocated and 329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * available units on the volume. 339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * caller_units and caller_avail are the allocated and available 349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * units on the volume for the user associated with the calling 359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * thread. 369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smb_fssize { 389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t fs_volume_units; 399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t fs_volume_avail; 409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t fs_caller_units; 419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t fs_caller_avail; 429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t fs_sectors_per_unit; 439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t fs_bytes_per_sector; 449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smb_fssize_t; 459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * File System Control Flags for smb_com_trans2_query|set_fs_information 489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * level SMB_FILE_FS_CONTROL_INFORMATION 499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define FILE_VC_QUOTA_TRACK 0x00000001 519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define FILE_VC_QUOTA_ENFORCE 0x00000002 529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define FILE_VC_CONTENT_INDEX_DISABLED 0x00000008 539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define FILE_VC_LOG_QUOTA_THRESHOLD 0x00000010 549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define FILE_VC_LOG_QUOTA_LIMIT 0x00000020 559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define FILE_VC_LOG_VOLUME_THRESHOLD 0x00000040 569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define FILE_VC_LOG_VOLUME_LIMIT 0x00000080 579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define FILE_VC_QUOTAS_INCOMPLETE 0x00000100 589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define FILE_VC_QUOTAS_REBUILDING 0x00000200 599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_fssize(smb_request_t *, smb_fssize_t *); 619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_trans2_set_fs_ctrl_info(smb_request_t *, smb_xa_t *); 629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_com_query_information_disk 659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The SMB_COM_QUERY_INFORMATION_DISK command is used to determine the 679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * capacity and remaining free space on the drive hosting the directory 689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * structure indicated by Tid in the SMB header. 699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The blocking/allocation units used in this response may be independent 719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * of the actual physical or logical blocking/allocation algorithm(s) used 729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * internally by the server. However, they must accurately reflect the 739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * amount of space on the server. 749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This SMB only returns 16 bits of information for each field, which may 769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * not be large enough for some disk systems. In particular TotalUnits is 779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * commonly > 64K. Fortunately, it turns out the all the client cares 789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * about is the total disk size, in bytes, and the free space, in bytes. 799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * So, it is reasonable for a server to adjust the relative values of 809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * BlocksPerUnit and BlockSize to accommodate. If after all adjustment, 819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the numbers are still too high, the largest possible values for 829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * TotalUnit or FreeUnits (i.e. 0xFFFF) should be returned. 839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t 869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_pre_query_information_disk(smb_request_t *sr) 879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States DTRACE_SMB_1(op__QueryInformationDisk__start, smb_request_t *, sr); 899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_SUCCESS); 909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_post_query_information_disk(smb_request_t *sr) 949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States DTRACE_SMB_1(op__QueryInformationDisk__done, smb_request_t *, sr); 969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t 999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_com_query_information_disk(smb_request_t *sr) 1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fsblkcnt64_t total_blocks, free_blocks; 1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unsigned long block_size, unit_size; 1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unsigned short blocks_per_unit, bytes_per_block; 1059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unsigned short total_units, free_units; 1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_fssize_t fssize; 1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (STYPE_ISIPC(sr->tid_tree->t_res_type)) { 1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS, ERRnoaccess); 1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_fssize(sr, &fssize) != 0) 1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 1159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unit_size = fssize.fs_sectors_per_unit; 1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States block_size = fssize.fs_bytes_per_sector; 1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States total_blocks = fssize.fs_caller_units; 1199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free_blocks = fssize.fs_caller_avail; 1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * It seems that DOS clients cannot handle block sizes 1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * bigger than 512 KB. So we have to set the block size at 1249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * most to 512 1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (block_size > 512) { 1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States block_size >>= 1; 1289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unit_size <<= 1; 1299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* adjust blocks and sizes until they fit into a word */ 1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (total_blocks >= 0xFFFF) { 1339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States total_blocks >>= 1; 1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free_blocks >>= 1; 1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((unit_size <<= 1) > 0xFFFF) { 1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unit_size >>= 1; 1379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States total_blocks = 0xFFFF; 1389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free_blocks <<= 1; 1399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States total_units = (total_blocks >= 0xFFFF) ? 1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0xFFFF : (unsigned short)total_blocks; 1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free_units = (free_blocks >= 0xFFFF) ? 1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0xFFFF : (unsigned short)free_blocks; 1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bytes_per_block = (unsigned short)block_size; 1489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States blocks_per_unit = (unsigned short)unit_size; 1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_encode_result(sr, 5, 0, "bwwww2.w", 1519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5, 1529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States total_units, /* total_units */ 1539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States blocks_per_unit, /* blocks_per_unit */ 1549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bytes_per_block, /* blocksize */ 1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free_units, /* free_units */ 1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0); /* bcc */ 1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); 1599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_com_trans2_query_fs_information 1639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 1649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This transaction requests information about the filesystem. 1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The following information levels are supported: 1669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 1679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * InformationLevel Value 1689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================================== ====== 1699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_INFO_ALLOCATION 1 1709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_INFO_VOLUME 2 1719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_QUERY_FS_VOLUME_INFO 0x102 1729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_QUERY_FS_SIZE_INFO 0x103 1739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_QUERY_FS_DEVICE_INFO 0x104 1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_QUERY_FS_ATTRIBUTE_INFO 0x105 1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_FILE_FS_VOLUME_INFORMATION 1001 1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_FILE_FS_SIZE_INFORMATION 1003 1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_FILE_FS_DEVICE_INFORMATION 1004 1789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_FILE_FS_ATTRIBUTE_INFORMATION 1005 1799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_FILE_FS_CONTROL_INFORMATION 1006 1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_FILE_FS_FULLSIZE_INFORMATION 1007 1819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 1829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The fsid provides a system-wide unique file system ID. 1839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fsid.val[0] is the 32-bit dev for the file system of the share root 1849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_node. 1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fsid.val[1] is the file system type. 1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t 1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_com_trans2_query_fs_information(smb_request_t *sr, smb_xa_t *xa) 1899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t flags; 1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *encode_str, *tmpbuf; 1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t max_int; 1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint16_t infolev; 1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc, length, buflen; 1959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tree_t *tree; 1969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_node_t *snode; 1979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *fsname = "NTFS"; 1989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fsid_t fsid; 1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_fssize_t fssize; 2009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_msgbuf_t mb; 2019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tree = sr->tid_tree; 2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!STYPE_ISDSK(tree->t_res_type)) { 2059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_ACCESS_DENIED, 2069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_ACCESS_DENIED); 2079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_mbc_decodef(&xa->req_param_mb, "w", &infolev) != 0) 2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States snode = tree->t_snode; 2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fsid = SMB_NODE_FSID(snode); 2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (infolev) { 2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_INFO_ALLOCATION: 2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_fssize(sr, &fssize) != 0) 2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States max_int = (uint64_t)UINT_MAX; 2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (fssize.fs_caller_units > max_int) 2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_caller_units = max_int; 2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (fssize.fs_caller_avail > max_int) 2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_caller_avail = max_int; 2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, "llllw", 2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0, 2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_sectors_per_unit, 2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_caller_units, 2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_caller_avail, 2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_bytes_per_sector); 2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_INFO_VOLUME: 2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * In this response, the unicode volume label is NOT 2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * expected to be aligned. Encode ('U') into a temporary 2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * buffer, then encode buffer as a byte stream ('#c'). 2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((sr->smb_flg2 & SMB_FLAGS2_UNICODE) || 2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (sr->session->native_os == NATIVE_OS_WIN95)) { 2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States length = smb_wcequiv_strlen(tree->t_volume); 2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States buflen = length + sizeof (smb_wchar_t); 2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tmpbuf = smb_srm_zalloc(sr, buflen); 2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_msgbuf_init(&mb, (uint8_t *)tmpbuf, buflen, 2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States SMB_MSGBUF_UNICODE); 2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_msgbuf_encode(&mb, "U", tree->t_volume); 2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc >= 0) { 2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_mbc_encodef(&xa->rep_data_mb, 2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States "%lb#c", sr, fsid.val[0], 2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States length, length, tmpbuf); 2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_msgbuf_term(&mb); 2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States length = strlen(tree->t_volume); 2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_mbc_encodef(&xa->rep_data_mb, "%lbs", sr, 2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fsid.val[0], length, tree->t_volume); 2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc < 0) 2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_QUERY_FS_VOLUME_INFO: 2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_VOLUME_INFORMATION: 2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((sr->smb_flg2 & SMB_FLAGS2_UNICODE) || 2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (sr->session->native_os == NATIVE_OS_WIN95)) { 2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States length = smb_wcequiv_strlen(tree->t_volume); 2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States encode_str = "%qllb.U"; 2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States length = strlen(tree->t_volume); 2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States encode_str = "%qllb.s"; 2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * NT has the "supports objects" flag set to 1. 2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, encode_str, sr, 2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0ll, /* Volume creation time */ 2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fsid.val[0], /* Volume serial number */ 2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States length, /* label length */ 2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0, /* Supports objects */ 2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tree->t_volume); 2859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_QUERY_FS_SIZE_INFO: 2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_SIZE_INFORMATION: 2899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_fssize(sr, &fssize) != 0) 2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, "qqll", 2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_caller_units, 2949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_caller_avail, 2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_sectors_per_unit, 2969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_bytes_per_sector); 2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_QUERY_FS_DEVICE_INFO: 3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_DEVICE_INFORMATION: 3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, "ll", 3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States FILE_DEVICE_FILE_SYSTEM, 3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States FILE_DEVICE_IS_MOUNTED); 3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_QUERY_FS_ATTRIBUTE_INFO: 3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_ATTRIBUTE_INFORMATION: 3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((sr->smb_flg2 & SMB_FLAGS2_UNICODE) || 3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (sr->session->native_os == NATIVE_OS_WINNT) || 3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (sr->session->native_os == NATIVE_OS_WIN2000) || 3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (sr->session->native_os == NATIVE_OS_WIN95) || 3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (sr->session->native_os == NATIVE_OS_MACOS)) { 3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States length = smb_wcequiv_strlen(fsname); 3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States encode_str = "%lllU"; 3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sr->smb_flg2 |= SMB_FLAGS2_UNICODE; 3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States length = strlen(fsname); 3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States encode_str = "%llls"; 3199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States flags = FILE_CASE_PRESERVED_NAMES; 3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (tree->t_flags & SMB_TREE_UNICODE_ON_DISK) 3249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States flags |= FILE_UNICODE_ON_DISK; 3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (tree->t_flags & SMB_TREE_SUPPORTS_ACLS) 3279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States flags |= FILE_PERSISTENT_ACLS; 3289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((tree->t_flags & SMB_TREE_CASEINSENSITIVE) == 0) 3309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States flags |= FILE_CASE_SENSITIVE_SEARCH; 3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (tree->t_flags & SMB_TREE_STREAMS) 3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States flags |= FILE_NAMED_STREAMS; 3349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (tree->t_flags & SMB_TREE_QUOTA) 3369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States flags |= FILE_VOLUME_QUOTAS; 3379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 338*fd9ee8b5Sjoyce mcintosh if (tree->t_flags & SMB_TREE_SPARSE) 339*fd9ee8b5Sjoyce mcintosh flags |= FILE_SUPPORTS_SPARSE_FILES; 340*fd9ee8b5Sjoyce mcintosh 3419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, encode_str, sr, 3429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States flags, 3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States MAXNAMELEN, /* max name */ 3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States length, /* label length */ 3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fsname); 3469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_CONTROL_INFORMATION: 3499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) { 3509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, 3519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_NOT_SUPPORTED); 3529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 3539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, "qqqqqll", 3569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0, /* free space start filtering - MUST be 0 */ 3579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0, /* free space threshold - MUST be 0 */ 3589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0, /* free space stop filtering - MUST be 0 */ 3599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States SMB_QUOTA_UNLIMITED, /* default quota threshold */ 3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States SMB_QUOTA_UNLIMITED, /* default quota limit */ 3619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States FILE_VC_QUOTA_ENFORCE, /* fs control flag */ 3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 0); /* pad bytes */ 3639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 3649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_FULLSIZE_INFORMATION: 3669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_fssize(sr, &fssize) != 0) 3679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 3689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, "qqqll", 3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_caller_units, 3719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_caller_avail, 3729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_volume_avail, 3739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_sectors_per_unit, 3749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize.fs_bytes_per_sector); 3759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 3769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_LABEL_INFORMATION: 3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_OBJECTID_INFORMATION: 3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_DRIVERPATH_INFORMATION: 3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, 3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_NOT_SUPPORTED); 3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 3859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_LEVEL, 3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_INVALID_LEVEL); 3879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 3889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_SUCCESS); 3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_fssize 3959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * File system size information, for the volume and for the user 3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * initiating the request. 3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 3999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If there's no quota entry for the user initiating the request, 4009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * caller_units and caller_avail are the total and available units 4019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * for the volume (volume_units, volume_avail). 4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If there is a quota entry for the user initiating the request, 4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and it is not SMB_QUOTA_UNLIMITED, calculate caller_units and 4049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * caller_avail as follows: 4059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * caller_units = quota limit / bytes_per_unit 4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * caller_avail = remaining quota / bytes_per_unit 4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * A quota limit of SMB_QUOTA_UNLIMITED means that the user's quota 4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * is specfied as unlimited. A quota limit of 0 means there is no 4109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * quota specified for the user. 4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: 0 - success 4139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * -1 - error. Error status set in sr. 4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_fssize(smb_request_t *sr, smb_fssize_t *fssize) 4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_node_t *node; 4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct statvfs64 df; 4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uid_t uid; 4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_t quota; 4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc, bytes_per_unit; 4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(fssize, sizeof (smb_fssize_t)); 4259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States node = sr->tid_tree->t_snode; 4269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((rc = smb_fsop_statfs(sr->user_cr, node, &df)) != 0) { 4279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_errno(sr, rc); 4289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 4299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_bytes_per_sector = 512; 4329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_sectors_per_unit = df.f_frsize >> 9; 4339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (df.f_bavail > df.f_blocks) 4349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States df.f_bavail = 0; 4359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_volume_units = df.f_blocks; 4379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_volume_avail = df.f_bavail; 4389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_caller_units = df.f_blocks; 4399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_caller_avail = df.f_bavail; 4409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bytes_per_unit = 4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_bytes_per_sector * fssize->fs_sectors_per_unit; 4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) 4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0); 4459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uid = crgetuid(sr->uid_user->u_cred); 4479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_quota_query_user_quota(sr, uid, "a) != NT_STATUS_SUCCESS) 4489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0); 4499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((quota.q_limit != SMB_QUOTA_UNLIMITED) && (quota.q_limit != 0)) { 4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_caller_units = quota.q_limit / bytes_per_unit; 4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (quota.q_limit <= quota.q_used) 4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_caller_avail = 0; 4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fssize->fs_caller_avail = 4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (quota.q_limit - quota.q_used) / bytes_per_unit; 4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0); 4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 4639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_com_trans2_set_fs_information 4649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This transaction sets filesystem information. 4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The following information levels are supported: 4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * InformationLevel Value 4699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================================== ====== 4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_FILE_FS_CONTROL_INFORMATION 1006 4719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 4729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t 4739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_com_trans2_set_fs_information(smb_request_t *sr, smb_xa_t *xa) 4749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 4759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tree_t *tree; 4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint16_t infolev; 4779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tree = sr->tid_tree; 4799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!STYPE_ISDSK(tree->t_res_type)) { 4809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_ACCESS_DENIED, 4819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_ACCESS_DENIED); 4829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_mbc_decodef(&xa->req_param_mb, "ww", 4869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &sr->smb_fid, &infolev) != 0) 4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 4889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (infolev) { 4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_CONTROL_INFORMATION: 4919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_trans2_set_fs_ctrl_info(sr, xa) != 0) 4929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 4939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 4949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_VOLUME_INFORMATION: 4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_LABEL_INFORMATION: 4979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_SIZE_INFORMATION: 4989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_DEVICE_INFORMATION: 4999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_ATTRIBUTE_INFORMATION: 5009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_FULLSIZE_INFORMATION: 5019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_OBJECTID_INFORMATION: 5029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_FILE_FS_DRIVERPATH_INFORMATION: 5039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, 5049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_NOT_SUPPORTED); 5059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 5069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 5089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_LEVEL, 5099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_INVALID_LEVEL); 5109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 5119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_SUCCESS); 5149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 5179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_trans2_set_fs_ctrl_info 5189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 5199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Only users with Admin privileges (i.e. of the BUILTIN/Administrators 5209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * group) will be allowed to set quotas. 5219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Currently QUOTAS are always ENFORCED and the default values 5239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * are always SMB_QUOTA_UNLIMITED (none). Any attempt to set 5249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * values other than these will result in NT_STATUS_NOT_SUPPORTED. 5259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 5269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 5279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_trans2_set_fs_ctrl_info(smb_request_t *sr, smb_xa_t *xa) 5289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 5299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 5309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t fstart, fthresh, fstop, qthresh, qlimit; 5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t qctrl, qpad; 5329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) { 5349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, 5359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_NOT_SUPPORTED); 5369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 5379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_user_is_admin(sr->uid_user)) { 5409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_ACCESS_DENIED, 5419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_ACCESS_DENIED); 5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_mbc_decodef(&xa->req_data_mb, "qqqqqll", &fstart, 5469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &fthresh, &fstop, &qthresh, &qlimit, &qctrl, &qpad); 5479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((rc != 0) || (fstart != 0) || (fthresh != 0) || (fstop != 0)) { 5499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 5509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_INVALID_PARAMETER); 5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* Only support ENFORCED quotas with UNLIMITED default */ 5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((qctrl != FILE_VC_QUOTA_ENFORCE) || 5569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (qlimit != SMB_QUOTA_UNLIMITED) || 5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (qthresh != SMB_QUOTA_UNLIMITED)) { 5589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, 5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_NOT_SUPPORTED); 5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0); 5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 565