summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/modules/vfs_shadow_copy2.c68
1 files changed, 47 insertions, 21 deletions
diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c
index 97f208e566..ac6cdbb42d 100644
--- a/source3/modules/vfs_shadow_copy2.c
+++ b/source3/modules/vfs_shadow_copy2.c
@@ -158,60 +158,86 @@ static bool shadow_copy2_find_slashes(TALLOC_CTX *mem_ctx, const char *str,
}
/**
- * Given a timstamp, build the string to insert into a path
- * as a path component for creating the local path to the
- * snapshot at the given timestamp of the input path.
- *
- * In the case of a parallel snapdir (specified with an
- * absolute path), this is the inital portion of the
- * local path of any snapshot file. The complete path is
- * obtained by appending the portion of the file's path
- * below the share root's mountpoint.
+ * Given a timstamp, build the posix level GTM-tag string
+ * based on the configurable format.
*/
-static char *shadow_copy2_insert_string(TALLOC_CTX *mem_ctx,
- struct vfs_handle_struct *handle,
- time_t snapshot)
+static size_t shadow_copy2_posix_gmt_string(struct vfs_handle_struct *handle,
+ time_t snapshot,
+ char *snaptime_string,
+ size_t len)
{
struct tm snap_tm;
- fstring snaptime_string;
size_t snaptime_len;
struct shadow_copy2_config *config;
- char *result = NULL;
SMB_VFS_HANDLE_GET_DATA(handle, config, struct shadow_copy2_config,
- return NULL);
+ return 0);
if (config->use_sscanf) {
snaptime_len = snprintf(snaptime_string,
- sizeof(snaptime_string),
+ len,
config->gmt_format,
(unsigned long)snapshot);
if (snaptime_len <= 0) {
DEBUG(10, ("snprintf failed\n"));
- return NULL;
+ return snaptime_len;
}
} else {
if (config->use_localtime) {
if (localtime_r(&snapshot, &snap_tm) == 0) {
DEBUG(10, ("gmtime_r failed\n"));
- return NULL;
+ return -1;
}
} else {
if (gmtime_r(&snapshot, &snap_tm) == 0) {
DEBUG(10, ("gmtime_r failed\n"));
- return NULL;
+ return -1;
}
}
snaptime_len = strftime(snaptime_string,
- sizeof(snaptime_string),
+ len,
config->gmt_format,
&snap_tm);
if (snaptime_len == 0) {
DEBUG(10, ("strftime failed\n"));
- return NULL;
+ return 0;
}
}
+ return snaptime_len;
+}
+
+/**
+ * Given a timstamp, build the string to insert into a path
+ * as a path component for creating the local path to the
+ * snapshot at the given timestamp of the input path.
+ *
+ * In the case of a parallel snapdir (specified with an
+ * absolute path), this is the inital portion of the
+ * local path of any snapshot file. The complete path is
+ * obtained by appending the portion of the file's path
+ * below the share root's mountpoint.
+ */
+static char *shadow_copy2_insert_string(TALLOC_CTX *mem_ctx,
+ struct vfs_handle_struct *handle,
+ time_t snapshot)
+{
+ fstring snaptime_string;
+ size_t snaptime_len = 0;
+ char *result = NULL;
+ struct shadow_copy2_config *config;
+
+ SMB_VFS_HANDLE_GET_DATA(handle, config, struct shadow_copy2_config,
+ return NULL);
+
+ snaptime_len = shadow_copy2_posix_gmt_string(handle,
+ snapshot,
+ snaptime_string,
+ sizeof(snaptime_string));
+ if (snaptime_len <= 0) {
+ return NULL;
+ }
+
if (config->snapdir_absolute) {
result = talloc_asprintf(mem_ctx, "%s/%s",
config->snapdir, snaptime_string);