From f7d57f76e04e64150cd95b0a3663df1de44de2f2 Mon Sep 17 00:00:00 2001 From: Michel Machado Date: Sun, 25 Dec 2011 23:08:42 -0200 Subject: [PATCH] Made f3write remove old F3 files in order Messages like "Removing old file 0001.fff ..." were issued in a file system dependent order. This is a cosmetic change that takes advantage of the function ls_my_files previously created for f3read. --- f3read.c | 63 --------------------------------------------------- f3write.c | 34 +++++++++------------------- utils.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ utils.h | 2 ++ 4 files changed, 80 insertions(+), 86 deletions(-) diff --git a/f3read.c b/f3read.c index f3d1abe..38e822c 100644 --- a/f3read.c +++ b/f3read.c @@ -1,8 +1,6 @@ #include #include #include -#include -#include #include #include #include @@ -207,67 +205,6 @@ static void iterate_files(const char *path, const int *files, int progress) printf("Average reading speed: %.2f %s/s\n", read_speed, unit); } -static int number_from_filename(const char *filename) -{ - char str[FILENAME_NUM_DIGITS + 1]; - assert(is_my_file(filename)); - strncpy(str, filename, FILENAME_NUM_DIGITS); - str[FILENAME_NUM_DIGITS] = '\0'; - return strtol(str, NULL, 10) - 1; -} - -/* Don't call this function directly, use ls_my_files instead. */ -static int *__ls_my_files(DIR *dir, int *pcount, int *pindex) -{ - struct dirent *entry; - const char *filename; - - entry = readdir(dir); - if (!entry) { - int *ret = malloc(sizeof(const int) * (*pcount + 1)); - *pindex = *pcount - 1; - ret[*pcount] = -1; - closedir(dir); - return ret; - } - - filename = entry->d_name; - if (is_my_file(filename)) { - int my_index; - int *ret; - (*pcount)++; - ret = __ls_my_files(dir, pcount, &my_index); - ret[my_index] = number_from_filename(filename); - *pindex = my_index - 1; - return ret; - } - - return __ls_my_files(dir, pcount, pindex); -} - -/* To be used with qsort(3). */ -static int cmpintp(const void *p1, const void *p2) -{ - return *(const int *)p1 - *(const int *)p2; -} - -static const int *ls_my_files(const char *path) -{ - DIR *dir = opendir(path); - int my_count; - int my_index; - int *ret; - - if (!dir) - err(errno, "Can't open path %s", path); - - my_count = 0; - ret = __ls_my_files(dir, &my_count, &my_index); - assert(my_index == -1); - qsort(ret, my_count, sizeof(*ret), cmpintp); - return ret; -} - int main(int argc, char *argv[]) { if (argc == 2) { diff --git a/f3write.c b/f3write.c index 7f2196e..7d229a6 100644 --- a/f3write.c +++ b/f3write.c @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include @@ -13,7 +12,6 @@ #include #include #include -#include #include "utils.h" @@ -441,28 +439,18 @@ static int fill_fs(const char *path, int progress) static void unlink_old_files(const char *path) { - DIR *ptr_dir; - struct dirent *entry; - const char *filename; - - ptr_dir = opendir(path); - if (!ptr_dir) - err(errno, "Can't open path %s", path); - - entry = readdir(ptr_dir); - while (entry) { - filename = entry->d_name; - if (is_my_file(filename)) { - char full_fn[PATH_MAX]; - assert(snprintf(full_fn, sizeof(full_fn), "%s/%s", - path, filename) < sizeof(full_fn)); - printf("Removing old file %s ...\n", filename); - if (unlink(full_fn)) - err(errno, "Can't remove file %s", full_fn); - } - entry = readdir(ptr_dir); + const int *files = ls_my_files(path); + const int *number = files; + while (*number >= 0) { + char full_fn[PATH_MAX]; + const char *filename; + full_fn_from_number(full_fn, &filename, path, *number); + printf("Removing old file %s ...\n", filename); + if (unlink(full_fn)) + err(errno, "Can't remove file %s", full_fn); + number++; } - closedir(ptr_dir); + free((void *)files); } int main(int argc, char *argv[]) diff --git a/utils.c b/utils.c index a4adeae..6acfcc0 100644 --- a/utils.c +++ b/utils.c @@ -1,3 +1,9 @@ +#include +#include +#include +#include +#include + #include "utils.h" const char *adjust_unit(double *ptr_bytes) @@ -27,6 +33,67 @@ void full_fn_from_number(char *full_fn, const char **filename, *filename = full_fn + strlen(path) + 1; } +static int number_from_filename(const char *filename) +{ + char str[FILENAME_NUM_DIGITS + 1]; + assert(is_my_file(filename)); + strncpy(str, filename, FILENAME_NUM_DIGITS); + str[FILENAME_NUM_DIGITS] = '\0'; + return strtol(str, NULL, 10) - 1; +} + +/* Don't call this function directly, use ls_my_files instead. */ +static int *__ls_my_files(DIR *dir, int *pcount, int *pindex) +{ + struct dirent *entry; + const char *filename; + + entry = readdir(dir); + if (!entry) { + int *ret = malloc(sizeof(const int) * (*pcount + 1)); + *pindex = *pcount - 1; + ret[*pcount] = -1; + closedir(dir); + return ret; + } + + filename = entry->d_name; + if (is_my_file(filename)) { + int my_index; + int *ret; + (*pcount)++; + ret = __ls_my_files(dir, pcount, &my_index); + ret[my_index] = number_from_filename(filename); + *pindex = my_index - 1; + return ret; + } + + return __ls_my_files(dir, pcount, pindex); +} + +/* To be used with qsort(3). */ +static int cmpintp(const void *p1, const void *p2) +{ + return *(const int *)p1 - *(const int *)p2; +} + +const int *ls_my_files(const char *path) +{ + DIR *dir = opendir(path); + int my_count; + int my_index; + int *ret; + + if (!dir) + err(errno, "Can't open path %s", path); + + my_count = 0; + ret = __ls_my_files(dir, &my_count, &my_index); + assert(my_index == -1); + qsort(ret, my_count, sizeof(*ret), cmpintp); + return ret; +} + #ifdef APPLE_MAC #include diff --git a/utils.h b/utils.h index 90601fe..9dc361d 100644 --- a/utils.h +++ b/utils.h @@ -35,6 +35,8 @@ static inline long delay_ms(const struct timeval *t1, const struct timeval *t2) (t2->tv_usec - t1->tv_usec) / 1000; } +const int *ls_my_files(const char *path); + #ifdef APPLE_MAC /* For function fcntl. */