Linux-ACL

 view release on metacpan or  search on metacpan

ACL.xs  view on Meta::CPAN

			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 )