\section{\module{grp} ---
         The group database}

\declaremodule{builtin}{grp}
  \platform{Unix}
\modulesynopsis{The group database (\function{getgrnam()} and friends).}


This module provides access to the \UNIX{} group database.
It is available on all \UNIX{} versions.

Group database entries are reported as 4-tuples containing the
following items from the group database (see \code{<grp.h>}), in order:

\begin{tableiii}{r|l|l}{textrm}{Index}{Field}{Meaning}
  \lineiii{0}{gr_name}{the name of the group}
  \lineiii{1}{gr_passwd}{the (encrypted) group password; often empty}
  \lineiii{2}{gr_gid}{the numerical group ID}
  \lineiii{3}{gr_mem}{all the group member's  user  names}
\end{tableiii}

The gid is an integer, name and password are strings, and the member
list is a list of strings.
(Note that most users are not explicitly listed as members of the
group they are in according to the password database.  Check both
databases to get complete membership information.)

It defines the following items:

\begin{funcdesc}{getgrgid}{gid}
Return the group database entry for the given numeric group ID.
\exception{KeyError} is raised if the entry asked for cannot be found.
\end{funcdesc}

\begin{funcdesc}{getgrnam}{name}
Return the group database entry for the given group name.
\exception{KeyError} is raised if the entry asked for cannot be found.
\end{funcdesc}

\begin{funcdesc}{getgrall}{}
Return a list of all available group entries, in arbitrary order.
\end{funcdesc}


\begin{seealso}
  \seemodule{pwd}{An interface to the user database, similar to this.}
\end{seealso}
