diff options
author | David Disseldorp <ddiss@samba.org> | 2014-02-20 19:47:45 +0100 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2014-02-21 12:02:43 +1300 |
commit | 4d9e1b68b7b636a435f55c25df9ab8f51922b36e (patch) | |
tree | 529a235fa5d054844da8b78114263a52812311d4 /source3/client/clitar.c | |
parent | 385f0c9ea05a0f37388cf549102fc13ef9e6691a (diff) | |
download | samba-4d9e1b68b7b636a435f55c25df9ab8f51922b36e.tar.gz samba-4d9e1b68b7b636a435f55c25df9ab8f51922b36e.tar.xz samba-4d9e1b68b7b636a435f55c25df9ab8f51922b36e.zip |
clitar: add error return to tar_create_skip_path()
In preparation for propagation of memory allocation errors from
tar_path_in_list() and friends.
Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'source3/client/clitar.c')
-rw-r--r-- | source3/client/clitar.c | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/source3/client/clitar.c b/source3/client/clitar.c index c8f8fec386..7340f26fdd 100644 --- a/source3/client/clitar.c +++ b/source3/client/clitar.c @@ -204,9 +204,10 @@ static void tar_dump(struct tar *t); static bool tar_extract_skip_path(struct tar *t, struct archive_entry *entry); static TALLOC_CTX *tar_reset_mem_context(struct tar *t); static void tar_free_mem_context(struct tar *t); -static bool tar_create_skip_path(struct tar *t, - const char *fullpath, - const struct file_info *finfo); +static NTSTATUS tar_create_skip_path(struct tar *t, + const char *fullpath, + const struct file_info *finfo, + bool *_skip); static bool tar_path_in_list(struct tar *t, const char *path, @@ -857,9 +858,10 @@ static NTSTATUS get_file_callback(struct cli_state *cli, const char *dir) { TALLOC_CTX *ctx = PANIC_IF_NULL(talloc_new(NULL)); - NTSTATUS err = NT_STATUS_OK; + NTSTATUS status = NT_STATUS_OK; char *remote_name; const char *initial_dir = client_get_cur_dir(); + bool skip = false; int rc; remote_name = PANIC_IF_NULL(talloc_asprintf(ctx, "%s%s", @@ -869,9 +871,14 @@ static NTSTATUS get_file_callback(struct cli_state *cli, goto out; } - rc = tar_create_skip_path(&tar_ctx, remote_name, finfo); - if (rc != 0) { + status = tar_create_skip_path(&tar_ctx, remote_name, finfo, &skip); + if (!NT_STATUS_IS_OK(status)) { + goto out; + } + + if (skip) { DBG(5, ("--- %s\n", remote_name)); + status = NT_STATUS_OK; goto out; } @@ -887,7 +894,7 @@ static NTSTATUS get_file_callback(struct cli_state *cli, rc = tar_get_file(&tar_ctx, remote_name, finfo); if (rc != 0) { - err = NT_STATUS_UNSUCCESSFUL; + status = NT_STATUS_UNSUCCESSFUL; goto out; } @@ -897,14 +904,14 @@ static NTSTATUS get_file_callback(struct cli_state *cli, } else { rc = tar_get_file(&tar_ctx, remote_name, finfo); if (rc != 0) { - err = NT_STATUS_UNSUCCESSFUL; + status = NT_STATUS_UNSUCCESSFUL; goto out; } } out: talloc_free(ctx); - return err; + return status; } /** @@ -1338,18 +1345,19 @@ static bool tar_extract_skip_path(struct tar *t, } /** - * tar_create_skip_path - return true if @fullpath shoud be skipped + * tar_create_skip_path - check if @fullpath shoud be skipped * @fullpath: full remote path of the current file * @finfo: remote file attributes + * @_skip: returned skip not * * Skip predicate for tar creation (server to archive) only. */ -static bool tar_create_skip_path(struct tar *t, - const char *fullpath, - const struct file_info *finfo) +static NTSTATUS tar_create_skip_path(struct tar *t, + const char *fullpath, + const struct file_info *finfo, + bool *_skip) { /* syntaxic sugar */ - const bool skip = true; const mode_t mode = finfo->mode; const bool isdir = mode & FILE_ATTRIBUTE_DIRECTORY; const bool exclude = t->mode.selection == TAR_EXCLUDE; @@ -1359,17 +1367,20 @@ static bool tar_create_skip_path(struct tar *t, /* 1. if we dont want X and we have X, skip */ if (!t->mode.system && (mode & FILE_ATTRIBUTE_SYSTEM)) { - return skip; + *_skip = true; + return NT_STATUS_OK; } if (!t->mode.hidden && (mode & FILE_ATTRIBUTE_HIDDEN)) { - return skip; + *_skip = true; + return NT_STATUS_OK; } /* 2. if we only want archive and it's not, skip */ if (t->mode.incremental && !(mode & FILE_ATTRIBUTE_ARCHIVE)) { - return skip; + *_skip = true; + return NT_STATUS_OK; } } @@ -1380,14 +1391,16 @@ static bool tar_create_skip_path(struct tar *t, * point, no need to check */ if (!exclude) { - return !skip; + *_skip = false; + return NT_STATUS_OK; } /* we are now in exclude mode */ /* no matter the selection, no list => include everything */ if (t->path_list_size <= 0) { - return !skip; + *_skip = false; + return NT_STATUS_OK; } if (t->mode.regex) { @@ -1395,8 +1408,9 @@ static bool tar_create_skip_path(struct tar *t, } else { in = tar_path_in_list(t, fullpath, isdir && !exclude); } + *_skip = in; - return in ? skip : !skip; + return NT_STATUS_OK; } /** |