=== modified file 'source/modules/vfs_shadow_copy.c'
--- source/modules/vfs_shadow_copy.c	2007-04-16 01:45:15 +0000
+++ source/modules/vfs_shadow_copy.c	2007-04-26 15:45:09 +0000
@@ -56,12 +56,50 @@
 #define SHADOW_COPY_PREFIX "@GMT-"
 #define SHADOW_COPY_SAMPLE "@GMT-2004.02.18-15.44.00"
 
+#define SHADOW_COPY_DEFAULT_SORT ""
+
 typedef struct {
 	int pos;
 	int length;
 	unsigned char *dirs;
 } shadow_copy_Dir;
 
+static int shadow_copy_label_cmp_asc(const void *x, const void *y)
+{
+	return strncmp((char *)x, (char *)y, sizeof(SHADOW_COPY_LABEL));
+}
+
+static int shadow_copy_label_cmp_desc(const void *x, const void *y)
+{
+	return -strncmp((char *)x, (char *)y, sizeof(SHADOW_COPY_LABEL));
+}
+
+static void shadow_copy_sort_data(vfs_handle_struct *handle, SHADOW_COPY_DATA *shadow_copy_data)
+{
+	const char *tmp_str = NULL;
+
+	if (shadow_copy_data && shadow_copy_data->num_volumes > 0 &&
+		shadow_copy_data->labels) {
+
+		tmp_str = lp_parm_const_string(SNUM(handle->conn), "shadow_copy", "sort",SHADOW_COPY_DEFAULT_SORT);
+
+		if (strcmp(tmp_str, "asc") == 0) {
+			qsort(shadow_copy_data->labels,
+				shadow_copy_data->num_volumes,
+				sizeof(SHADOW_COPY_LABEL),
+				shadow_copy_label_cmp_asc);
+
+		} else if (strcmp(tmp_str, "desc") == 0) {
+			qsort(shadow_copy_data->labels,
+				shadow_copy_data->num_volumes,
+				sizeof(SHADOW_COPY_LABEL),
+				shadow_copy_label_cmp_desc);
+		}
+	}
+
+	return;
+}
+
 static BOOL shadow_copy_match_name(const char *name)
 {
 	if (strncmp(SHADOW_COPY_PREFIX,name, sizeof(SHADOW_COPY_PREFIX)-1)==0 &&
@@ -213,6 +251,8 @@
 		shadow_copy_data->labels = tlabels;
 	}
 
+	shadow_copy_sort_data(handle, shadow_copy_data);
+
 	SMB_VFS_NEXT_CLOSEDIR(handle,p);
 	return 0;
 }

