Add find conditions to check for mode, gid and uid attributes.
This commit is contained in:
parent
cb47296913
commit
6b583aa31f
145
libisofs/find.c
145
libisofs/find.c
@ -156,7 +156,7 @@ void cond_name_free(IsoFindCondition *cond)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new condition that checks if a the node name matches the given
|
* Create a new condition that checks if the node name matches the given
|
||||||
* wildcard.
|
* wildcard.
|
||||||
*
|
*
|
||||||
* @param wildcard
|
* @param wildcard
|
||||||
@ -180,3 +180,146 @@ IsoFindCondition *iso_new_find_conditions_name(const char *wildcard)
|
|||||||
cond->matches = cond_name_matches;
|
cond->matches = cond_name_matches;
|
||||||
return cond;
|
return cond;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************** find by mode condition *****************/
|
||||||
|
|
||||||
|
static
|
||||||
|
int cond_mode_matches(IsoFindCondition *cond, IsoNode *node)
|
||||||
|
{
|
||||||
|
mode_t *mask = (mode_t*) cond->data;
|
||||||
|
return node->mode & *mask ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void cond_mode_free(IsoFindCondition *cond)
|
||||||
|
{
|
||||||
|
free(cond->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new condition that checks the node mode against a mode mask. It
|
||||||
|
* can be used to check both file type and permissions.
|
||||||
|
*
|
||||||
|
* For example:
|
||||||
|
*
|
||||||
|
* iso_new_find_conditions_mode(S_IFREG) : search for regular files
|
||||||
|
* iso_new_find_conditions_mode(S_IFCHR | S_IWUSR) : search for character
|
||||||
|
* devices where owner has write permissions.
|
||||||
|
*
|
||||||
|
* @param mask
|
||||||
|
* Mode mask to AND against node mode.
|
||||||
|
* @result
|
||||||
|
* The created IsoFindCondition, NULL on error.
|
||||||
|
*
|
||||||
|
* @since 0.6.4
|
||||||
|
*/
|
||||||
|
IsoFindCondition *iso_new_find_conditions_mode(mode_t mask)
|
||||||
|
{
|
||||||
|
IsoFindCondition *cond;
|
||||||
|
mode_t *data;
|
||||||
|
cond = malloc(sizeof(IsoFindCondition));
|
||||||
|
if (cond == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
data = malloc(sizeof(mode_t));
|
||||||
|
if (data == NULL) {
|
||||||
|
free(cond);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*data = mask;
|
||||||
|
cond->data = data;
|
||||||
|
cond->free = cond_mode_free;
|
||||||
|
cond->matches = cond_mode_matches;
|
||||||
|
return cond;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************** find by gid condition *****************/
|
||||||
|
|
||||||
|
static
|
||||||
|
int cond_gid_matches(IsoFindCondition *cond, IsoNode *node)
|
||||||
|
{
|
||||||
|
gid_t *gid = (gid_t*) cond->data;
|
||||||
|
return node->gid == *gid ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void cond_gid_free(IsoFindCondition *cond)
|
||||||
|
{
|
||||||
|
free(cond->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new condition that checks the node gid.
|
||||||
|
*
|
||||||
|
* @param gid
|
||||||
|
* Desired Group Id.
|
||||||
|
* @result
|
||||||
|
* The created IsoFindCondition, NULL on error.
|
||||||
|
*
|
||||||
|
* @since 0.6.4
|
||||||
|
*/
|
||||||
|
IsoFindCondition *iso_new_find_conditions_gid(gid_t gid)
|
||||||
|
{
|
||||||
|
IsoFindCondition *cond;
|
||||||
|
gid_t *data;
|
||||||
|
cond = malloc(sizeof(IsoFindCondition));
|
||||||
|
if (cond == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
data = malloc(sizeof(gid_t));
|
||||||
|
if (data == NULL) {
|
||||||
|
free(cond);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*data = gid;
|
||||||
|
cond->data = data;
|
||||||
|
cond->free = cond_gid_free;
|
||||||
|
cond->matches = cond_gid_matches;
|
||||||
|
return cond;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************** find by uid condition *****************/
|
||||||
|
|
||||||
|
static
|
||||||
|
int cond_uid_matches(IsoFindCondition *cond, IsoNode *node)
|
||||||
|
{
|
||||||
|
uid_t *uid = (uid_t*) cond->data;
|
||||||
|
return node->uid == *uid ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void cond_uid_free(IsoFindCondition *cond)
|
||||||
|
{
|
||||||
|
free(cond->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new condition that checks the node uid.
|
||||||
|
*
|
||||||
|
* @param uid
|
||||||
|
* Desired User Id.
|
||||||
|
* @result
|
||||||
|
* The created IsoFindCondition, NULL on error.
|
||||||
|
*
|
||||||
|
* @since 0.6.4
|
||||||
|
*/
|
||||||
|
IsoFindCondition *iso_new_find_conditions_uid(uid_t uid)
|
||||||
|
{
|
||||||
|
IsoFindCondition *cond;
|
||||||
|
uid_t *data;
|
||||||
|
cond = malloc(sizeof(IsoFindCondition));
|
||||||
|
if (cond == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
data = malloc(sizeof(uid_t));
|
||||||
|
if (data == NULL) {
|
||||||
|
free(cond);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*data = uid;
|
||||||
|
cond->data = data;
|
||||||
|
cond->free = cond_uid_free;
|
||||||
|
cond->matches = cond_uid_matches;
|
||||||
|
return cond;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -2171,7 +2171,7 @@ int iso_dir_iter_remove(IsoDirIter *iter);
|
|||||||
typedef struct iso_find_condition IsoFindCondition;
|
typedef struct iso_find_condition IsoFindCondition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new condition that checks if a the node name matches the given
|
* Create a new condition that checks if the node name matches the given
|
||||||
* wildcard.
|
* wildcard.
|
||||||
*
|
*
|
||||||
* @param wildcard
|
* @param wildcard
|
||||||
@ -2182,6 +2182,49 @@ typedef struct iso_find_condition IsoFindCondition;
|
|||||||
*/
|
*/
|
||||||
IsoFindCondition *iso_new_find_conditions_name(const char *wildcard);
|
IsoFindCondition *iso_new_find_conditions_name(const char *wildcard);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new condition that checks the node mode against a mode mask. It
|
||||||
|
* can be used to check both file type and permissions.
|
||||||
|
*
|
||||||
|
* For example:
|
||||||
|
*
|
||||||
|
* iso_new_find_conditions_mode(S_IFREG) : search for regular files
|
||||||
|
* iso_new_find_conditions_mode(S_IFCHR | S_IWUSR) : search for character
|
||||||
|
* devices where owner has write permissions.
|
||||||
|
*
|
||||||
|
* @param mask
|
||||||
|
* Mode mask to AND against node mode.
|
||||||
|
* @result
|
||||||
|
* The created IsoFindCondition, NULL on error.
|
||||||
|
*
|
||||||
|
* @since 0.6.4
|
||||||
|
*/
|
||||||
|
IsoFindCondition *iso_new_find_conditions_mode(mode_t mask);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new condition that checks the node gid.
|
||||||
|
*
|
||||||
|
* @param gid
|
||||||
|
* Desired Group Id.
|
||||||
|
* @result
|
||||||
|
* The created IsoFindCondition, NULL on error.
|
||||||
|
*
|
||||||
|
* @since 0.6.4
|
||||||
|
*/
|
||||||
|
IsoFindCondition *iso_new_find_conditions_gid(gid_t gid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new condition that checks the node uid.
|
||||||
|
*
|
||||||
|
* @param uid
|
||||||
|
* Desired User Id.
|
||||||
|
* @result
|
||||||
|
* The created IsoFindCondition, NULL on error.
|
||||||
|
*
|
||||||
|
* @since 0.6.4
|
||||||
|
*/
|
||||||
|
IsoFindCondition *iso_new_find_conditions_uid(uid_t uid);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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