From: Michael Adam Date: Wed, 29 Feb 2012 01:02:29 +0000 (+0100) Subject: smbXcli: add the possiblilty to negotiate client capabilites in smb >= 2.2 X-Git-Tag: samba-4.0.0alpha19~581 X-Git-Url: http://git.samba.org/?a=commitdiff_plain;h=ac43937ce4d5100a82df9d76d50d72b97daaedd3;p=samba.git smbXcli: add the possiblilty to negotiate client capabilites in smb >= 2.2 Pair-Programmed-With: Stefan Metzmacher --- diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c index bdb6e480308..b54d7e45ea1 100644 --- a/libcli/smb/smbXcli_base.c +++ b/libcli/smb/smbXcli_base.c @@ -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; diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h index 27f3425cadf..dafd83639b1 100644 --- a/libcli/smb/smbXcli_base.h +++ b/libcli/smb/smbXcli_base.h @@ -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); diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index 29a26d2f76c..481d9f729b4 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -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; } diff --git a/source4/libcli/raw/clitransport.c b/source4/libcli/raw/clitransport.c index a9ff8f33c57..f9759b1b7f5 100644 --- a/source4/libcli/raw/clitransport.c +++ b/source4/libcli/raw/clitransport.c @@ -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); diff --git a/source4/libcli/smb2/transport.c b/source4/libcli/smb2/transport.c index 14d1fc541e8..d3e17025c0c 100644 --- a/source4/libcli/smb2/transport.c +++ b/source4/libcli/smb2/transport.c @@ -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;