From: Volker Lendecke Date: Mon, 29 Nov 2010 13:07:59 +0000 (-0700) Subject: v3-4-ctdb: Deal with mmsnapdir -a X-Git-Url: http://git.samba.org/?p=obnox%2Fsamba-ctdb.git;a=commitdiff_plain;h=2aeaed1c8d86df07bb5fc972648e3954c8c38e53 v3-4-ctdb: Deal with mmsnapdir -a --- diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c index 1cffc77f12..b7e47aa981 100644 --- a/source3/modules/vfs_shadow_copy2.c +++ b/source3/modules/vfs_shadow_copy2.c @@ -299,6 +299,28 @@ static const char *shadow_copy2_find_basedir(TALLOC_CTX *mem_ctx, vfs_handle_str return basedir; } +static const char *non_wcard_fname(TALLOC_CTX *mem_ctx, const char *fname) +{ + char *result, *last_slash; + + if (!ms_has_wild(fname)) { + DEBUG(10, ("%s contains no wildcard\n", fname)); + return fname; + } + result = talloc_strdup(mem_ctx, fname); + if (result == NULL) { + return NULL; + } + last_slash = strrchr_m(result, '/'); + if (last_slash == NULL) { + TALLOC_FREE(result); + return NULL; + } + *last_slash = '\0'; + DEBUG(10, ("non_wcard_fname returns %s\n", result)); + return result; +} + /* convert a filename from a share relative path, to a path in the snapshot directory @@ -309,6 +331,14 @@ static char *convert_shadow2_name(vfs_handle_struct *handle, const char *fname, const char *snapdir, *relpath, *baseoffset, *basedir; size_t baselen; char *ret, *prefix; + const char *no_wcard_name; + struct stat sbuf; + + no_wcard_name = non_wcard_fname(talloc_tos(), fname); + if ((no_wcard_name != NULL) && (stat(fname, &sbuf) == 0)) { + talloc_free(tmp_ctx); + return talloc_strdup(handle->data, fname); + } snapdir = shadow_copy2_find_snapdir(tmp_ctx, handle); if (snapdir == NULL) { @@ -532,9 +562,16 @@ static const char *shadow_copy2_connectpath(struct vfs_handle_struct *handle, const char *snapdir, *baseoffset, *basedir, *gmt_start; size_t baselen; char *ret; + const char *no_wcard_name; + struct stat sbuf; DEBUG(10, ("shadow_copy2_connectpath called with %s\n", fname)); + no_wcard_name = non_wcard_fname(talloc_tos(), fname); + if ((no_wcard_name != NULL) && (stat(no_wcard_name, &sbuf) == 0)) { + return handle->conn->connectpath; + } + if (!shadow_copy2_match_name(fname, &gmt_start)) { return handle->conn->connectpath; }