<html lang="en">
<head>
<title>Database Example - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Users-and-Groups.html#Users-and-Groups" title="Users and Groups">
<link rel="prev" href="Group-Database.html#Group-Database" title="Group Database">
<link rel="next" href="Netgroup-Database.html#Netgroup-Database" title="Netgroup Database">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.

This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).

Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below.  A
copy of the license is included in the section entitled "GNU Free
Documentation License".

(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual.  Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
  pre.display { font-family:inherit }
  pre.format  { font-family:inherit }
  pre.smalldisplay { font-family:inherit; font-size:smaller }
  pre.smallformat  { font-family:inherit; font-size:smaller }
  pre.smallexample { font-size:smaller }
  pre.smalllisp    { font-size:smaller }
  span.sc    { font-variant:small-caps }
  span.roman { font-family:serif; font-weight:normal; } 
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Database-Example"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Netgroup-Database.html#Netgroup-Database">Netgroup Database</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Group-Database.html#Group-Database">Group Database</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Users-and-Groups.html#Users-and-Groups">Users and Groups</a>
<hr>
</div>

<h3 class="section">29.15 User and Group Database Example</h3>

<p>Here is an example program showing the use of the system database inquiry
functions.  The program prints some information about the user running
the program.

<pre class="smallexample">     #include &lt;grp.h&gt;
     #include &lt;pwd.h&gt;
     #include &lt;sys/types.h&gt;
     #include &lt;unistd.h&gt;
     #include &lt;stdlib.h&gt;
     
     int
     main (void)
     {
       uid_t me;
       struct passwd *my_passwd;
       struct group *my_group;
       char **members;
     
       /* <span class="roman">Get information about the user ID.</span> */
       me = getuid ();
       my_passwd = getpwuid (me);
       if (!my_passwd)
         {
           printf ("Couldn't find out about user %d.\n", (int) me);
           exit (EXIT_FAILURE);
         }
     
       /* <span class="roman">Print the information.</span> */
       printf ("I am %s.\n", my_passwd-&gt;pw_gecos);
       printf ("My login name is %s.\n", my_passwd-&gt;pw_name);
       printf ("My uid is %d.\n", (int) (my_passwd-&gt;pw_uid));
       printf ("My home directory is %s.\n", my_passwd-&gt;pw_dir);
       printf ("My default shell is %s.\n", my_passwd-&gt;pw_shell);
     
       /* <span class="roman">Get information about the default group ID.</span> */
       my_group = getgrgid (my_passwd-&gt;pw_gid);
       if (!my_group)
         {
           printf ("Couldn't find out about group %d.\n",
                   (int) my_passwd-&gt;pw_gid);
           exit (EXIT_FAILURE);
         }
     
       /* <span class="roman">Print the information.</span> */
       printf ("My default group is %s (%d).\n",
               my_group-&gt;gr_name, (int) (my_passwd-&gt;pw_gid));
       printf ("The members of this group are:\n");
       members = my_group-&gt;gr_mem;
       while (*members)
         {
           printf ("  %s\n", *(members));
           members++;
         }
     
       return EXIT_SUCCESS;
     }
</pre>
   <p>Here is some output from this program:

<pre class="smallexample">     I am Throckmorton Snurd.
     My login name is snurd.
     My uid is 31093.
     My home directory is /home/fsg/snurd.
     My default shell is /bin/sh.
     My default group is guest (12).
     The members of this group are:
       friedman
       tami
</pre>
   </body></html>

