(root)/
glibc-2.38/
sysdeps/
mach/
hurd/
group_member.c
       1  /* `group_member' -- test if process is in a given group.  Hurd version.
       2     Copyright (C) 1993-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library 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 GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <errno.h>
      20  #include <unistd.h>
      21  #include <hurd.h>
      22  #include <hurd/id.h>
      23  
      24  int
      25  __group_member (gid_t gid)
      26  {
      27    int member = 0;
      28    error_t err;
      29    void *crit;
      30  
      31  retry:
      32    crit = _hurd_critical_section_lock ();
      33    __mutex_lock (&_hurd_id.lock);
      34  
      35    err = _hurd_check_ids ();
      36    if (! err)
      37      {
      38        size_t i;
      39        for (i = 0; i < _hurd_id.gen.ngids; ++i)
      40  	if (_hurd_id.gen.gids[i] == gid)
      41  	  {
      42  	    member = 1;
      43  	    break;
      44  	  }
      45      }
      46  
      47    __mutex_unlock (&_hurd_id.lock);
      48    _hurd_critical_section_unlock (crit);
      49    if (err == EINTR)
      50      /* Got a signal while inside an RPC of the critical section, retry again */
      51      goto retry;
      52  
      53    if (err)
      54      __hurd_fail (err);
      55    return member;
      56  }
      57  
      58  weak_alias (__group_member, group_member)