The branch, master has been updated via a782148 README.Coding: Add clang-format style file via 533b121 README.Coding: Add rule about function declaration indentation via 1b5dd78 README.Coding: Remove an extra space via 1dacc09 smbcquotas: add -m option via f596bbf cliquota: support setting file system quota via SMB2 via d82f0e9 cliquota: factor out building of FILE_FS_CONTROL_INFORMATION via fba19ad cliquota: support setting user quota via SMB2 via 5e9b1f7 cliquota: factor out building of FILE_QUOTA_INFORMATION via a1d9090 cliquota: support getting fs quota by SMB2 via 0ed8b49 cliquota: factor out fs quota parsing via e0e5002 cliquota: implement quota listing in SMB2 via debc97e cliquota: factor out parsing of a quota record buffer via 72c773c cliquota: some security hardening via 621d7b4 cliquota: refactor and cleanup listing of user quotas via b6375ce s3-libsmb: support getting user's quota in SMB2 via 7f08a3b s3-libsmb: make parse_user_quota_record() public via 2e7e5df s3-libsmb: Support getting fs attributes via SMB2 via 175bc6f smbd: free talloc context if no quota records are available via dad6c2d cliquota: fix param count when setting fs quota via dd8a057 ntquotas: support "freeing" an empty quota list via 610c26d smbcquotas: fix error message listing quotas via 5a947d6 s3-cliquota: correctly handle no-more-entries from 7c786f8 s3/winbindd: using default domain with u...@domain.com format fails
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit a7821482ecb2535bf93d07283b7a0392298d19d2 Author: Uri Simchoni <u...@samba.org> Date: Sun Oct 2 20:41:45 2016 +0300 README.Coding: Add clang-format style file Add how the coding style is represented in clang-format directives. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Tue Oct 4 05:43:18 CEST 2016 on sn-devel-144 commit 533b1210ea8e86bf90d55c01560b82f1741ca78d Author: Uri Simchoni <u...@samba.org> Date: Sun Oct 2 20:40:06 2016 +0300 README.Coding: Add rule about function declaration indentation Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 1b5dd78c7b43ce6d6c409cbf8b0402ee254eb950 Author: Uri Simchoni <u...@samba.org> Date: Sun Oct 2 20:37:37 2016 +0300 README.Coding: Remove an extra space Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 1dacc09b256e942776967a5bfecd2fdf77ea972b Author: Uri Simchoni <u...@samba.org> Date: Tue Sep 20 18:51:00 2016 +0300 smbcquotas: add -m option Add the "standard" -m command line option that controls max client protocol. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit f596bbff3046a38aa9cd9ce77072ba3542dfc403 Author: Uri Simchoni <u...@samba.org> Date: Thu Sep 22 01:03:41 2016 +0300 cliquota: support setting file system quota via SMB2 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d82f0e99b0d3e1685e35c377c2f6e8f138d8973f Author: Uri Simchoni <u...@samba.org> Date: Wed Sep 21 23:58:33 2016 +0300 cliquota: factor out building of FILE_FS_CONTROL_INFORMATION add a service routine that builds FILE_FS_CONTROL_INFORMATION with default quota and flags. This will be reused by SMB2 and by server code. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit fba19ad9dc6b776d068344f592aa0e06c0747d7d Author: Uri Simchoni <u...@samba.org> Date: Wed Sep 21 19:35:39 2016 +0300 cliquota: support setting user quota via SMB2 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 5e9b1f77add716168283b3557d0ddc0cf175b6d7 Author: Uri Simchoni <u...@samba.org> Date: Wed Sep 21 18:37:40 2016 +0300 cliquota: factor out building of FILE_QUOTA_INFORMATION Add a function to build a FILE_QUOTA_INFORMATION buffer out of a quota list, and a function that adds a record to a quota list. Some parameters of the new functions are unused by client code, but will be used by server code. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit a1d9090e3c00283beb3ecf599a2b29a8fc08dfbf Author: Uri Simchoni <u...@samba.org> Date: Tue Sep 20 06:46:28 2016 +0300 cliquota: support getting fs quota by SMB2 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 0ed8b49fafb73f9ebe1188af194f522ccf848f6c Author: Uri Simchoni <u...@samba.org> Date: Tue Sep 20 06:45:03 2016 +0300 cliquota: factor out fs quota parsing This code will be reused by SMB2 code. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit e0e500258a2e9c92fa371f018e97c452c9bf8c83 Author: Uri Simchoni <u...@samba.org> Date: Mon Sep 19 22:17:10 2016 +0300 cliquota: implement quota listing in SMB2 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit debc97ef8e4e432764bada162e866791c898b419 Author: Uri Simchoni <u...@samba.org> Date: Mon Sep 19 21:14:01 2016 +0300 cliquota: factor out parsing of a quota record buffer In preparation for SMB2 support, take parsing of the return buffer into a separate function. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 72c773c9c29d5971d3e8403a11937323997fa0b0 Author: Uri Simchoni <u...@samba.org> Date: Mon Sep 19 18:24:58 2016 +0300 cliquota: some security hardening Add some checks for validity of the offset in the return buffer. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 621d7b41d9e58aeaaae98a22ef453c01a66a082d Author: Uri Simchoni <u...@samba.org> Date: Sun Sep 18 11:13:16 2016 +0300 cliquota: refactor and cleanup listing of user quotas Split cli_list_user_quota into an outer loop function and an inner loop function. This simplifies the code somewhat, paves the way for SMB2 support, and fixes a couple of memory leaks in error conditions. No functional changes. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b6375ce54934ea61eda0af03e354f08b6ec9494e Author: Uri Simchoni <u...@samba.org> Date: Mon Sep 12 22:38:15 2016 +0300 s3-libsmb: support getting user's quota in SMB2 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7f08a3b0313d26e991e2a04437aa25979f97fb93 Author: Uri Simchoni <u...@samba.org> Date: Mon Sep 12 22:33:12 2016 +0300 s3-libsmb: make parse_user_quota_record() public For reuse by SMB2 client code. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2e7e5dfbc660045d5dd964e78d771cdf80e8f9f5 Author: Uri Simchoni <u...@samba.org> Date: Tue Sep 20 14:32:06 2016 +0300 s3-libsmb: Support getting fs attributes via SMB2 Add a wrapper function arounf GET_INFO to obtain file system attributes, and plumb it in. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 175bc6f1e3442f5cb2258aaadf318ebf23c5d769 Author: Uri Simchoni <u...@samba.org> Date: Sun Sep 18 11:05:23 2016 +0300 smbd: free talloc context if no quota records are available When generating a list of user quota records, free the memory context that controls this list if the list is empty. Otherwise, the context remains unreferenced and memory is leaked. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12289 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit dad6c2d5631ab9879dd4cd35231b2e8c8a9e8311 Author: Uri Simchoni <u...@samba.org> Date: Thu Sep 22 16:06:12 2016 +0300 cliquota: fix param count when setting fs quota BUG: https://bugzilla.samba.org/show_bug.cgi?id=12288 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit dd8a0578d8c9f562a4f13a90f4fe51f66058dd02 Author: Uri Simchoni <u...@samba.org> Date: Sun Sep 18 11:09:54 2016 +0300 ntquotas: support "freeing" an empty quota list This avoids dereferencing a null pointer if there's an attempt to free an empty list. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12307 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 610c26d74c1314142981e5cc31a0706a4a99766f Author: Uri Simchoni <u...@samba.org> Date: Fri Sep 16 22:01:46 2016 +0300 smbcquotas: fix error message listing quotas BUG: https://bugzilla.samba.org/show_bug.cgi?id=12270 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 5a947d6ca1928e4e4bd4caf2b86698b86d378a81 Author: Uri Simchoni <u...@samba.org> Date: Fri Sep 16 21:57:50 2016 +0300 s3-cliquota: correctly handle no-more-entries When listing quota records, a Windows server would return STATUS_SUCCESS until no more entries are available, where it would return STATUS_NO_MORE_ENTRIES. The fix keeps old behavior of empty answer also signifying end of record, to maintain compatibility with Samba servers. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12270 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: README.Coding | 18 +- docs-xml/manpages/smbcquotas.1.xml | 12 + source3/libsmb/cli_smb2_fnum.c | 382 +++++++++++++++++++++++++++ source3/libsmb/cli_smb2_fnum.h | 18 ++ source3/libsmb/clifsinfo.c | 4 + source3/libsmb/cliquota.c | 514 +++++++++++++++++++++++++------------ source3/libsmb/proto.h | 28 +- source3/smbd/ntquotas.c | 6 +- source3/utils/smbcquotas.c | 28 +- 9 files changed, 840 insertions(+), 170 deletions(-) Changeset truncated at 500 lines: diff --git a/README.Coding b/README.Coding index 2b011a6..19a363f 100644 --- a/README.Coding +++ b/README.Coding @@ -90,6 +90,16 @@ displaying trailing whitespace: set textwidth=80 autocmd BufNewFile,BufRead *.c,*.h exec 'match Todo /\%>' . &textwidth . 'v.\+/' +clang-format +------------ +BasedOnStyle: LLVM +IndentWidth: 8 +UseTab: true +BreakBeforeBraces: Linux +AllowShortIfStatementsOnASingleLine: false +IndentCaseLabels: false +BinPackParameters: false + ========================= FAQ & Statement Reference @@ -189,7 +199,13 @@ characters or less with whitespace. For example, The previous example is intended to illustrate alignment of function parameters across lines and not as encourage for gratuitous line splitting. Never split a line before columns 70 - 79 unless you -have a really good reason. Be smart about formatting. +have a really good reason. Be smart about formatting. + +One exception to the previous rule is function declarations and +definitions. In function declarations and definitions, either the +declaration is a one-liner, or each parameter is listed on its own +line. The rationale is that if there are many parameters, each one +should be on its own line to make tracking interface changes easier. If, switch, & Code blocks diff --git a/docs-xml/manpages/smbcquotas.1.xml b/docs-xml/manpages/smbcquotas.1.xml index bbdb9fd..bff24a4 100644 --- a/docs-xml/manpages/smbcquotas.1.xml +++ b/docs-xml/manpages/smbcquotas.1.xml @@ -34,6 +34,7 @@ <arg choice="opt">-V</arg> <arg choice="opt">-U username</arg> + <arg choice="opt">-m|--max-protocol LEVEL</arg> <arg choice="opt">-N</arg> <arg choice="opt">-k</arg> <arg choice="opt">-A</arg> @@ -96,6 +97,17 @@ </varlistentry> <varlistentry> + <term>-m|--max-protocol PROTOCOL_NAME</term> + <listitem><para>This allows the user to select the + highest SMB protocol level that smbcquotas will use to + connect to the server. By default this is set to + NT1, which is the highest available SMB1 protocol. + To connect using SMB2 or SMB3 protocol, use the + strings SMB2 or SMB3 respectively. + </para></listitem> + </varlistentry> + + <varlistentry> <term>-t|--test-args</term> <listitem><para> Don't actually do anything, only validate the correctness of the arguments. diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index ac72090..cf00f60 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -37,6 +37,7 @@ #include "libsmb/proto.h" #include "lib/util/tevent_ntstatus.h" #include "../libcli/security/security.h" +#include "../librpc/gen_ndr/ndr_security.h" #include "lib/util_ea.h" #include "librpc/gen_ndr/ndr_ioctl.h" #include "ntioctl.h" @@ -1756,6 +1757,83 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli, const char *path, } /*************************************************************** + Wrapper that allows SMB2 to query file system attributes. + Synchronous only. +***************************************************************/ + +NTSTATUS cli_smb2_get_fs_attr_info(struct cli_state *cli, uint32_t *fs_attr) +{ + NTSTATUS status; + uint16_t fnum = 0xffff; + DATA_BLOB outbuf = data_blob_null; + struct smb2_hnd *ph = NULL; + TALLOC_CTX *frame = talloc_stackframe(); + + if (smbXcli_conn_has_async_calls(cli->conn)) { + /* + * Can't use sync call while an async call is in flight + */ + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + + /* First open the top level directory. */ + status = + cli_smb2_create_fnum(cli, "", 0, /* create_flags */ + FILE_READ_ATTRIBUTES, /* desired_access */ + FILE_ATTRIBUTE_DIRECTORY, /* file attributes */ + FILE_SHARE_READ | FILE_SHARE_WRITE | + FILE_SHARE_DELETE, /* share_access */ + FILE_OPEN, /* create_disposition */ + FILE_DIRECTORY_FILE, /* create_options */ + &fnum, + NULL); + + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } + + status = map_fnum_to_smb2_handle(cli, fnum, &ph); + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } + + status = smb2cli_query_info(cli->conn, cli->timeout, cli->smb2.session, + cli->smb2.tcon, 2, /* in_info_type */ + 5, /* in_file_info_class */ + 0xFFFF, /* in_max_output_length */ + NULL, /* in_input_buffer */ + 0, /* in_additional_info */ + 0, /* in_flags */ + ph->fid_persistent, ph->fid_volatile, frame, + &outbuf); + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } + + if (outbuf.length < 12) { + status = NT_STATUS_INVALID_NETWORK_RESPONSE; + goto fail; + } + + *fs_attr = IVAL(outbuf.data, 0); + +fail: + + if (fnum != 0xffff) { + cli_smb2_close_fnum(cli, fnum); + } + + TALLOC_FREE(frame); + return status; +} + +/*************************************************************** Wrapper that allows SMB2 to query a security descriptor. Synchronous only. ***************************************************************/ @@ -2270,6 +2348,310 @@ NTSTATUS cli_smb2_get_ea_list_path(struct cli_state *cli, return status; } +/*************************************************************** + Wrapper that allows SMB2 to get user quota. + Synchronous only. +***************************************************************/ + +NTSTATUS cli_smb2_get_user_quota(struct cli_state *cli, + int quota_fnum, + SMB_NTQUOTA_STRUCT *pqt) +{ + NTSTATUS status; + DATA_BLOB inbuf = data_blob_null; + DATA_BLOB outbuf = data_blob_null; + struct smb2_hnd *ph = NULL; + TALLOC_CTX *frame = talloc_stackframe(); + unsigned sid_len; + unsigned int offset; + uint8_t *buf; + + if (smbXcli_conn_has_async_calls(cli->conn)) { + /* + * Can't use sync call while an async call is in flight + */ + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + + status = map_fnum_to_smb2_handle(cli, quota_fnum, &ph); + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } + + sid_len = ndr_size_dom_sid(&pqt->sid, 0); + + inbuf = data_blob_talloc_zero(frame, 24 + sid_len); + if (inbuf.data == NULL) { + status = NT_STATUS_NO_MEMORY; + goto fail; + } + + buf = inbuf.data; + + SCVAL(buf, 0, 1); /* ReturnSingle */ + SCVAL(buf, 1, 0); /* RestartScan */ + SSVAL(buf, 2, 0); /* Reserved */ + if (8 + sid_len < 8) { + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + SIVAL(buf, 4, 8 + sid_len); /* SidListLength */ + SIVAL(buf, 8, 0); /* StartSidLength */ + SIVAL(buf, 12, 0); /* StartSidOffset */ + SIVAL(buf, 16, 0); /* NextEntryOffset */ + SIVAL(buf, 20, sid_len); /* SidLength */ + sid_linearize(buf + 24, sid_len, &pqt->sid); + + status = smb2cli_query_info(cli->conn, cli->timeout, cli->smb2.session, + cli->smb2.tcon, 4, /* in_info_type */ + 0, /* in_file_info_class */ + 0xFFFF, /* in_max_output_length */ + &inbuf, /* in_input_buffer */ + 0, /* in_additional_info */ + 0, /* in_flags */ + ph->fid_persistent, ph->fid_volatile, frame, + &outbuf); + + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } + + if (!parse_user_quota_record(outbuf.data, outbuf.length, &offset, + pqt)) { + status = NT_STATUS_INVALID_NETWORK_RESPONSE; + DEBUG(0, ("Got invalid FILE_QUOTA_INFORMATION in reply.\n")); + } + +fail: + TALLOC_FREE(frame); + return status; +} + +/*************************************************************** + Wrapper that allows SMB2 to list user quota. + Synchronous only. +***************************************************************/ + +NTSTATUS cli_smb2_list_user_quota_step(struct cli_state *cli, + TALLOC_CTX *mem_ctx, + int quota_fnum, + SMB_NTQUOTA_LIST **pqt_list, + bool first) +{ + NTSTATUS status; + DATA_BLOB inbuf = data_blob_null; + DATA_BLOB outbuf = data_blob_null; + struct smb2_hnd *ph = NULL; + TALLOC_CTX *frame = talloc_stackframe(); + uint8_t *buf; + + if (smbXcli_conn_has_async_calls(cli->conn)) { + /* + * Can't use sync call while an async call is in flight + */ + status = NT_STATUS_INVALID_PARAMETER; + goto cleanup; + } + + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + status = NT_STATUS_INVALID_PARAMETER; + goto cleanup; + } + + status = map_fnum_to_smb2_handle(cli, quota_fnum, &ph); + if (!NT_STATUS_IS_OK(status)) { + goto cleanup; + } + + inbuf = data_blob_talloc_zero(frame, 16); + if (inbuf.data == NULL) { + status = NT_STATUS_NO_MEMORY; + goto cleanup; + } + + buf = inbuf.data; + + SCVAL(buf, 0, 0); /* ReturnSingle */ + SCVAL(buf, 1, first ? 1 : 0); /* RestartScan */ + SSVAL(buf, 2, 0); /* Reserved */ + SIVAL(buf, 4, 0); /* SidListLength */ + SIVAL(buf, 8, 0); /* StartSidLength */ + SIVAL(buf, 12, 0); /* StartSidOffset */ + + status = smb2cli_query_info(cli->conn, cli->timeout, cli->smb2.session, + cli->smb2.tcon, 4, /* in_info_type */ + 0, /* in_file_info_class */ + 0xFFFF, /* in_max_output_length */ + &inbuf, /* in_input_buffer */ + 0, /* in_additional_info */ + 0, /* in_flags */ + ph->fid_persistent, ph->fid_volatile, frame, + &outbuf); + + if (!NT_STATUS_IS_OK(status)) { + goto cleanup; + } + + status = parse_user_quota_list(outbuf.data, outbuf.length, mem_ctx, + pqt_list); + +cleanup: + TALLOC_FREE(frame); + return status; +} + +/*************************************************************** + Wrapper that allows SMB2 to get file system quota. + Synchronous only. +***************************************************************/ + +NTSTATUS cli_smb2_get_fs_quota_info(struct cli_state *cli, + int quota_fnum, + SMB_NTQUOTA_STRUCT *pqt) +{ + NTSTATUS status; + DATA_BLOB outbuf = data_blob_null; + struct smb2_hnd *ph = NULL; + TALLOC_CTX *frame = talloc_stackframe(); + + if (smbXcli_conn_has_async_calls(cli->conn)) { + /* + * Can't use sync call while an async call is in flight + */ + status = NT_STATUS_INVALID_PARAMETER; + goto cleanup; + } + + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + status = NT_STATUS_INVALID_PARAMETER; + goto cleanup; + } + + status = map_fnum_to_smb2_handle(cli, quota_fnum, &ph); + if (!NT_STATUS_IS_OK(status)) { + goto cleanup; + } + + status = smb2cli_query_info( + cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tcon, + 2, /* in_info_type */ + SMB_FS_QUOTA_INFORMATION - 1000, /* in_file_info_class */ + 0xFFFF, /* in_max_output_length */ + NULL, /* in_input_buffer */ + 0, /* in_additional_info */ + 0, /* in_flags */ + ph->fid_persistent, ph->fid_volatile, frame, &outbuf); + + if (!NT_STATUS_IS_OK(status)) { + goto cleanup; + } + + status = parse_fs_quota_buffer(outbuf.data, outbuf.length, pqt); + +cleanup: + TALLOC_FREE(frame); + return status; +} + +/*************************************************************** + Wrapper that allows SMB2 to set user quota. + Synchronous only. +***************************************************************/ + +NTSTATUS cli_smb2_set_user_quota(struct cli_state *cli, + int quota_fnum, + SMB_NTQUOTA_LIST *qtl) +{ + NTSTATUS status; + DATA_BLOB inbuf = data_blob_null; + struct smb2_hnd *ph = NULL; + TALLOC_CTX *frame = talloc_stackframe(); + + if (smbXcli_conn_has_async_calls(cli->conn)) { + /* + * Can't use sync call while an async call is in flight + */ + status = NT_STATUS_INVALID_PARAMETER; + goto cleanup; + } + + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + status = NT_STATUS_INVALID_PARAMETER; + goto cleanup; + } + + status = map_fnum_to_smb2_handle(cli, quota_fnum, &ph); + if (!NT_STATUS_IS_OK(status)) { + goto cleanup; + } + + status = build_user_quota_buffer(qtl, 0, talloc_tos(), &inbuf, NULL); + if (!NT_STATUS_IS_OK(status)) { + goto cleanup; + } + + status = smb2cli_set_info(cli->conn, cli->timeout, cli->smb2.session, + cli->smb2.tcon, 4, /* in_info_type */ + 0, /* in_file_info_class */ + &inbuf, /* in_input_buffer */ + 0, /* in_additional_info */ + ph->fid_persistent, ph->fid_volatile); +cleanup: + TALLOC_FREE(frame); + + return status; +} + +NTSTATUS cli_smb2_set_fs_quota_info(struct cli_state *cli, + int quota_fnum, + SMB_NTQUOTA_STRUCT *pqt) +{ + NTSTATUS status; + DATA_BLOB inbuf = data_blob_null; + struct smb2_hnd *ph = NULL; + TALLOC_CTX *frame = talloc_stackframe(); + + if (smbXcli_conn_has_async_calls(cli->conn)) { + /* + * Can't use sync call while an async call is in flight + */ + status = NT_STATUS_INVALID_PARAMETER; + goto cleanup; + } + + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + status = NT_STATUS_INVALID_PARAMETER; + goto cleanup; + } + + status = map_fnum_to_smb2_handle(cli, quota_fnum, &ph); + if (!NT_STATUS_IS_OK(status)) { + goto cleanup; + } + + status = build_fs_quota_buffer(talloc_tos(), pqt, &inbuf, 0); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + status = smb2cli_set_info( + cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tcon, + 2, /* in_info_type */ + SMB_FS_QUOTA_INFORMATION - 1000, /* in_file_info_class */ + &inbuf, /* in_input_buffer */ + 0, /* in_additional_info */ + ph->fid_persistent, ph->fid_volatile); +cleanup: + TALLOC_FREE(frame); + return status; +} + struct cli_smb2_read_state { struct tevent_context *ev; struct cli_state *cli; diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h index 0436c68..3289f7e 100644 --- a/source3/libsmb/cli_smb2_fnum.h +++ b/source3/libsmb/cli_smb2_fnum.h @@ -121,6 +121,7 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli, uint64_t *bsize, uint64_t *total, uint64_t *avail); +NTSTATUS cli_smb2_get_fs_attr_info(struct cli_state *cli, uint32_t *fs_attr); NTSTATUS cli_smb2_query_security_descriptor(struct cli_state *cli, uint16_t fnum, uint32_t sec_info, @@ -148,6 +149,23 @@ NTSTATUS cli_smb2_set_ea_path(struct cli_state *cli, const char *ea_name, const char *ea_val, size_t ea_len); +NTSTATUS cli_smb2_get_user_quota(struct cli_state *cli, + int quota_fnum, + SMB_NTQUOTA_STRUCT *pqt); +NTSTATUS cli_smb2_list_user_quota_step(struct cli_state *cli, + TALLOC_CTX *mem_ctx, + int quota_fnum, + SMB_NTQUOTA_LIST **pqt_list, + bool first); +NTSTATUS cli_smb2_get_fs_quota_info(struct cli_state *cli, + int quota_fnum, + SMB_NTQUOTA_STRUCT *pqt); -- Samba Shared Repository