v3-4-ctdb: Deal with mmsnapdir -a
authorVolker Lendecke <vl@samba.org>
Mon, 29 Nov 2010 13:07:59 +0000 (06:07 -0700)
committerVolker Lendecke <vl@samba.org>
Fri, 4 Mar 2011 09:10:55 +0000 (02:10 -0700)
source3/modules/vfs_shadow_copy2.c

index 1cffc77f12997bb25459b2296f06937c42cd5e35..b7e47aa9810946eed728457ec7341b8f79bc8110 100644 (file)
@@ -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;
        }