From 8dc6f0fb39647e37a444ac582b5b33e27b40b3dc Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Fri, 14 Feb 2014 17:16:14 +0100 Subject: clitar: get tar context handle via helper function Add and use tar_get_ctx() to get the tarmode context handle in client.c, rather than declaring an extern. Also, add checks for NULL context pointer arguments. Signed-off-by: David Disseldorp Reviewed-by: Andreas Schneider --- source3/client/client.c | 12 ++++++------ source3/client/clitar.c | 41 ++++++++++++++++++++++++++++++----------- source3/client/clitar_proto.h | 1 + 3 files changed, 37 insertions(+), 17 deletions(-) (limited to 'source3/client') diff --git a/source3/client/client.c b/source3/client/client.c index 0cd59234d6c..5157fc9797b 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -5318,7 +5318,7 @@ static int do_host_query(const char *query_host) static int do_tar_op(const char *base_directory) { - extern struct tar tar_ctx; + struct tar *tar_ctx = tar_get_ctx(); int ret = 0; /* do we already have a connection? */ @@ -5345,7 +5345,7 @@ static int do_tar_op(const char *base_directory) } } - ret = tar_process(&tar_ctx); + ret = tar_process(tar_ctx); out_cli: cli_shutdown(cli); @@ -5393,7 +5393,7 @@ int main(int argc,char *argv[]) int rc = 0; bool tar_opt = false; bool service_opt = false; - extern struct tar tar_ctx; + struct tar *tar_ctx = tar_get_ctx(); struct poptOption long_options[] = { POPT_AUTOHELP @@ -5517,7 +5517,7 @@ int main(int argc,char *argv[]) break; } i++; - if (tar_parse_args(&tar_ctx, poptGetOptArg(pc), + if (tar_parse_args(tar_ctx, poptGetOptArg(pc), const_argv + i, argc - i)) { poptPrintUsage(pc, stderr, 0); exit(1); @@ -5611,7 +5611,7 @@ int main(int argc,char *argv[]) if(new_name_resolve_order) lp_set_cmdline("name resolve order", new_name_resolve_order); - if (!tar_to_process(&tar_ctx) && !query_host && !service && !message) { + if (!tar_to_process(tar_ctx) && !query_host && !service && !message) { poptPrintUsage(pc, stderr, 0); exit(1); } @@ -5626,7 +5626,7 @@ int main(int argc,char *argv[]) max_protocol = lp_client_max_protocol(); - if (tar_to_process(&tar_ctx)) { + if (tar_to_process(tar_ctx)) { if (cmdstr) process_command_string(cmdstr); rc = do_tar_op(base_directory); diff --git a/source3/client/clitar.c b/source3/client/clitar.c index e0c9c94d335..37c31ac3d9e 100644 --- a/source3/client/clitar.c +++ b/source3/client/clitar.c @@ -24,8 +24,8 @@ * the context of the backup process. * * The current tar context can be accessed via the global variable - * `tar_ctx`. It's not static but you should avoid accessing it - * directly. + * `tar_ctx`. It's publicly exported as an opaque handle via + * tar_get_ctx(). * * A tar context is first configured through tar_parse_args() which * can be called from either the CLI (in client.c) or the interactive @@ -232,6 +232,13 @@ static int max_token (const char *str); static bool is_subpath(const char *sub, const char *full); static int set_remote_attr(const char *filename, uint16 new_attr, int mode); +/** + * tar_get_ctx - retrieve global tar context handle + */ +struct tar *tar_get_ctx() +{ + return &tar_ctx; +} /** * cmd_block - interactive command to change tar blocksize @@ -475,12 +482,17 @@ int cmd_setmode(void) int tar_parse_args(struct tar* t, const char *flag, const char **val, int valsize) { - TALLOC_CTX *ctx = tar_reset_mem_context(t); + TALLOC_CTX *ctx; bool list = false; - /* index of next value to use */ int ival = 0; + if (t == NULL) { + DBG(0, ("Invalid tar context\n")); + return 1; + } + + ctx = tar_reset_mem_context(t); /* * Reset back some options - could be from interactive version * all other modes are left as they are @@ -659,6 +671,11 @@ int tar_process(struct tar *t) { int rc = 0; + if (t == NULL) { + DBG(0, ("Invalid tar context\n")); + return 1; + } + switch(t->mode.operation) { case TAR_EXTRACT: rc = tar_extract(t); @@ -1353,6 +1370,10 @@ static bool tar_create_skip_path(struct tar *t, */ bool tar_to_process (struct tar *t) { + if (t == NULL) { + DBG(0, ("Invalid tar context\n")); + return false; + } return t->to_process; } @@ -1683,13 +1704,6 @@ static char *path_base_name (const char *path) #define NOT_IMPLEMENTED DEBUG(0, ("tar mode not compiled. build with --with-libarchive\n")) -struct tar -{ - int dummy; -}; - -struct tar tar_ctx; - int cmd_block(void) { NOT_IMPLEMENTED; @@ -1732,4 +1746,9 @@ bool tar_to_process(struct tar *tar) return false; } +struct tar *tar_get_ctx() +{ + return NULL; +} + #endif diff --git a/source3/client/clitar_proto.h b/source3/client/clitar_proto.h index 3b2671a93e9..65204768ea9 100644 --- a/source3/client/clitar_proto.h +++ b/source3/client/clitar_proto.h @@ -29,5 +29,6 @@ int cmd_tar(void); int tar_process(struct tar* tar); int tar_parse_args(struct tar *tar, const char *flag, const char **val, int valsize); bool tar_to_process(struct tar *tar); +struct tar *tar_get_ctx(void); #endif /* _CLITAR_PROTO_H_ */ -- cgit