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 */ 21*148c5f43SAlan Wright 229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 23*148c5f43SAlan Wright * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 25*148c5f43SAlan Wright 269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_kproto.h> 279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_fsops.h> 289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_share.h> 299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/string.h> 309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/fs/zfs.h> 319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_xdr.h> 329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_door.h> 339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_idmap.h> 349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * A user/group quota entry passed over the wire consists of: 379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - next offset (uint32_t) 389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - length of SID (uint32_t) 399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - last modified time (uint64_t) 409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - quota used (uint64_t) 419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - quota limit (uint64_t) 429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - quota threahold (uint64_t) 439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - variable length sid - max = 32 bytes 449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_QUOTA_SIZE_NO_SID is the size of the above, excluding the sid. 459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define SMB_QUOTA_SIZE_NO_SID \ 479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ((2 * sizeof (uint32_t)) + (4 * sizeof (uint64_t))) 489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define SMB_QUOTA_EST_SIZE (SMB_QUOTA_SIZE_NO_SID + SMB_EST_SID_SIZE) 499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define SMB_QUOTA_MAX_SIZE (SMB_QUOTA_SIZE_NO_SID + SMB_MAX_SID_SIZE) 509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_quota_query(smb_quota_query_t *, smb_quota_response_t *); 529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_quota_set(smb_quota_set_t *, uint32_t *); 539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t smb_quota_init_sids(smb_xa_t *, smb_quota_query_t *, 549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_t *); 559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t smb_quota_decode_sids(smb_xa_t *, list_t *); 569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smb_quota_free_sids(smb_quota_query_t *); 579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smb_quota_max_quota(smb_xa_t *, smb_quota_query_t *); 589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t smb_quota_decode_quotas(smb_xa_t *, list_t *); 599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t smb_quota_encode_quotas(smb_xa_t *, smb_quota_query_t *, 609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_response_t *, smb_ofile_t *); 619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smb_quota_free_quotas(list_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_nt_transact_query_quota 659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This method allows the client to retrieve quota information from 679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the server. The result of the call is returned to the client in the 689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Data part of the transaction response. 699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * On entry, the 'TotalParameterCount' field must be equal to 16, and the 719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * client parameter block must be encoded with the following parameters: 729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Request Description 749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ========================== ================================== 759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * WORD fid SMB file identifier of the target directory 769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * BYTE ReturnSingleEntry A boolean indicating whether to return 779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * a single entry (TRUE) or multiple entries (FALSE). 789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * BYTE RestartScan A boolean indicating whether to continue from 799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the previous request (FALSE) or restart a new 809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * sequence (TRUE). 819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DWORD SidListLength The length, in bytes, of the SidList in the 829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * data block or 0 if there is no SidList. 839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DWORD StartSidLength If SidListLength is 0 (i.e. there is no SidList 849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * in the data block), then this is either: 859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 1) the (non-zero) length in bytes of the 869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * StartSid in the parameter buffer, or 879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 2) if 0, there is no StartSid in the 889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * parameter buffer, in which case, all SIDs 899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * are to be enumerated as if they were 909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * passed in the SidList. 919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Otherwise, StartSidLength is ignored. 929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DWORD StartSidOffset The offset, in bytes, to the StartSid in the 939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * parameter block (if one exists). 949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * One of SidListLength and StartSidLength must be 0. 969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * An SMB_COM_NT_TRANSACTION response is sent in reply when the request 989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * is successful. The 'TotalParameterCount' is set to 4, and the parameter 999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * block in the server response contains a 32-bit unsigned integer 1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * indicating the length, in bytes, of the returned quota information. 1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The 'TotalDataCount' is set to indicate the length of the data buffer, 1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and the data buffer contains the following quota information: 1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Data Block Encoding Description 1059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================================== ================================= 1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ULONG NextEntryOffset; Offset to start of next entry from 1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * start of this entry, or 0 for the 1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * final entry 1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ULONG SidLength; Length (bytes) of SID 1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_TIME ChangeTime; Time that the quota was last changed 1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * LARGE_INTEGER QuotaUsed; Amount of quota (bytes) used by user 1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * LARGE_INTEGER QuotaThreshold; Quota warning limit (bytes) for user 1139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * LARGE_INTEGER QuotaLimit; The quota limit (bytes) for this user 1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * USHORT Sid; Search handle 1159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t 1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_nt_transact_query_quota(smb_request_t *sr, smb_xa_t *xa) 1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint8_t single, restart; 1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t sidlistlen, startsidlen, startsidoff; 1219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_node_t *tnode; 1229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_t *ofile; 1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_query_t request; 1249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_response_t reply; 1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = NT_STATUS_SUCCESS; 1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&request, sizeof (smb_quota_query_t)); 1289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&reply, sizeof (smb_quota_response_t)); 1299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) { 1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, 0, 0); 1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 1339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (xa->smb_tpscnt != 16) { 1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0); 1379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 1389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_mbc_decodef(&xa->req_param_mb, "%wbblll", sr, &sr->smb_fid, 1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &single, &restart, &sidlistlen, &startsidlen, &startsidoff)) { 1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0); 1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((sidlistlen != 0) && (startsidlen != 0)) { 1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0); 1489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_lookup_file(sr); 1529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ofile = sr->fid_ofile; 1539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (ofile == NULL) { 1549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRbadfid); 1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((ofile->f_node == NULL) || (ofile->f_ftype != SMB_FTYPE_DISK)) { 1599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS, 1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERROR_ACCESS_DENIED); 1619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_release_file(sr); 1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 1639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tnode = sr->tid_tree->t_snode; 1669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qq_root_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP); 1679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_node_getmntpath(tnode, request.qq_root_path, MAXPATHLEN) != 0) { 1689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, ERRDOS, 1699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERROR_INVALID_PARAMETER); 1709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_release_file(sr); 1719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(request.qq_root_path, MAXPATHLEN); 1729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 1739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sidlistlen != 0) 1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qq_query_op = SMB_QUOTA_QUERY_SIDLIST; 1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else if (startsidlen != 0) 1789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qq_query_op = SMB_QUOTA_QUERY_STARTSID; 1799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qq_query_op = SMB_QUOTA_QUERY_ALL; 1819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qq_single = single; 1839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qq_restart = restart; 1849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_max_quota(xa, &request); 1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = smb_quota_init_sids(xa, &request, ofile); 1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == NT_STATUS_SUCCESS) { 1899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_quota_query(&request, &reply) != 0) { 1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INTERNAL_ERROR; 1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = reply.qr_status; 1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == NT_STATUS_SUCCESS) { 1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = smb_quota_encode_quotas(xa, 1959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &request, &reply, ofile); 1969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_quota_response_xdr, (char *)&reply); 1989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(request.qq_root_path, MAXPATHLEN); 2029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_free_sids(&request); 2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != NT_STATUS_SUCCESS) { 205*148c5f43SAlan Wright if (status == NT_STATUS_NO_MORE_ENTRIES) { 2069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_set_quota_resume(ofile, NULL); 2079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_warn(sr, status, 0, 0); 2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_SUCCESS; 2099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, status, 0, 0); 2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_param_mb, "l", 0); 2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_release_file(sr); 2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return ((status == NT_STATUS_SUCCESS) ? SDRC_SUCCESS : SDRC_ERROR); 2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_nt_transact_set_quota 2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This method allows the client to set quota information on the server. 2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The result status of the call is returned to the client in the 2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 'status' field of the SMB response header. 2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * On entry, the 'TotalParameterCount' field must be equal to 2, and the 2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * client parameter block must be encoded with the following parameters: 2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Data Block Encoding Description 2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================================== ================================= 2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ULONG NextEntryOffset; Offset to start of next entry from 2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * start of this entry, or 0 for the 2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * final entry 2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ULONG SidLength; Length (bytes) of SID 2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_TIME ChangeTime; Time that the quota was last changed 2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * LARGE_INTEGER QuotaUsed; Amount of quota (bytes) used by user 2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * LARGE_INTEGER QuotaThreshold; Quota warning limit (bytes) for user 2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * LARGE_INTEGER QuotaLimit; The quota limit (bytes) for this user 2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * VARIABLE Sid; Security identifier of the user 2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * An SMB_COM_NT_TRANSACTION response is sent in reply when the request 2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * is successful. The 'TotalParameterCount' and the 'TotalDataCount' are set 2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * to 0, and the parameter block 'Status' field in the server SMB response 2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * header contains a 32-bit unsigned integer indicating the result status 2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * (NT_STATUS_SUCCESS if successful). 2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Only users with Admin privileges (i.e. of the BUILTIN/Administrators 2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * group) will be allowed to set quotas. 2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t 2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_nt_transact_set_quota(smb_request_t *sr, smb_xa_t *xa) 2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *root_path; 2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = NT_STATUS_SUCCESS; 2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_node_t *tnode; 2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_t *ofile; 2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_set_t request; 2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t reply; 2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_t *quota_list; 2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&request, sizeof (smb_quota_set_t)); 2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) { 2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, 0, 0); 2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_user_is_admin(sr->uid_user)) { 2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRSRV, ERRaccess); 2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (xa->smb_tpscnt != 2) { 2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0); 2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_mbc_decodef(&xa->req_param_mb, "%w", sr, 2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &sr->smb_fid)) { 2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0); 2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_lookup_file(sr); 2859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ofile = sr->fid_ofile; 2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (ofile == NULL) { 2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRbadfid); 2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((ofile->f_node == NULL) || (ofile->f_ftype != SMB_FTYPE_DISK)) { 2929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS, 2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERROR_ACCESS_DENIED); 2949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_release_file(sr); 2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 2969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tnode = sr->tid_tree->t_snode; 2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States root_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP); 3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_node_getmntpath(tnode, root_path, MAXPATHLEN) != 0) { 3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, ERRDOS, 3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ERROR_INVALID_PARAMETER); 3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_release_file(sr); 3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(root_path, MAXPATHLEN); 3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States quota_list = &request.qs_quota_list; 3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_create(quota_list, sizeof (smb_quota_t), 3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States offsetof(smb_quota_t, q_list_node)); 3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = smb_quota_decode_quotas(xa, quota_list); 3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == NT_STATUS_SUCCESS) { 3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qs_root_path = root_path; 3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_quota_set(&request, &reply) != 0) { 3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INTERNAL_ERROR; 3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = reply; 3199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(xdr_uint32_t, (char *)&reply); 3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(root_path, MAXPATHLEN); 3249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_free_quotas(&request.qs_quota_list); 3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_release_file(sr); 3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != NT_STATUS_SUCCESS) { 3289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, status, 0, 0); 3299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_param_mb, "l", 0); 3309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR); 3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_SUCCESS); 3349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 3379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_init_sids 3389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 3399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If the query is of type SMB_QUOTA_QUERY_SIDLIST or 3409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_QUOTA_QUERY_STARTSID decode the list of sids from 3419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the client request into request->qq_sid_list. 3429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Otherwise (type SMB_QUOTA_QUERY_ALL) find the resume sid 3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and insert it into request->qq_sid_list, or reset the 3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * resume sid to NULL if request->qq_restart. 3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 3469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: NT_STATUS codes 3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 3489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 3499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_init_sids(smb_xa_t *xa, smb_quota_query_t *request, 3509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_t *ofile) 3519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 3529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_sid_t *sid; 3539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_t *sid_list; 3549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = NT_STATUS_SUCCESS; 3559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid_list = &request->qq_sid_list; 3579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_create(sid_list, sizeof (smb_quota_sid_t), 3589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States offsetof(smb_quota_sid_t, qs_list_node)); 3599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (request->qq_query_op) { 3619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_QUOTA_QUERY_SIDLIST: 3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_QUOTA_QUERY_STARTSID: 3639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = smb_quota_decode_sids(xa, sid_list); 3649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 3659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_QUOTA_QUERY_ALL: 3669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (request->qq_restart) 3679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_set_quota_resume(ofile, NULL); 3689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else { 3699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid = kmem_zalloc(sizeof (smb_quota_sid_t), KM_SLEEP); 3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_tail(sid_list, sid); 3719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_get_quota_resume(ofile, sid->qs_sidstr, 3729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States SMB_SID_STRSZ); 3739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (*sid->qs_sidstr == '\0') 3749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INVALID_PARAMETER; 3759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INVALID_PARAMETER; 3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_free_sids 3879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 3889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void 3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_free_sids(smb_quota_query_t *request) 3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_t *sid_list; 3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_sid_t *sid; 3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid_list = &request->qq_sid_list; 3959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while ((sid = list_head(sid_list)) != NULL) { 3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_remove(sid_list, sid); 3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(sid, sizeof (smb_quota_sid_t)); 3999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_destroy(sid_list); 4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 4059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_decode_sids 4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Decode the SIDs from the data block and stores them in string form in list. 4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Eaxh sid entry comprises: 4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * next_offset (4 bytes) - offset of next entry 4109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * sid length (4 bytes) 4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * sid (variable length = sidlen) 4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The last entry will have a next_offset value of 0. 4139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns NT_STATUS codes. 4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_decode_sids(smb_xa_t *xa, list_t *list) 4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t offset, mb_offset, sid_offset, bytes_left; 4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t next_offset, sidlen; 4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_t *sid; 4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_sid_t *qsid; 4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = NT_STATUS_SUCCESS; 4249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct mbuf_chain sidbuf; 4259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States offset = 0; 4279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States do { 4289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mb_offset = offset + xa->req_data_mb.chain_offset; 4299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bytes_left = xa->req_data_mb.max_bytes - mb_offset; 4309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) MBC_SHADOW_CHAIN(&sidbuf, &xa->req_data_mb, 4319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mb_offset, bytes_left); 4329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_mbc_decodef(&sidbuf, "ll", &next_offset, &sidlen)) { 4349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INVALID_PARAMETER; 4359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 4369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid_offset = offset + (2 * sizeof (uint32_t)); 4399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid = smb_decode_sid(xa, sid_offset); 4409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sid == NULL) { 4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INVALID_PARAMETER; 4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States qsid = kmem_zalloc(sizeof (smb_quota_sid_t), KM_SLEEP); 4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_tostr(sid, qsid->qs_sidstr); 4479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_free(sid); 4489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid = NULL; 4499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_tail(list, qsid); 4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States offset += next_offset; 4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } while ((next_offset != 0) && (bytes_left > 0)); 4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_max_quota 4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If the query is if type SMB_QUOTA_QUERY_SIDLIST a quota entry 4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * is returned for each sid in the sidlist. request->qr_max_quota 4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * is set to 0 and is unused. 4639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Otherwise (for SMB_QUOTA_QUERY_STARTSID and SMB_QUOTA_QUERY_ALL) 4649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * max_quota is the maximum number of quota entries requested from 4659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the file system (via door call smb_quota_query()). 4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If single is set max_quota is set to 1. If single is not set 4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * max quota is calculated as the number of quotas of size 4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_QUOTA_EST_SIZE that would fit in the response buffer. 4699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void 4719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_max_quota(smb_xa_t *xa, smb_quota_query_t *request) 4729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 4739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (request->qq_query_op == SMB_QUOTA_QUERY_SIDLIST) 4749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request->qq_max_quota = 0; 4759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else if (request->qq_single) 4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request->qq_max_quota = 1; 4779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 4789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request->qq_max_quota = (xa->smb_mdrcnt / SMB_QUOTA_EST_SIZE); 4799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 4829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_decode_quotas 4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Decode the quota entries into a list_t of smb_quota_t. 4859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_QUOTA_SIZE_NO_SID is the size of a quota entry, 4869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * excluding the sid. 4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The last entry will have a next_offset value of 0. 4889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns NT_STATUS codes. 4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 4919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 4929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_decode_quotas(smb_xa_t *xa, list_t *list) 4939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 4949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t offset, mb_offset, sid_offset, bytes_left; 4959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t next_offset, sidlen; 4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t mtime; 4979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_t *sid; 4989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_t *quota; 4999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = NT_STATUS_SUCCESS; 5009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct mbuf_chain quotabuf; 5019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States offset = 0; 5039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States do { 5049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mb_offset = offset + xa->req_data_mb.chain_offset; 5059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bytes_left = xa->req_data_mb.max_bytes - mb_offset; 5069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) MBC_SHADOW_CHAIN("abuf, &xa->req_data_mb, 5079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mb_offset, bytes_left); 5089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States quota = kmem_zalloc(sizeof (smb_quota_t), KM_SLEEP); 5109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_mbc_decodef("abuf, "llqqqq", 5129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States &next_offset, &sidlen, &mtime, 5139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States "a->q_used, "a->q_thresh, "a->q_limit)) { 5149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(quota, sizeof (smb_quota_t)); 5159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INVALID_PARAMETER; 5169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 5179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid_offset = offset + SMB_QUOTA_SIZE_NO_SID; 5209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid = smb_decode_sid(xa, sid_offset); 5219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sid == NULL) { 5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(quota, sizeof (smb_quota_t)); 5239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INVALID_PARAMETER; 5249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 5259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(quota->q_sidstr, SMB_SID_STRSZ); 5289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_tostr(sid, quota->q_sidstr); 5299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_free(sid); 5309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid = NULL; 5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_tail(list, quota); 5339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States offset += next_offset; 5349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } while ((next_offset != 0) && (bytes_left > 0)); 5359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 5379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 5409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_free_quotas 5419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void 5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_free_quotas(list_t *list) 5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_t *quota; 5469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while ((quota = list_head(list)) != NULL) { 5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_remove(list, quota); 5499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(quota, sizeof (smb_quota_t)); 5509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_destroy(list); 5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 5569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_encode_quotas 5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 5589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Encode the quota entries from a list_t of smb_quota_t. 5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * SMB_QUOTA_SIZE_NO_SID is the size of a quota entry, 5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * excluding the sid. 5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The last entry will have a next_offset value of 0. 5629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Sets the last encoded SID as the resume sid. 5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 5659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_encode_quotas(smb_xa_t *xa, smb_quota_query_t *request, 5669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_response_t *reply, smb_ofile_t *ofile) 5679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 5689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t next_offset, sid_offset, total_bytes; 5699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t mtime = 0; 5709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t sidlen, pad; 5719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_t *sid; 5729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *sidstr = NULL, *resume = NULL; 5739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_t *quota, *next_quota; 5749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_t *list = &reply->qr_quota_list; 5759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 5779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = NT_STATUS_SUCCESS; 5789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States total_bytes = 0; 5809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States quota = list_head(list); 5819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (quota) { 5829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States next_quota = list_next(list, quota); 5839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sidstr = quota->q_sidstr; 5849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((sid = smb_sid_fromstr(sidstr)) == NULL) { 5859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States quota = next_quota; 5869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States continue; 5879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sidlen = smb_sid_len(sid); 5909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid_offset = SMB_QUOTA_SIZE_NO_SID; 5919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States next_offset = sid_offset + sidlen; 5929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pad = smb_pad_align(next_offset, 8); 5939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States next_offset += pad; 5949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!MBC_ROOM_FOR(&xa->rep_data_mb, next_offset)) { 5969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_free(sid); 5979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 5989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!MBC_ROOM_FOR(&xa->rep_data_mb, 6009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States next_offset + SMB_QUOTA_MAX_SIZE)) { 6019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States next_quota = NULL; 6029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_mbc_encodef(&xa->rep_data_mb, "llqqqq", 6059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States next_quota ? next_offset : 0, sidlen, mtime, 6069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States quota->q_used, quota->q_thresh, quota->q_limit); 6079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc == 0) { 6089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_encode_sid(xa, sid); 6099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_mbc_encodef(&xa->rep_data_mb, "#.", pad); 6109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_free(sid); 6139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) { 6159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INTERNAL_ERROR; 6169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 6179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States resume = sidstr; 6209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States total_bytes += next_offset; 6219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States quota = next_quota; 6229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_mbc_encodef(&xa->rep_param_mb, "l", total_bytes); 6259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status == NT_STATUS_SUCCESS) && 6279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ((request->qq_query_op == SMB_QUOTA_QUERY_STARTSID) || 6289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (request->qq_query_op == SMB_QUOTA_QUERY_ALL))) { 6299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_set_quota_resume(ofile, resume); 6309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 6339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 6369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_query_user_quota 6379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 6389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Get user quota information for a single user (uid) 6399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * for the current file system. 6409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Find the user's sid, insert it in the sidlist of a 6419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_query_t request and invoke the door call 6429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_query() to obtain the quota information. 6439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 6449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: NT_STATUS codes. 6459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 6469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 6479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_query_user_quota(smb_request_t *sr, uid_t uid, smb_quota_t *quota) 6489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 6499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_t *sid; 6509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_sid_t qsid; 6519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_query_t request; 6529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_response_t reply; 6539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_t *sid_list; 6549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_t *q; 6559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_node_t *tnode; 6569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = NT_STATUS_SUCCESS; 6579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_idmap_getsid(uid, SMB_IDMAP_USER, &sid) != IDMAP_SUCCESS) 6599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NT_STATUS_INTERNAL_ERROR); 6609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_tostr(sid, qsid.qs_sidstr); 6629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sid_free(sid); 6639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&request, sizeof (smb_quota_query_t)); 6659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&reply, sizeof (smb_quota_response_t)); 6669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tnode = sr->tid_tree->t_snode; 6689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qq_root_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP); 6699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_node_getmntpath(tnode, request.qq_root_path, MAXPATHLEN) != 0) { 6709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(request.qq_root_path, MAXPATHLEN); 6719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NT_STATUS_INTERNAL_ERROR); 6729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sid_list = &request.qq_sid_list; 6759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_create(sid_list, sizeof (smb_quota_sid_t), 6769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States offsetof(smb_quota_sid_t, qs_list_node)); 6779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_tail(sid_list, &qsid); 6789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qq_query_op = SMB_QUOTA_QUERY_SIDLIST; 6809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request.qq_single = B_TRUE; 6819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_quota_query(&request, &reply) != 0) { 6839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INTERNAL_ERROR; 6849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 6859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (reply.qr_status != NT_STATUS_SUCCESS) { 6869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = reply.qr_status; 6879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 6889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States q = list_head(&reply.qr_quota_list); 6899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((q == NULL) || 6909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (strcmp(qsid.qs_sidstr, q->q_sidstr) != 0)) { 6919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* should never happen */ 6929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = NT_STATUS_INTERNAL_ERROR; 6939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 6949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bcopy(q, quota, sizeof (smb_quota_t)); 6959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xdr_free(smb_quota_response_xdr, (char *)&reply); 6989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(request.qq_root_path, MAXPATHLEN); 7019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_remove(sid_list, &qsid); 7029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_destroy(sid_list); 7039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 7059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 7069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 7089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_query 7099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 7109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Door call to query quotas for the provided filesystem path. 7119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: -1 - door call (or encode/decode) failure. 7129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 0 - success. Status set in reply. 7139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 7149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 7159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_query(smb_quota_query_t *request, smb_quota_response_t *reply) 7169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 7179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 7189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_kdoor_upcall(SMB_DR_QUOTA_QUERY, 7209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request, smb_quota_query_xdr, reply, smb_quota_response_xdr); 7219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (rc); 7239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 7249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 7269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_quota_set 7279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 7289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Door call to set quotas for the provided filesystem path. 7299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: -1 - door call (or encode/decode) failure. 7309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 0 - success. Status set in reply. 7319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 7329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 7339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_set(smb_quota_set_t *request, uint32_t *reply) 7349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 7359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 7369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_kdoor_upcall(SMB_DR_QUOTA_SET, 7389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States request, smb_quota_set_xdr, reply, xdr_uint32_t); 7399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (rc); 7419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 742