summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/include/client.h1
-rw-r--r--source3/libsmb/clientgen.c11
-rw-r--r--source3/libsmb/clifile.c6
-rw-r--r--source3/libsmb/clilist.c6
-rw-r--r--source3/libsmb/proto.h1
5 files changed, 21 insertions, 4 deletions
diff --git a/source3/include/client.h b/source3/include/client.h
index 0fc9f43e62..18bf26eed3 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -75,6 +75,7 @@ struct cli_state {
/* What the client requested. */
uint32_t requested_posix_capabilities;
bool dfsroot;
+ bool backup_intent;
/* the session key for this CLI, outside
any per-pipe authenticaion */
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index fbce64f200..29a26d2f76 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -53,6 +53,17 @@ unsigned int cli_set_timeout(struct cli_state *cli, unsigned int timeout)
}
/****************************************************************************
+ Set the 'backup_intent' flag.
+****************************************************************************/
+
+bool cli_set_backup_intent(struct cli_state *cli, bool flag)
+{
+ bool old_state = cli->backup_intent;
+ cli->backup_intent = flag;
+ return old_state;
+}
+
+/****************************************************************************
convenience routine to find if we negotiated ucs2
****************************************************************************/
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index b418049d32..ec8395626b 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -1813,7 +1813,8 @@ struct tevent_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
SIVAL(vwv+13, 1, FileAttributes);
SIVAL(vwv+15, 1, ShareAccess);
SIVAL(vwv+17, 1, CreateDisposition);
- SIVAL(vwv+19, 1, CreateOptions);
+ SIVAL(vwv+19, 1, CreateOptions |
+ (cli->backup_intent ? FILE_OPEN_FOR_BACKUP_INTENT : 0));
SIVAL(vwv+21, 1, 0x02); /* ImpersonationLevel */
SCVAL(vwv+23, 1, SecurityFlags);
@@ -2002,7 +2003,8 @@ struct tevent_req *cli_nttrans_create_send(TALLOC_CTX *mem_ctx,
SIVAL(param, 20, FileAttributes);
SIVAL(param, 24, ShareAccess);
SIVAL(param, 28, CreateDisposition);
- SIVAL(param, 32, CreateOptions);
+ SIVAL(param, 32, CreateOptions |
+ (cli->backup_intent ? FILE_OPEN_FOR_BACKUP_INTENT : 0));
SIVAL(param, 36, secdesc_len);
SIVAL(param, 40, 0); /* EA length*/
SIVAL(param, 44, converted_len);
diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c
index 5118f9f377..ce36a4b2e7 100644
--- a/source3/libsmb/clilist.c
+++ b/source3/libsmb/clilist.c
@@ -585,7 +585,8 @@ static struct tevent_req *cli_list_trans_send(TALLOC_CTX *mem_ctx,
SSVAL(state->param, 2, state->max_matches);
SSVAL(state->param, 4,
FLAG_TRANS2_FIND_REQUIRE_RESUME
- |FLAG_TRANS2_FIND_CLOSE_IF_END);
+ |FLAG_TRANS2_FIND_CLOSE_IF_END
+ |(cli->backup_intent ? FLAG_TRANS2_FIND_BACKUP_INTENT : 0));
SSVAL(state->param, 6, state->info_level);
SIVAL(state->param, 8, 0);
@@ -760,7 +761,8 @@ static void cli_list_trans_done(struct tevent_req *subreq)
* continue instead. JRA
*/
SSVAL(param, 10, (FLAG_TRANS2_FIND_REQUIRE_RESUME
- |FLAG_TRANS2_FIND_CLOSE_IF_END));
+ |FLAG_TRANS2_FIND_CLOSE_IF_END
+ |(state->cli->backup_intent ? FLAG_TRANS2_FIND_BACKUP_INTENT : 0)));
if (last_name_raw.length) {
state->param = trans2_bytes_push_bytes(state->param,
last_name_raw.data,
diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h
index e03d721ef2..182e8c8e4d 100644
--- a/source3/libsmb/proto.h
+++ b/source3/libsmb/proto.h
@@ -155,6 +155,7 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
int cli_set_message(char *buf,int num_words,int num_bytes,bool zero);
unsigned int cli_set_timeout(struct cli_state *cli, unsigned int timeout);
+bool cli_set_backup_intent(struct cli_state *cli, bool flag);
void cli_setup_packet_buf(struct cli_state *cli, char *buf);
NTSTATUS cli_set_domain(struct cli_state *cli, const char *domain);
NTSTATUS cli_set_username(struct cli_state *cli, const char *username);