/* Internal header for netgroup related functions.
   Copyright (C) 1996-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef _NETGROUP_H
#define _NETGROUP_H	1

#include <nsswitch.h>

/* A netgroup can consist of names of other netgroups.  We have to
   track which netgroups were read and which still have to be read.  */
struct name_list
{
  struct name_list *next;
  char name[];
};


/* Dataset for iterating netgroups.  */
struct __netgrent
{
  enum { triple_val, group_val } type;

  union
  {
    struct
    {
      const char *host;
      const char *user;
      const char *domain;
    }
    triple;

    const char *group;
  } val;

  /* Room for the data kept between the calls to the netgroup
     functions.  We must avoid global variables.  */
  char *data;
  size_t data_size;
  union
  {
    char *cursor;
    unsigned long int position;
  };
  int first;

  struct name_list *known_groups;
  struct name_list *needed_groups;

  /* This handle for the NSS data base is shared between all
     set/get/endXXXent functions.  */
  service_user *nip;
};


/* The internal netgroup handling functions might be called from outside.  */
extern int __internal_setnetgrent (const char *group,
				   struct __netgrent *datap);
libc_hidden_proto (__internal_setnetgrent)
extern void __internal_endnetgrent (struct __netgrent *datap);
libc_hidden_proto (__internal_endnetgrent)
extern int __internal_getnetgrent_r (char **hostp, char **userp,
				     char **domainp, struct __netgrent *datap,
				     char *buffer, size_t buflen, int *errnop);
libc_hidden_proto (__internal_getnetgrent_r)

#endif /* netgroup.h */
