********************************************************/
#ifdef HAVE_SOLARIS_ACLS
-/*
- Remove any trivial ACE "in-place". Returns no of non-trivial ACEs
-*/
-static int strip_trivial_aces(ace_t **saces, int sacecount)
-{
- EC_INIT;
- int i,j;
- int nontrivaces = 0;
- ace_t *aces = *saces;
- ace_t *new_aces;
-
- /* Count non-trivial ACEs */
- for (i=0; i < sacecount; ) {
- if ( ! (aces[i].a_flags & (ACE_OWNER | ACE_GROUP | ACE_EVERYONE)))
- nontrivaces++;
- i++;
- }
- /* malloc buffer for new ACL */
- EC_NULL_LOG(new_aces = malloc(nontrivaces * sizeof(ace_t)));
-
- /* Copy non-trivial ACEs */
- for (i=0, j=0; i < sacecount; ) {
- if ( ! (aces[i].a_flags & (ACE_OWNER | ACE_GROUP | ACE_EVERYONE))) {
- memcpy(&new_aces[j], &aces[i], sizeof(ace_t));
- j++;
- }
- i++;
- }
-
- free(aces);
- *saces = new_aces;
-
- LOG(log_debug7, logtype_afpd, "strip_trivial_aces: non-trivial ACEs: %d", nontrivaces);
-
- return nontrivaces;
-EC_CLEANUP:
- EC_EXIT;
-}
-
-/*
- Remove non-trivial ACEs "in-place". Returns no of trivial ACEs.
-*/
-static int strip_nontrivial_aces(ace_t **saces, int sacecount)
-{
- EC_INIT;
- int i,j;
- int trivaces = 0;
- ace_t *aces = *saces;
- ace_t *new_aces;
-
- /* Count trivial ACEs */
- for (i=0; i < sacecount; ) {
- if ((aces[i].a_flags & (ACE_OWNER | ACE_GROUP | ACE_EVERYONE)))
- trivaces++;
- i++;
- }
- /* malloc buffer for new ACL */
- EC_NULL_LOG(new_aces = malloc(trivaces * sizeof(ace_t)));
-
- /* Copy trivial ACEs */
- for (i=0, j=0; i < sacecount; ) {
- if ((aces[i].a_flags & (ACE_OWNER | ACE_GROUP | ACE_EVERYONE))) {
- memcpy(&new_aces[j], &aces[i], sizeof(ace_t));
- j++;
- }
- i++;
- }
- /* Free old ACEs */
- free(aces);
- *saces = new_aces;
-
- LOG(log_debug7, logtype_afpd, "strip_nontrivial_aces: trivial ACEs: %d", trivaces);
-
- return trivaces;
-EC_CLEANUP:
- EC_EXIT;
-}
-
-/*
- Concatenate ACEs
-*/
-static ace_t *concat_aces(ace_t *aces1, int ace1count, ace_t *aces2, int ace2count)
-{
- EC_INIT;
- ace_t *new_aces = NULL;
- int i, j;
-
- /* malloc buffer for new ACL */
- EC_NULL_LOG(new_aces = malloc((ace1count + ace2count) * sizeof(ace_t)));
-
- /* Copy ACEs from buf1 */
- for (i=0; i < ace1count; ) {
- memcpy(&new_aces[i], &aces1[i], sizeof(ace_t));
- i++;
- }
-
- j = i;
-
- /* Copy ACEs from buf2 */
- for (i=0; i < ace2count; ) {
- memcpy(&new_aces[j], &aces2[i], sizeof(ace_t));
- i++;
- j++;
- }
- return new_aces;
-
-EC_CLEANUP:
- if (new_aces)
- free(new_aces);
- return NULL;
-}
-
/*
Maps ACE array from Solaris to Darwin. Darwin ACEs are stored in network byte order.