(root)/
tar-1.35/
gnu/
acl_entries.c
       1  /* Return the number of entries in an ACL.
       2  
       3     Copyright (C) 2002-2003, 2005-2023 Free Software Foundation, Inc.
       4  
       5     This program is free software: you can redistribute it and/or modify
       6     it under the terms of the GNU General Public License as published by
       7     the Free Software Foundation, either version 3 of the License, or
       8     (at your option) any later version.
       9  
      10     This program is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13     GNU General Public License for more details.
      14  
      15     You should have received a copy of the GNU General Public License
      16     along with this program.  If not, see <https://www.gnu.org/licenses/>.
      17  
      18     Written by Paul Eggert and Andreas Gruenbacher.  */
      19  
      20  #include <config.h>
      21  
      22  #include "acl-internal.h"
      23  
      24  /* This file assumes POSIX-draft like ACLs
      25     (Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5).  */
      26  
      27  /* Return the number of entries in ACL.
      28     Return -1 and set errno upon failure to determine it.  */
      29  
      30  int
      31  acl_entries (acl_t acl)
      32  {
      33    int count = 0;
      34  
      35    if (acl != NULL)
      36      {
      37  #if HAVE_ACL_FIRST_ENTRY /* Linux, FreeBSD, Mac OS X, Cygwin >= 2.5 */
      38  # if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */
      39        /* acl_get_entry returns 0 when it successfully fetches an entry,
      40           and -1/EINVAL at the end.  */
      41        acl_entry_t ace;
      42        int got_one;
      43  
      44        for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
      45             got_one >= 0;
      46             got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
      47          count++;
      48  # else /* Linux, FreeBSD, Cygwin >= 2.5 */
      49        /* acl_get_entry returns 1 when it successfully fetches an entry,
      50           and 0 at the end.  */
      51        acl_entry_t ace;
      52        int got_one;
      53  
      54        for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
      55             got_one > 0;
      56             got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
      57          count++;
      58        if (got_one < 0)
      59          return -1;
      60  # endif
      61  #else /* IRIX, Tru64 */
      62  # if HAVE_ACL_TO_SHORT_TEXT /* IRIX */
      63        /* Don't use acl_get_entry: it is undocumented.  */
      64        count = acl->acl_cnt;
      65  # endif
      66  # if HAVE_ACL_FREE_TEXT /* Tru64 */
      67        /* Don't use acl_get_entry: it takes only one argument and does not
      68           work.  */
      69        count = acl->acl_num;
      70  # endif
      71  #endif
      72      }
      73  
      74    return count;
      75  }