Add find contitions to check for timestamps.
This commit is contained in:
parent
6b583aa31f
commit
d2a92bd0f6
154
libisofs/find.c
154
libisofs/find.c
@ -323,3 +323,157 @@ IsoFindCondition *iso_new_find_conditions_uid(uid_t uid)
|
|||||||
return cond;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -2225,6 +2225,70 @@ IsoFindCondition *iso_new_find_conditions_gid(gid_t gid);
|
|||||||
*/
|
*/
|
||||||
IsoFindCondition *iso_new_find_conditions_uid(uid_t uid);
|
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.
|
* Find all directory children that match the given condition.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user