=== 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; }