diff options
| -rw-r--r-- | source3/modules/vfs_shadow_copy2.c | 68 | 
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);  | 
