The branch, master has been updated
       via  f8cd211 s3: smbclient: tests: Test "volume" command over SMB1 and 
SMB2+.
       via  aaa52ab s3: smbclient: Implement "volume" command over SMB2.
       via  eefc7a2 s3: libsmb: smbc_statvfs is missing the supporting SMB2 
calls.
      from  7005609 pam_winbind: initial Turkish translation

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f8cd211acc3824e01d89a6f8b6666c39aa5cd54e
Author: Jeremy Allison <[email protected]>
Date:   Tue Nov 14 15:54:19 2017 -0800

    s3: smbclient: tests: Test "volume" command over SMB1 and SMB2+.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13140
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    
    Autobuild-User(master): Andreas Schneider <[email protected]>
    Autobuild-Date(master): Wed Nov 15 19:50:54 CET 2017 on sn-devel-144

commit aaa52ab7b5ae711b80e3967ab1ecc91888c346f6
Author: Jeremy Allison <[email protected]>
Date:   Tue Nov 14 15:42:14 2017 -0800

    s3: smbclient: Implement "volume" command over SMB2.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13140
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit eefc7a27155b70d027b1193187dd435267d863ea
Author: Jeremy Allison <[email protected]>
Date:   Tue Nov 14 13:52:03 2017 -0800

    s3: libsmb: smbc_statvfs is missing the supporting SMB2 calls.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13138
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 source3/libsmb/cli_smb2_fnum.c            | 227 ++++++++++++++++++++++++++++++
 source3/libsmb/cli_smb2_fnum.h            |  11 ++
 source3/libsmb/clifsinfo.c                |  17 +++
 source3/script/tests/test_smbclient_s3.sh |  31 ++++
 4 files changed, 286 insertions(+)


Changeset truncated at 500 lines:

diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index b8179b0..628b17b 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -1993,6 +1993,103 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli, const 
char *path,
 }
 
 /***************************************************************
+ Wrapper that allows SMB2 to query file system sizes.
+ Synchronous only.
+***************************************************************/
+
+NTSTATUS cli_smb2_get_fs_full_size_info(struct cli_state *cli,
+                               uint64_t *total_allocation_units,
+                               uint64_t *caller_allocation_units,
+                               uint64_t *actual_allocation_units,
+                               uint64_t *sectors_per_allocation_unit,
+                               uint64_t *bytes_per_sector)
+{
+       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;
+       }
+
+       /* getinfo on the returned handle with info_type SMB2_GETINFO_FS (2),
+          level 7 (SMB_FS_FULL_SIZE_INFORMATION). */
+
+       status = smb2cli_query_info(cli->conn,
+                               cli->timeout,
+                               cli->smb2.session,
+                               cli->smb2.tcon,
+                               SMB2_GETINFO_FS, /* in_info_type */
+                               /* in_file_info_class */
+                               SMB_FS_FULL_SIZE_INFORMATION - 1000,
+                               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 < 32) {
+               status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+               goto fail;
+       }
+
+       *total_allocation_units = BIG_UINT(outbuf.data, 0);
+       *caller_allocation_units = BIG_UINT(outbuf.data, 8);
+       *actual_allocation_units = BIG_UINT(outbuf.data, 16);
+       *sectors_per_allocation_unit = (uint64_t)IVAL(outbuf.data, 24);
+       *bytes_per_sector = (uint64_t)IVAL(outbuf.data, 28);
+
+fail:
+
+       if (fnum != 0xffff) {
+               cli_smb2_close_fnum(cli, fnum);
+       }
+
+       cli->raw_status = status;
+
+       TALLOC_FREE(frame);
+       return status;
+}
+
+/***************************************************************
  Wrapper that allows SMB2 to query file system attributes.
  Synchronous only.
 ***************************************************************/
@@ -2072,6 +2169,136 @@ fail:
 }
 
 /***************************************************************
+ Wrapper that allows SMB2 to query file system volume info.
+ Synchronous only.
+***************************************************************/
+
+NTSTATUS cli_smb2_get_fs_volume_info(struct cli_state *cli,
+                                TALLOC_CTX *mem_ctx,
+                                char **_volume_name,
+                                uint32_t *pserial_number,
+                                time_t *pdate)
+{
+       NTSTATUS status;
+       uint16_t fnum = 0xffff;
+       DATA_BLOB outbuf = data_blob_null;
+       struct smb2_hnd *ph = NULL;
+       uint32_t nlen;
+       char *volume_name = 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;
+       }
+
+       /* getinfo on the returned handle with info_type SMB2_GETINFO_FS (2),
+          level 1 (SMB_FS_VOLUME_INFORMATION). */
+
+       status = smb2cli_query_info(cli->conn,
+                               cli->timeout,
+                               cli->smb2.session,
+                               cli->smb2.tcon,
+                               SMB2_GETINFO_FS, /* in_info_type */
+                               /* in_file_info_class */
+                               SMB_FS_VOLUME_INFORMATION - 1000,
+                               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 < 24) {
+               status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+               goto fail;
+       }
+
+       if (pdate) {
+               struct timespec ts;
+               ts = interpret_long_date((char *)outbuf.data);
+               *pdate = ts.tv_sec;
+       }
+       if (pserial_number) {
+               *pserial_number = IVAL(outbuf.data,8);
+       }
+       nlen = IVAL(outbuf.data,12);
+       if (nlen + 18 < 18) {
+               /* Integer wrap. */
+               status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+               goto fail;
+       }
+       /*
+        * The next check is safe as we know outbuf.length >= 24
+        * from above.
+        */
+       if (nlen > (outbuf.length - 18)) {
+               status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+               goto fail;
+       }
+
+       clistr_pull_talloc(mem_ctx,
+                       (const char *)outbuf.data,
+                       0,
+                       &volume_name,
+                       outbuf.data + 18,
+                       nlen,
+                       STR_UNICODE);
+       if (volume_name == NULL) {
+               status = map_nt_error_from_unix(errno);
+               goto fail;
+       }
+
+       *_volume_name = volume_name;
+
+fail:
+
+       if (fnum != 0xffff) {
+               cli_smb2_close_fnum(cli, fnum);
+       }
+
+       cli->raw_status = status;
+
+       TALLOC_FREE(frame);
+       return status;
+}
+
+
+/***************************************************************
  Wrapper that allows SMB2 to query a security descriptor.
  Synchronous only.
 ***************************************************************/
diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h
index a6c3627..3d9b6eb 100644
--- a/source3/libsmb/cli_smb2_fnum.h
+++ b/source3/libsmb/cli_smb2_fnum.h
@@ -136,6 +136,17 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli,
                        uint64_t *total,
                        uint64_t *avail);
 NTSTATUS cli_smb2_get_fs_attr_info(struct cli_state *cli, uint32_t *fs_attr);
+NTSTATUS cli_smb2_get_fs_full_size_info(struct cli_state *cli,
+                       uint64_t *total_allocation_units,
+                       uint64_t *caller_allocation_units,
+                       uint64_t *actual_allocation_units,
+                       uint64_t *sectors_per_allocation_unit,
+                       uint64_t *bytes_per_sector);
+NTSTATUS cli_smb2_get_fs_volume_info(struct cli_state *cli,
+                       TALLOC_CTX *mem_ctx,
+                       char **_volume_name,
+                       uint32_t *pserial_number,
+                       time_t *pdate);
 NTSTATUS cli_smb2_query_security_descriptor(struct cli_state *cli,
                        uint16_t fnum,
                        uint32_t sec_info,
diff --git a/source3/libsmb/clifsinfo.c b/source3/libsmb/clifsinfo.c
index 119b121..09c0d95 100644
--- a/source3/libsmb/clifsinfo.c
+++ b/source3/libsmb/clifsinfo.c
@@ -375,6 +375,14 @@ NTSTATUS cli_get_fs_volume_info(struct cli_state *cli,
        unsigned int nlen;
        char *volume_name = NULL;
 
+       if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
+               return cli_smb2_get_fs_volume_info(cli,
+                                               mem_ctx,
+                                               _volume_name,
+                                               pserial_number,
+                                               pdate);
+       }
+
        SSVAL(setup, 0, TRANSACT2_QFSINFO);
        SSVAL(param,0,SMB_QUERY_FS_VOLUME_INFO);
 
@@ -439,6 +447,15 @@ NTSTATUS cli_get_fs_full_size_info(struct cli_state *cli,
        uint32_t rdata_count;
        NTSTATUS status;
 
+       if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
+               return cli_smb2_get_fs_full_size_info(cli,
+                                               total_allocation_units,
+                                               caller_allocation_units,
+                                               actual_allocation_units,
+                                               sectors_per_allocation_unit,
+                                               bytes_per_sector);
+       }
+
        SSVAL(setup, 0, TRANSACT2_QFSINFO);
        SSVAL(param, 0, SMB_FS_FULL_SIZE_INFORMATION);
 
diff --git a/source3/script/tests/test_smbclient_s3.sh 
b/source3/script/tests/test_smbclient_s3.sh
index 4500577..d98da0d 100755
--- a/source3/script/tests/test_smbclient_s3.sh
+++ b/source3/script/tests/test_smbclient_s3.sh
@@ -1525,7 +1525,34 @@ EOF
     fi
 }
 
+# Test doing a volume command.
+test_volume()
+{
+    tmpfile=$PREFIX/smbclient_interactive_prompt_commands
+    cat > $tmpfile <<EOF
+volume
+quit
+EOF
+    cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD 
//$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
+    eval echo "$cmd"
+    out=`eval $cmd`
+    ret=$?
+    rm -f $tmpfile
 
+    if [ $ret != 0 ] ; then
+       echo "$out"
+       echo "failed doing volume command with error $ret"
+       return 1
+    fi
+
+    echo "$out" | grep '^Volume: |tmp| serial number'
+    ret=$?
+    if [ $ret != 0 ] ; then
+       echo "$out"
+       echo "failed doing volume command"
+       return 1
+    fi
+}
 
 test_server_os_message()
 {
@@ -1684,6 +1711,10 @@ testit "rename_dotdot" \
     test_rename_dotdot || \
     failed=`expr $failed + 1`
 
+testit "volume" \
+    test_volume || \
+    failed=`expr $failed + 1`
+
 testit "rm -rf $LOGDIR" \
     rm -rf $LOGDIR || \
     failed=`expr $failed + 1`


-- 
Samba Shared Repository

Reply via email to