From d2a92bd0f6135be0f444a3694257e5d60ff09935 Mon Sep 17 00:00:00 2001 From: Vreixo Formoso Date: Tue, 4 Mar 2008 00:53:25 +0100 Subject: [PATCH] Add find contitions to check for timestamps. --- libisofs/find.c | 154 ++++++++++++++++++++++++++++++++++++++++++++ libisofs/libisofs.h | 64 ++++++++++++++++++ 2 files changed, 218 insertions(+) diff --git a/libisofs/find.c b/libisofs/find.c index 0517b3d..fd0e9f6 100644 --- a/libisofs/find.c +++ b/libisofs/find.c @@ -323,3 +323,157 @@ IsoFindCondition *iso_new_find_conditions_uid(uid_t uid) return cond; } +/*************** find by timestamps condition *****************/ + +struct cond_times +{ + time_t time; + int what_time; /* 0 atime, 1 mtime, 2 ctime */ + enum iso_find_comparisons comparison; +}; + +static +int cond_time_matches(IsoFindCondition *cond, IsoNode *node) +{ + time_t node_time; + struct cond_times *data = cond->data; + + switch (data->what_time) { + case 0: node_time = node->atime; break; + case 1: node_time = node->mtime; break; + default: node_time = node->ctime; break; + } + + switch (data->comparison) { + case ISO_FIND_COND_GREATER: + return node_time > data->time ? 1 : 0; + case ISO_FIND_COND_GREATER_OR_EQUAL: + return node_time >= data->time ? 1 : 0; + case ISO_FIND_COND_EQUAL: + return node_time == data->time ? 1 : 0; + case ISO_FIND_COND_LESS: + return node_time < data->time ? 1 : 0; + case ISO_FIND_COND_LESS_OR_EQUAL: + return node_time <= data->time ? 1 : 0; + } + /* should never happen */ + return 0; +} + +static +void cond_time_free(IsoFindCondition *cond) +{ + free(cond->data); +} + +/** + * Create a new condition that checks the time of last access. + * + * @param time + * Time to compare against IsoNode atime. + * @param comparison + * Comparison to be done between IsoNode atime and submitted time. + * Note that ISO_FIND_COND_GREATER, for example, is true if the node + * time is greater than the submitted time. + * @result + * The created IsoFindCondition, NULL on error. + * + * @since 0.6.4 + */ +IsoFindCondition *iso_new_find_conditions_atime(time_t time, + enum iso_find_comparisons comparison) +{ + IsoFindCondition *cond; + struct cond_times *data; + cond = malloc(sizeof(IsoFindCondition)); + if (cond == NULL) { + return NULL; + } + data = malloc(sizeof(struct cond_times)); + if (data == NULL) { + free(cond); + return NULL; + } + data->time = time; + data->comparison = comparison; + data->what_time = 0; /* atime */ + cond->data = data; + cond->free = cond_time_free; + cond->matches = cond_time_matches; + return cond; +} + +/** + * Create a new condition that checks the time of last modification. + * + * @param time + * Time to compare against IsoNode mtime. + * @param comparison + * Comparison to be done between IsoNode mtime and submitted time. + * Note that ISO_FIND_COND_GREATER, for example, is true if the node + * time is greater than the submitted time. + * @result + * The created IsoFindCondition, NULL on error. + * + * @since 0.6.4 + */ +IsoFindCondition *iso_new_find_conditions_mtime(time_t time, + enum iso_find_comparisons comparison) +{ + IsoFindCondition *cond; + struct cond_times *data; + cond = malloc(sizeof(IsoFindCondition)); + if (cond == NULL) { + return NULL; + } + data = malloc(sizeof(struct cond_times)); + if (data == NULL) { + free(cond); + return NULL; + } + data->time = time; + data->comparison = comparison; + data->what_time = 1; /* mtime */ + cond->data = data; + cond->free = cond_time_free; + cond->matches = cond_time_matches; + return cond; +} + +/** + * Create a new condition that checks the time of last status change. + * + * @param time + * Time to compare against IsoNode ctime. + * @param comparison + * Comparison to be done between IsoNode ctime and submitted time. + * Note that ISO_FIND_COND_GREATER, for example, is true if the node + * time is greater than the submitted time. + * @result + * The created IsoFindCondition, NULL on error. + * + * @since 0.6.4 + */ +IsoFindCondition *iso_new_find_conditions_ctime(time_t time, + enum iso_find_comparisons comparison) +{ + IsoFindCondition *cond; + struct cond_times *data; + cond = malloc(sizeof(IsoFindCondition)); + if (cond == NULL) { + return NULL; + } + data = malloc(sizeof(struct cond_times)); + if (data == NULL) { + free(cond); + return NULL; + } + data->time = time; + data->comparison = comparison; + data->what_time = 2; /* ctime */ + cond->data = data; + cond->free = cond_time_free; + cond->matches = cond_time_matches; + return cond; +} + diff --git a/libisofs/libisofs.h b/libisofs/libisofs.h index a7fb840..6eb29fa 100644 --- a/libisofs/libisofs.h +++ b/libisofs/libisofs.h @@ -2225,6 +2225,70 @@ IsoFindCondition *iso_new_find_conditions_gid(gid_t gid); */ IsoFindCondition *iso_new_find_conditions_uid(uid_t uid); +/** + * Possible comparison between IsoNode and given conditions. + * + * @since 0.6.4 + */ +enum iso_find_comparisons { + ISO_FIND_COND_GREATER, + ISO_FIND_COND_GREATER_OR_EQUAL, + ISO_FIND_COND_EQUAL, + ISO_FIND_COND_LESS, + ISO_FIND_COND_LESS_OR_EQUAL +}; + +/** + * Create a new condition that checks the time of last access. + * + * @param time + * Time to compare against IsoNode atime. + * @param comparison + * Comparison to be done between IsoNode atime and submitted time. + * Note that ISO_FIND_COND_GREATER, for example, is true if the node + * time is greater than the submitted time. + * @result + * The created IsoFindCondition, NULL on error. + * + * @since 0.6.4 + */ +IsoFindCondition *iso_new_find_conditions_atime(time_t time, + enum iso_find_comparisons comparison); + +/** + * Create a new condition that checks the time of last modification. + * + * @param time + * Time to compare against IsoNode mtime. + * @param comparison + * Comparison to be done between IsoNode mtime and submitted time. + * Note that ISO_FIND_COND_GREATER, for example, is true if the node + * time is greater than the submitted time. + * @result + * The created IsoFindCondition, NULL on error. + * + * @since 0.6.4 + */ +IsoFindCondition *iso_new_find_conditions_mtime(time_t time, + enum iso_find_comparisons comparison); + +/** + * Create a new condition that checks the time of last status change. + * + * @param time + * Time to compare against IsoNode ctime. + * @param comparison + * Comparison to be done between IsoNode ctime and submitted time. + * Note that ISO_FIND_COND_GREATER, for example, is true if the node + * time is greater than the submitted time. + * @result + * The created IsoFindCondition, NULL on error. + * + * @since 0.6.4 + */ +IsoFindCondition *iso_new_find_conditions_ctime(time_t time, + enum iso_find_comparisons comparison); + /** * Find all directory children that match the given condition. *