All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 34s
				
			Test / Sandbox (push) Successful in 1m47s
				
			Test / Hakurei (push) Successful in 3m20s
				
			Test / Hpkg (push) Successful in 3m49s
				
			Test / Sandbox (race detector) (push) Successful in 5m48s
				
			Test / Hakurei (race detector) (push) Successful in 3m9s
				
			Test / Flake checks (push) Successful in 1m35s
				
			This helps determine which libacl function the errno came from. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			91 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "libacl-helper.h"
 | |
| #include <acl/libacl.h>
 | |
| #include <stdbool.h>
 | |
| #include <stdlib.h>
 | |
| #include <sys/acl.h>
 | |
| 
 | |
| int hakurei_acl_update_file_by_uid(const char *path_p, uid_t uid,
 | |
|                                    acl_perm_t *perms, size_t plen) {
 | |
|   int ret;
 | |
|   bool v;
 | |
|   int i;
 | |
|   acl_t acl;
 | |
|   acl_entry_t entry;
 | |
|   acl_tag_t tag_type;
 | |
|   void *qualifier_p;
 | |
|   acl_permset_t permset;
 | |
| 
 | |
|   ret = -1; /* acl_get_file */
 | |
|   acl = acl_get_file(path_p, ACL_TYPE_ACCESS);
 | |
|   if (acl == NULL)
 | |
|     goto out;
 | |
| 
 | |
|   /* prune entries by uid */
 | |
|   for (i = acl_get_entry(acl, ACL_FIRST_ENTRY, &entry); i == 1;
 | |
|        i = acl_get_entry(acl, ACL_NEXT_ENTRY, &entry)) {
 | |
|     ret = -2; /* acl_get_tag_type */
 | |
|     if (acl_get_tag_type(entry, &tag_type) != 0)
 | |
|       goto out;
 | |
|     if (tag_type != ACL_USER)
 | |
|       continue;
 | |
| 
 | |
|     ret = -3; /* acl_get_qualifier */
 | |
|     qualifier_p = acl_get_qualifier(entry);
 | |
|     if (qualifier_p == NULL)
 | |
|       goto out;
 | |
|     v = *(uid_t *)qualifier_p == uid;
 | |
|     acl_free(qualifier_p);
 | |
| 
 | |
|     if (!v)
 | |
|       continue;
 | |
| 
 | |
|     ret = -4; /* acl_delete_entry */
 | |
|     if (acl_delete_entry(acl, entry) != 0)
 | |
|       goto out;
 | |
|   }
 | |
| 
 | |
|   if (plen == 0)
 | |
|     goto set;
 | |
| 
 | |
|   ret = -5; /* acl_create_entry */
 | |
|   if (acl_create_entry(&acl, &entry) != 0)
 | |
|     goto out;
 | |
| 
 | |
|   ret = -6; /* acl_get_permset */
 | |
|   if (acl_get_permset(entry, &permset) != 0)
 | |
|     goto out;
 | |
| 
 | |
|   ret = -7; /* acl_add_perm */
 | |
|   for (i = 0; i < plen; i++) {
 | |
|     if (acl_add_perm(permset, perms[i]) != 0)
 | |
|       goto out;
 | |
|   }
 | |
| 
 | |
|   ret = -8; /* acl_set_tag_type */
 | |
|   if (acl_set_tag_type(entry, ACL_USER) != 0)
 | |
|     goto out;
 | |
| 
 | |
|   ret = -9; /* acl_set_qualifier */
 | |
|   if (acl_set_qualifier(entry, (void *)&uid) != 0)
 | |
|     goto out;
 | |
| 
 | |
| set:
 | |
|   ret = -10; /* acl_calc_mask */
 | |
|   if (acl_calc_mask(&acl) != 0)
 | |
|     goto out;
 | |
| 
 | |
|   ret = -11; /* acl_valid */
 | |
|   if (acl_valid(acl) != 0)
 | |
|     goto out;
 | |
| 
 | |
|   ret = -12; /* acl_set_file */
 | |
|   if (acl_set_file(path_p, ACL_TYPE_ACCESS, acl) == 0)
 | |
|     ret = 0;
 | |
| 
 | |
| out:
 | |
|   free((void *)path_p);
 | |
|   if (acl != NULL)
 | |
|     acl_free((void *)acl);
 | |
|   return ret;
 | |
| }
 |