Linux-ACL
view release on metacpan or search on metacpan
rc = CONSTANT_NO;
}
if(NULL != user_hash){
hv_iterinit(user_hash);
while(hash_entry = hv_iternext(user_hash)){
id_t id_p;
I32 key_len;
char *key = hv_iterkey(hash_entry, &key_len);
id_p = atoi(key);
if (acl_create_entry(&acl, &ent) == 0){
acl_set_tag_type(ent, ACL_USER);
acl_set_qualifier(ent, &id_p);
set_perm(ent, get_perm_from_hash(user_hash, key, key_len));
} else {
rc = CONSTANT_NO;
}
}
}
if(NULL != group_hash){
hv_iterinit(group_hash);
while(hash_entry = hv_iternext(group_hash)){
id_t id_p;
I32 key_len;
char *key = hv_iterkey(hash_entry, &key_len);
id_p = atoi(key);
if (acl_create_entry(&acl, &ent) == 0){
acl_set_tag_type(ent, ACL_GROUP);
acl_set_qualifier(ent, &id_p);
set_perm(ent, get_perm_from_hash(group_hash, key, key_len));
} else {
rc = CONSTANT_NO;
}
}
}
if (acl_set_file(filename, acl_types[i], acl) == -1) {
rc = CONSTANT_NO;
}
acl_free(acl);
i++;
}
return rc;
}
/*
* Exported code
*/
#define PACKAGE_NAME "Linux::ACL"
MODULE = Linux::ACL PACKAGE = Linux::ACL
void
getfacl(filename)
SV * filename;
PPCODE:
HV *acl, *default_acl;
STRLEN filename_string_length;
char *filename_string = SvPV(filename, filename_string_length);
int count = getfacl_internal(filename_string, &acl, &default_acl);
if(count>=1)
XPUSHs( sv_2mortal( newRV_noinc((SV*) acl) ) );
if(count>=2)
XPUSHs( sv_2mortal( newRV_noinc((SV*) default_acl) ) );
XSRETURN(count);
void
setfacl(filename, acl_hashref, ...)
SV *filename;
SV *acl_hashref;
PPCODE:
STRLEN filename_string_length;
char* filename_string = SvPV(filename, filename_string_length);
HV *acl_hash = derefHV(acl_hashref);
HV *default_acl_hash = NULL;
if( items > 2 )
default_acl_hash = derefHV(ST(2));
if(NULL == acl_hash){
XSRETURN_NO;
}
if( CONSTANT_YES == setfacl_internal(filename_string, acl_hash, default_acl_hash) ){
XSRETURN_YES;
}else{
XSRETURN_NO;
}
( run in 0.615 second using v1.01-cache-2.11-cpan-5511b514fd6 )