smbXcli: add the possiblilty to negotiate client capabilites in smb >= 2.2
authorMichael Adam <obnox@samba.org>
Wed, 29 Feb 2012 01:02:29 +0000 (02:02 +0100)
committerMichael Adam <obnox@samba.org>
Sat, 3 Mar 2012 16:03:07 +0000 (17:03 +0100)
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>

libcli/smb/smbXcli_base.c
libcli/smb/smbXcli_base.h
source3/libsmb/clientgen.c
source4/libcli/raw/clitransport.c
source4/libcli/smb2/transport.c

index bdb6e48030894bded07d5f43e5047e0a5cac285b..b54d7e45ea1d2b64207ea44674c0828e364308e5 100644 (file)
@@ -102,6 +102,7 @@ struct smbXcli_conn {
 
        struct {
                struct {
+                       uint32_t capabilities;
                        uint16_t security_mode;
                        struct GUID guid;
                } client;
@@ -225,7 +226,8 @@ struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx,
                                         const char *remote_name,
                                         enum smb_signing_setting signing_state,
                                         uint32_t smb1_capabilities,
-                                        struct GUID *client_guid)
+                                        struct GUID *client_guid,
+                                        uint32_t smb2_capabilities)
 {
        struct smbXcli_conn *conn = NULL;
        void *ss = NULL;
@@ -319,6 +321,7 @@ struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx,
        if (client_guid) {
                conn->smb2.client.guid = *client_guid;
        }
+       conn->smb2.client.capabilities = smb2_capabilities;
 
        conn->smb2.cur_credits = 1;
        conn->smb2.max_credits = 0;
@@ -3796,7 +3799,11 @@ static struct tevent_req *smbXcli_negprot_smb2_subreq(struct smbXcli_negprot_sta
        SSVAL(buf, 2, dialect_count);
        SSVAL(buf, 4, state->conn->smb2.client.security_mode);
        SSVAL(buf, 6, 0);       /* Reserved */
-       SSVAL(buf, 8, 0);       /* Capabilities */
+       if (state->max_protocol >= PROTOCOL_SMB2_22) {
+               SIVAL(buf, 8, state->conn->smb2.client.capabilities);
+       } else {
+               SIVAL(buf, 8, 0);       /* Capabilities */
+       }
        if (state->max_protocol >= PROTOCOL_SMB2_10) {
                NTSTATUS status;
                DATA_BLOB blob;
index 27f3425cadf43a65a9d4d8ff02f1a08ddd7d9df6..dafd83639b10d09f08c881c7a6e2fe83878d1c2d 100644 (file)
@@ -31,7 +31,8 @@ struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx,
                                         const char *remote_name,
                                         enum smb_signing_setting signing_state,
                                         uint32_t smb1_capabilities,
-                                        struct GUID *client_guid);
+                                        struct GUID *client_guid,
+                                        uint32_t smb2_capabilities);
 
 bool smbXcli_conn_is_connected(struct smbXcli_conn *conn);
 void smbXcli_conn_disconnect(struct smbXcli_conn *conn, NTSTATUS status);
index 29a26d2f76c5a33b456731e7e4e67a4a0deffd55..481d9f729b4daa8a705804e7e12f0f7e7221f197 100644 (file)
@@ -260,7 +260,8 @@ struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx,
        cli->conn = smbXcli_conn_create(cli, fd, remote_name,
                                        signing_state,
                                        smb1_capabilities,
-                                       NULL); /* client_guid */
+                                       NULL, /* client_guid */
+                                       0 /* smb1_capabilites */);
        if (cli->conn == NULL) {
                goto error;
        }
index a9ff8f33c57225452f412bf7baf2023a18c1ce17..f9759b1b7f50a98ebcfb0b6c86abaa88757d0110 100644 (file)
@@ -90,7 +90,8 @@ struct smbcli_transport *smbcli_transport_init(struct smbcli_socket *sock,
                                              sock->hostname,
                                              options->signing,
                                              smb1_capabilities,
-                                             NULL); /* client_guid */
+                                             NULL, /* client_guid */
+                                             0); /* smb2_capabilities */
        if (transport->conn == NULL) {
                TALLOC_FREE(sock);
                TALLOC_FREE(transport);
index 14d1fc541e837322f348ec85e04ee5fbe6191f93..d3e17025c0c7f06bd398bab3135b8059fdcac234 100644 (file)
@@ -67,7 +67,8 @@ struct smb2_transport *smb2_transport_init(struct smbcli_socket *sock,
                                              sock->hostname,
                                              options->signing,
                                              0, /* smb1_capabilities */
-                                             &client_guid);
+                                             &client_guid,
+                                             0 /* smb2_capabilities */);
        if (transport->conn == NULL) {
                talloc_free(transport);
                return NULL;