Example

QNX SDP8.0Programmer's GuideDeveloper

This example demonstrates how you can get the ACL for a file, modify it, and then set it for the file.

#include <stdlib.h>
#include <stdio.h>
#include <sys/acl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

int main(int argc, char *argv[]) {

   acl_t my_acl;
   char  *text_acl;
   ssize_t len;
   acl_entry_t my_entry;
   gid_t  group_id;
   acl_permset_t permset;
   int fd;

   fd = open( "my_file.txt", O_CREAT | O_RDONLY, 0666 );
   close(fd);

   /* Get the file's ACL. */
   my_acl = acl_get_file ("my_file.txt", ACL_TYPE_ACCESS);
   if (my_acl == NULL)
   {
      perror ("acl_get_file()");
      return EXIT_FAILURE;
   }

   /* Convert the ACL into text so we can see what it is. */
   text_acl = acl_to_text (my_acl, &len);
   if (text_acl == NULL)
   {
      perror ("acl_to_text()");
      return EXIT_FAILURE;
   }
   printf ("Initial ACL: %s\n", text_acl);

   /* We're done with the text version, so release it. */
   acl_free (text_acl);

   /* Add an entry for a named group to the ACL. */
   if (acl_create_entry (&my_acl, &my_entry) == -1)
   {
      perror ("acl_create_entry()");
      return EXIT_FAILURE;
   }

   if (acl_set_tag_type (my_entry, ACL_GROUP) == -1)
   {
      perror ("acl_set_tag_type");
      return EXIT_FAILURE;
   }

   group_id = 120;
   if (acl_set_qualifier (my_entry, &group_id) == -1)
   {
      perror ("acl_set_qualifier");
      return EXIT_FAILURE;
   }

   /* Modify the permissions. */
   acl_get_permset (my_entry, &permset);
   acl_clear_perms (permset);

   if (acl_add_perm (permset, ACL_READ))
   {
      perror ("acl_add_perm");
      return EXIT_FAILURE;
   }

   /* Recalculate the mask entry. */
   if (acl_calc_mask (&my_acl))
   {
      perror ("acl_calc_mask");
      return EXIT_FAILURE;
   }

   /* Make sure the ACL is valid. */
   if (acl_valid (my_acl) ==-1)
   {
      perror ("acl_valid");
      return EXIT_FAILURE;
   }

   /* Update the ACL for the file. */
   if (acl_set_file ("my_file.txt", ACL_TYPE_ACCESS, my_acl) == -1)
   {
      perror ("acl_set_file");
      return EXIT_FAILURE;
   }

   /* Free the ACL in working storage. */
   acl_free (my_acl);

   /* Verify it all worked, by getting and printing the file's ACL. */
   my_acl = acl_get_file ("my_file.txt", ACL_TYPE_ACCESS);
   if (my_acl == NULL)
   {
      perror ("acl_get_file()");
      return EXIT_FAILURE;
   }

   text_acl = acl_to_text (my_acl, &len);
   if (text_acl == NULL)
   {
      perror ("acl_to_text()");
      return EXIT_FAILURE;
   }
   printf ("Updated ACL: %s\n", text_acl);

   /* We're done with the text version, so release it. */
   acl_free (text_acl);

   return EXIT_SUCCESS;
}
Page updated: