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;
 | 
						|
}
 |