shadow_copy2: implement disk_free
authorMichael Adam <obnox@samba.org>
Sat, 1 Jun 2013 00:14:41 +0000 (02:14 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 4 Oct 2013 20:21:15 +0000 (09:21 +1300)
Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source3/modules/vfs_shadow_copy2.c

index 4c8ee25678f032fd227861943b58b116440b16e4..9462187362838c6b944bf12873fe9e7e9226b088 100644 (file)
@@ -1576,6 +1576,42 @@ static int shadow_copy2_get_real_filename(struct vfs_handle_struct *handle,
        return ret;
 }
 
+static uint64_t shadow_copy2_disk_free(vfs_handle_struct *handle,
+                                      const char *path, bool small_query,
+                                      uint64_t *bsize, uint64_t *dfree,
+                                      uint64_t *dsize)
+{
+       time_t timestamp;
+       char *stripped;
+       ssize_t ret;
+       int saved_errno;
+       char *conv;
+
+       if (!shadow_copy2_strip_snapshot(talloc_tos(), handle, path,
+                                        &timestamp, &stripped)) {
+               return -1;
+       }
+       if (timestamp == 0) {
+               return SMB_VFS_NEXT_DISK_FREE(handle, path, small_query,
+                                             bsize, dfree, dsize);
+       }
+
+       conv = shadow_copy2_convert(talloc_tos(), handle, stripped, timestamp);
+       TALLOC_FREE(stripped);
+       if (conv == NULL) {
+               return -1;
+       }
+
+       ret = SMB_VFS_NEXT_DISK_FREE(handle, conv, small_query, bsize, dfree,
+                                    dsize);
+
+       saved_errno = errno;
+       TALLOC_FREE(conv);
+       errno = saved_errno;
+
+       return ret;
+}
+
 static int shadow_copy2_connect(struct vfs_handle_struct *handle,
                                const char *service, const char *user)
 {
@@ -1814,6 +1850,7 @@ static int shadow_copy2_connect(struct vfs_handle_struct *handle,
 static struct vfs_fn_pointers vfs_shadow_copy2_fns = {
        .connect_fn = shadow_copy2_connect,
        .opendir_fn = shadow_copy2_opendir,
+       .disk_free_fn = shadow_copy2_disk_free,
        .rename_fn = shadow_copy2_rename,
        .link_fn = shadow_copy2_link,
        .symlink_fn = shadow_copy2_symlink,