#ifndef _GRP_H
#include <grp/grp.h>

libc_hidden_proto (setgroups)

/* Now define the internal interfaces.  */
extern int __getgrent_r (struct group *__resultbuf, char *buffer,
			 size_t __buflen, struct group **__result)
     attribute_hidden;
extern int __old_getgrent_r (struct group *__resultbuf, char *buffer,
			     size_t __buflen, struct group **__result);
extern int __fgetgrent_r (FILE * __stream, struct group *__resultbuf,
			  char *buffer, size_t __buflen,
			  struct group **__result);

/* Search for an entry with a matching group ID.  */
extern int __getgrgid_r (__gid_t __gid, struct group *__resultbuf,
			 char *__buffer, size_t __buflen,
			 struct group **__result);
extern int __old_getgrgid_r (__gid_t __gid, struct group *__resultbuf,
			     char *__buffer, size_t __buflen,
			     struct group **__result);

/* Search for an entry with a matching group name.  */
extern int __getgrnam_r (__const char *__name, struct group *__resultbuf,
			 char *__buffer, size_t __buflen,
			 struct group **__result);
extern int __old_getgrnam_r (__const char *__name, struct group *__resultbuf,
			     char *__buffer, size_t __buflen,
			     struct group **__result);

struct parser_data;
extern int _nss_files_parse_grent (char *line, struct group *result,
				   struct parser_data *data,
				   size_t datalen, int *errnop);
libc_hidden_proto (_nss_files_parse_grent)

#define DECLARE_NSS_PROTOTYPES(service)					   \
extern enum nss_status _nss_ ## service ## _setgrent (int);		   \
extern enum nss_status _nss_ ## service ## _endgrent (void);		   \
extern enum nss_status _nss_ ## service ## _getgrgid_r			   \
                       (gid_t gid, struct group *grp, char *buffer,	   \
			size_t buflen, int *errnop);			   \
extern enum nss_status _nss_ ## service ## _getgrnam_r			   \
                       (const char *name, struct group *grp,		   \
			char *buffer, size_t buflen, int *errnop);	   \
extern enum nss_status _nss_ ## service ##_getgrent_r			   \
                       (struct group *result, char *buffer, size_t buflen, \
			int *errnop);					   \
extern enum nss_status _nss_ ## service ##_initgroups_dyn		   \
                       (const char *user, gid_t group, long int *start,	   \
			long int *size, gid_t **groupsp, long int limit,   \
			int *errnop);

DECLARE_NSS_PROTOTYPES (compat)
DECLARE_NSS_PROTOTYPES (files)
DECLARE_NSS_PROTOTYPES (hesiod)
DECLARE_NSS_PROTOTYPES (nis)
DECLARE_NSS_PROTOTYPES (nisplus)

#undef DECLARE_NSS_PROTOTYPES
#endif
