Sophie

Sophie

distrib > Mandriva > 2007.0 > x86_64 > media > main-release > by-pkgid > 926d2d1e3111287cee1b0a4fad4fb4f6 > files > 144

lib64dbus-1_3-devel-0.92-6mdv2007.0.x86_64.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>dbus-userdb.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.15 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>dbus-userdb.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font>
00002 <font class="comment">/* dbus-userdb.c User database abstraction</font>
00003 <font class="comment"> * </font>
00004 <font class="comment"> * Copyright (C) 2003  Red Hat, Inc.</font>
00005 <font class="comment"> *</font>
00006 <font class="comment"> * Licensed under the Academic Free License version 2.0</font>
00007 <font class="comment"> * </font>
00008 <font class="comment"> * This program is free software; you can redistribute it and/or modify</font>
00009 <font class="comment"> * it under the terms of the GNU General Public License as published by</font>
00010 <font class="comment"> * the Free Software Foundation; either version 2 of the License, or</font>
00011 <font class="comment"> * (at your option) any later version.</font>
00012 <font class="comment"> *</font>
00013 <font class="comment"> * This program is distributed in the hope that it will be useful,</font>
00014 <font class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</font>
00015 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</font>
00016 <font class="comment"> * GNU General Public License for more details.</font>
00017 <font class="comment"> * </font>
00018 <font class="comment"> * You should have received a copy of the GNU General Public License</font>
00019 <font class="comment"> * along with this program; if not, write to the Free Software</font>
00020 <font class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</font>
00021 <font class="comment"> *</font>
00022 <font class="comment"> */</font>
00023 <font class="preprocessor">#include "dbus-userdb.h"</font>
00024 <font class="preprocessor">#include "dbus-hash.h"</font>
00025 <font class="preprocessor">#include "dbus-test.h"</font>
00026 <font class="preprocessor">#include "dbus-internals.h"</font>
00027 <font class="preprocessor">#include &lt;string.h&gt;</font>
00028 
<a name="l00032"></a><a class="code" href="structDBusUserDatabase.html">00032</a> <font class="keyword">struct </font><a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>
00033 {
<a name="l00034"></a><a class="code" href="structDBusUserDatabase.html#m0">00034</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusUserDatabase.html#m0">refcount</a>; 
<a name="l00036"></a><a class="code" href="structDBusUserDatabase.html#m1">00036</a>   <a class="code" href="structDBusHashTable.html">DBusHashTable</a> *<a class="code" href="structDBusUserDatabase.html#m1">users</a>; 
<a name="l00037"></a><a class="code" href="structDBusUserDatabase.html#m2">00037</a>   <a class="code" href="structDBusHashTable.html">DBusHashTable</a> *<a class="code" href="structDBusUserDatabase.html#m2">groups</a>; 
<a name="l00038"></a><a class="code" href="structDBusUserDatabase.html#m3">00038</a>   <a class="code" href="structDBusHashTable.html">DBusHashTable</a> *<a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a>; 
<a name="l00039"></a><a class="code" href="structDBusUserDatabase.html#m4">00039</a>   <a class="code" href="structDBusHashTable.html">DBusHashTable</a> *<a class="code" href="structDBusUserDatabase.html#m4">groups_by_name</a>; 
00040 };
00041 
00042 <font class="keyword">static</font> <font class="keywordtype">void</font>
00043 free_user_info (<font class="keywordtype">void</font> *data)
00044 {
00045   <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a> *info = data;
00046 
00047   <font class="keywordflow">if</font> (info == NULL) <font class="comment">/* hash table will pass NULL */</font>
00048     <font class="keywordflow">return</font>;
00049 
00050   _dbus_user_info_free (info);
00051   dbus_free (info);
00052 }
00053 
00054 <font class="keyword">static</font> <font class="keywordtype">void</font>
00055 free_group_info (<font class="keywordtype">void</font> *data)
00056 {
00057   <a class="code" href="structDBusGroupInfo.html">DBusGroupInfo</a> *info = data;
00058 
00059   <font class="keywordflow">if</font> (info == NULL) <font class="comment">/* hash table will pass NULL */</font>
00060     <font class="keywordflow">return</font>;
00061 
00062   _dbus_group_info_free (info);
00063   dbus_free (info);
00064 }
00065 
00066 <font class="keyword">static</font> <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a>*
00067 _dbus_user_database_lookup (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a> *db,
00068                             dbus_uid_t        uid,
00069                             <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *username,
00070                             <a class="code" href="structDBusError.html">DBusError</a>        *error)
00071 {
00072   <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a> *info;
00073 
00074   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
00075   _dbus_assert (uid != DBUS_UID_UNSET || username != NULL);
00076   
00077   <font class="keywordflow">if</font> (uid != DBUS_UID_UNSET)
00078     info = _dbus_hash_table_lookup_ulong (db-&gt;<a class="code" href="structDBusUserDatabase.html#m1">users</a>, uid);
00079   <font class="keywordflow">else</font>
00080     info = _dbus_hash_table_lookup_string (db-&gt;<a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a>, _dbus_string_get_const_data (username));
00081   
00082   <font class="keywordflow">if</font> (info)
00083     {
00084       _dbus_verbose (<font class="stringliteral">"Using cache for UID "</font>DBUS_UID_FORMAT<font class="stringliteral">" information\n"</font>,
00085                      uid);
00086       <font class="keywordflow">return</font> info;
00087     }
00088   <font class="keywordflow">else</font>
00089     {
00090       _dbus_verbose (<font class="stringliteral">"No cache for UID "</font>DBUS_UID_FORMAT<font class="stringliteral">"\n"</font>,
00091                      uid);
00092       
00093       info = dbus_new0 (<a class="code" href="structDBusUserInfo.html">DBusUserInfo</a>, 1);
00094       <font class="keywordflow">if</font> (info == NULL)
00095         {
00096           dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
00097           <font class="keywordflow">return</font> NULL;
00098         }
00099 
00100       <font class="keywordflow">if</font> (uid != DBUS_UID_UNSET)
00101         {
00102           <font class="keywordflow">if</font> (!_dbus_user_info_fill_uid (info, uid, error))
00103             {
00104               _DBUS_ASSERT_ERROR_IS_SET (error);
00105               free_user_info (info);
00106               <font class="keywordflow">return</font> NULL;
00107             }
00108         }
00109       <font class="keywordflow">else</font>
00110         {
00111           <font class="keywordflow">if</font> (!_dbus_user_info_fill (info, username, error))
00112             {
00113               _DBUS_ASSERT_ERROR_IS_SET (error);
00114               free_user_info (info);
00115               <font class="keywordflow">return</font> NULL;
00116             }
00117         }
00118 
00119       <font class="comment">/* be sure we don't use these after here */</font>
00120       uid = DBUS_UID_UNSET;
00121       username = NULL;
00122 
00123       <font class="comment">/* insert into hash */</font>
00124       <font class="keywordflow">if</font> (!_dbus_hash_table_insert_ulong (db-&gt;<a class="code" href="structDBusUserDatabase.html#m1">users</a>, info-&gt;<a class="code" href="structDBusUserInfo.html#m0">uid</a>, info))
00125         {
00126           dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
00127           free_user_info (info);
00128           <font class="keywordflow">return</font> NULL;
00129         }
00130 
00131       <font class="keywordflow">if</font> (!_dbus_hash_table_insert_string (db-&gt;<a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a>,
00132                                            info-&gt;<a class="code" href="structDBusUserInfo.html#m4">username</a>,
00133                                            info))
00134         {
00135           _dbus_hash_table_remove_ulong (db-&gt;<a class="code" href="structDBusUserDatabase.html#m1">users</a>, info-&gt;<a class="code" href="structDBusUserInfo.html#m0">uid</a>);
00136           dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
00137           <font class="keywordflow">return</font> NULL;
00138         }
00139       
00140       <font class="keywordflow">return</font> info;
00141     }
00142 }
00143 
00144 <font class="keyword">static</font> <a class="code" href="structDBusGroupInfo.html">DBusGroupInfo</a>*
00145 _dbus_user_database_lookup_group (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a> *db,
00146                                   dbus_gid_t        gid,
00147                                   <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *groupname,
00148                                   <a class="code" href="structDBusError.html">DBusError</a>        *error)
00149 {
00150   <a class="code" href="structDBusGroupInfo.html">DBusGroupInfo</a> *info;
00151 
00152   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
00153 
00154   <font class="keywordflow">if</font> (gid != DBUS_GID_UNSET)
00155     info = _dbus_hash_table_lookup_ulong (db-&gt;<a class="code" href="structDBusUserDatabase.html#m2">groups</a>, gid);
00156   <font class="keywordflow">else</font>
00157     info = _dbus_hash_table_lookup_string (db-&gt;<a class="code" href="structDBusUserDatabase.html#m4">groups_by_name</a>,
00158                                            _dbus_string_get_const_data (groupname));
00159   <font class="keywordflow">if</font> (info)
00160     {
00161       _dbus_verbose (<font class="stringliteral">"Using cache for GID "</font>DBUS_GID_FORMAT<font class="stringliteral">" information\n"</font>,
00162                      gid);
00163       <font class="keywordflow">return</font> info;
00164     }
00165   <font class="keywordflow">else</font>
00166     {
00167       _dbus_verbose (<font class="stringliteral">"No cache for GID "</font>DBUS_GID_FORMAT<font class="stringliteral">"\n"</font>,
00168                      gid);
00169       
00170       info = dbus_new0 (<a class="code" href="structDBusGroupInfo.html">DBusGroupInfo</a>, 1);
00171       <font class="keywordflow">if</font> (info == NULL)
00172         {
00173           dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
00174           <font class="keywordflow">return</font> NULL;
00175         }
00176 
00177       <font class="keywordflow">if</font> (!_dbus_group_info_fill_gid (info, gid, error))
00178         {
00179           _DBUS_ASSERT_ERROR_IS_SET (error);
00180           free_group_info (info);
00181           <font class="keywordflow">return</font> NULL;
00182         }
00183 
00184       <font class="keywordflow">if</font> (!_dbus_hash_table_insert_ulong (db-&gt;<a class="code" href="structDBusUserDatabase.html#m2">groups</a>, info-&gt;<a class="code" href="structDBusGroupInfo.html#m0">gid</a>, info))
00185         {
00186           dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
00187           free_group_info (info);
00188           <font class="keywordflow">return</font> NULL;
00189         }
00190 
00191 
00192       <font class="keywordflow">if</font> (!_dbus_hash_table_insert_string (db-&gt;<a class="code" href="structDBusUserDatabase.html#m4">groups_by_name</a>,
00193                                            info-&gt;<a class="code" href="structDBusGroupInfo.html#m1">groupname</a>,
00194                                            info))
00195         {
00196           _dbus_hash_table_remove_ulong (db-&gt;<a class="code" href="structDBusUserDatabase.html#m2">groups</a>, info-&gt;<a class="code" href="structDBusGroupInfo.html#m0">gid</a>);
00197           dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
00198           <font class="keywordflow">return</font> NULL;
00199         }
00200       
00201       <font class="keywordflow">return</font> info;
00202     }
00203 }
00204 
00205 _DBUS_DEFINE_GLOBAL_LOCK(system_users);
00206 <font class="keyword">static</font> dbus_bool_t database_locked = FALSE;
00207 <font class="keyword">static</font> <a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a> *system_db = NULL;
00208 <font class="keyword">static</font> <a class="code" href="structDBusString.html">DBusString</a> process_username;
00209 <font class="keyword">static</font> <a class="code" href="structDBusString.html">DBusString</a> process_homedir;
00210       
00211 <font class="keyword">static</font> <font class="keywordtype">void</font>
00212 shutdown_system_db (<font class="keywordtype">void</font> *data)
00213 {
00214   _dbus_user_database_unref (system_db);
00215   system_db = NULL;
00216   _dbus_string_free (&amp;process_username);
00217   _dbus_string_free (&amp;process_homedir);
00218 }
00219 
00220 <font class="keyword">static</font> dbus_bool_t
00221 init_system_db (<font class="keywordtype">void</font>)
00222 {
00223   _dbus_assert (database_locked);
00224     
00225   <font class="keywordflow">if</font> (system_db == NULL)
00226     {
00227       <a class="code" href="structDBusError.html">DBusError</a> error;
00228       <font class="keyword">const</font> <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a> *info;
00229       
00230       system_db = _dbus_user_database_new ();
00231       <font class="keywordflow">if</font> (system_db == NULL)
00232         <font class="keywordflow">return</font> FALSE;
00233 
00234       dbus_error_init (&amp;error);
00235 
00236       <font class="keywordflow">if</font> (!_dbus_user_database_get_uid (system_db,
00237                                         _dbus_getuid (),
00238                                         &amp;info,
00239                                         &amp;error))
00240         {
00241           _dbus_user_database_unref (system_db);
00242           system_db = NULL;
00243           
00244           <font class="keywordflow">if</font> (dbus_error_has_name (&amp;error, DBUS_ERROR_NO_MEMORY))
00245             {
00246               dbus_error_free (&amp;error);
00247               <font class="keywordflow">return</font> FALSE;
00248             }
00249           <font class="keywordflow">else</font>
00250             {
00251               <font class="comment">/* This really should not happen. */</font>
00252               _dbus_warn (<font class="stringliteral">"Could not get password database information for UID of current process: %s\n"</font>,
00253                           error.<a class="code" href="structDBusError.html#m1">message</a>);
00254               dbus_error_free (&amp;error);
00255               <font class="keywordflow">return</font> FALSE;
00256             }
00257         }
00258 
00259       <font class="keywordflow">if</font> (!_dbus_string_init (&amp;process_username))
00260         {
00261           _dbus_user_database_unref (system_db);
00262           system_db = NULL;
00263           <font class="keywordflow">return</font> FALSE;
00264         }
00265 
00266       <font class="keywordflow">if</font> (!_dbus_string_init (&amp;process_homedir))
00267         {
00268           _dbus_string_free (&amp;process_username);
00269           _dbus_user_database_unref (system_db);
00270           system_db = NULL;
00271           <font class="keywordflow">return</font> FALSE;
00272         }
00273 
00274       <font class="keywordflow">if</font> (!_dbus_string_append (&amp;process_username,
00275                                 info-&gt;<a class="code" href="structDBusUserInfo.html#m4">username</a>) ||
00276           !_dbus_string_append (&amp;process_homedir,
00277                                 info-&gt;<a class="code" href="structDBusUserInfo.html#m5">homedir</a>) ||
00278           !_dbus_register_shutdown_func (shutdown_system_db, NULL))
00279         {
00280           _dbus_string_free (&amp;process_username);
00281           _dbus_string_free (&amp;process_homedir);
00282           _dbus_user_database_unref (system_db);
00283           system_db = NULL;
00284           <font class="keywordflow">return</font> FALSE;
00285         }
00286     }
00287 
00288   <font class="keywordflow">return</font> TRUE;
00289 }
00290 
00299 <font class="keywordtype">void</font>
<a name="l00300"></a><a class="code" href="group__DBusInternalsUtils.html#a112">00300</a> _dbus_user_database_lock_system (<font class="keywordtype">void</font>)
00301 {
00302   _DBUS_LOCK (system_users);
00303   database_locked = TRUE;
00304 }
00305 
00309 <font class="keywordtype">void</font>
<a name="l00310"></a><a class="code" href="group__DBusInternalsUtils.html#a113">00310</a> _dbus_user_database_unlock_system (<font class="keywordtype">void</font>)
00311 {
00312   database_locked = FALSE;
00313   _DBUS_UNLOCK (system_users);
00314 }
00315 
00322 <a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>*
<a name="l00323"></a><a class="code" href="group__DBusInternalsUtils.html#a114">00323</a> _dbus_user_database_get_system (<font class="keywordtype">void</font>)
00324 {
00325   _dbus_assert (database_locked);
00326 
00327   init_system_db ();
00328   
00329   <font class="keywordflow">return</font> system_db;
00330 }
00331 
00339 dbus_bool_t
<a name="l00340"></a><a class="code" href="group__DBusInternalsUtils.html#a115">00340</a> _dbus_username_from_current_process (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> **username)
00341 {
00342   _dbus_user_database_lock_system ();
00343   <font class="keywordflow">if</font> (!init_system_db ())
00344     {
00345       _dbus_user_database_unlock_system ();
00346       <font class="keywordflow">return</font> FALSE;
00347     }
00348   *username = &amp;process_username;
00349   _dbus_user_database_unlock_system ();  
00350 
00351   <font class="keywordflow">return</font> TRUE;
00352 }
00353 
00361 dbus_bool_t
<a name="l00362"></a><a class="code" href="group__DBusInternalsUtils.html#a116">00362</a> _dbus_homedir_from_current_process (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  **homedir)
00363 {
00364   _dbus_user_database_lock_system ();
00365   <font class="keywordflow">if</font> (!init_system_db ())
00366     {
00367       _dbus_user_database_unlock_system ();
00368       <font class="keywordflow">return</font> FALSE;
00369     }
00370   *homedir = &amp;process_homedir;
00371   _dbus_user_database_unlock_system ();
00372 
00373   <font class="keywordflow">return</font> TRUE;
00374 }
00375 
00383 dbus_bool_t
<a name="l00384"></a><a class="code" href="group__DBusInternalsUtils.html#a117">00384</a> _dbus_get_user_id (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *username,
00385                    dbus_uid_t        *uid)
00386 {
00387   <a class="code" href="structDBusCredentials.html">DBusCredentials</a> creds;
00388 
00389   <font class="keywordflow">if</font> (!_dbus_credentials_from_username (username, &amp;creds))
00390     <font class="keywordflow">return</font> FALSE;
00391 
00392   <font class="keywordflow">if</font> (creds.<a class="code" href="structDBusCredentials.html#m1">uid</a> == DBUS_UID_UNSET)
00393     <font class="keywordflow">return</font> FALSE;
00394 
00395   *uid = creds.<a class="code" href="structDBusCredentials.html#m1">uid</a>;
00396 
00397   <font class="keywordflow">return</font> TRUE;
00398 }
00399 
00407 dbus_bool_t
<a name="l00408"></a><a class="code" href="group__DBusInternalsUtils.html#a118">00408</a> _dbus_get_group_id (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *groupname,
00409                     dbus_gid_t        *gid)
00410 {
00411   <a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a> *db;
00412   <font class="keyword">const</font> <a class="code" href="structDBusGroupInfo.html">DBusGroupInfo</a> *info;
00413   _dbus_user_database_lock_system ();
00414 
00415   db = _dbus_user_database_get_system ();
00416   <font class="keywordflow">if</font> (db == NULL)
00417     {
00418       _dbus_user_database_unlock_system ();
00419       <font class="keywordflow">return</font> FALSE;
00420     }
00421 
00422   <font class="keywordflow">if</font> (!_dbus_user_database_get_groupname (db, groupname,
00423                                           &amp;info, NULL))
00424     {
00425       _dbus_user_database_unlock_system ();
00426       <font class="keywordflow">return</font> FALSE;
00427     }
00428 
00429   *gid = info-&gt;<a class="code" href="structDBusGroupInfo.html#m0">gid</a>;
00430   
00431   _dbus_user_database_unlock_system ();
00432   <font class="keywordflow">return</font> TRUE;
00433 }
00434 
00442 dbus_bool_t
<a name="l00443"></a><a class="code" href="group__DBusInternalsUtils.html#a119">00443</a> _dbus_homedir_from_username (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *username,
00444                              <a class="code" href="structDBusString.html">DBusString</a>       *homedir)
00445 {
00446   <a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a> *db;
00447   <font class="keyword">const</font> <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a> *info;
00448   _dbus_user_database_lock_system ();
00449 
00450   db = _dbus_user_database_get_system ();
00451   <font class="keywordflow">if</font> (db == NULL)
00452     {
00453       _dbus_user_database_unlock_system ();
00454       <font class="keywordflow">return</font> FALSE;
00455     }
00456 
00457   <font class="keywordflow">if</font> (!_dbus_user_database_get_username (db, username,
00458                                          &amp;info, NULL))
00459     {
00460       _dbus_user_database_unlock_system ();
00461       <font class="keywordflow">return</font> FALSE;
00462     }
00463 
00464   <font class="keywordflow">if</font> (!_dbus_string_append (homedir, info-&gt;<a class="code" href="structDBusUserInfo.html#m5">homedir</a>))
00465     {
00466       _dbus_user_database_unlock_system ();
00467       <font class="keywordflow">return</font> FALSE;
00468     }
00469   
00470   _dbus_user_database_unlock_system ();
00471   <font class="keywordflow">return</font> TRUE;
00472 }
00473 
00481 dbus_bool_t
<a name="l00482"></a><a class="code" href="group__DBusInternalsUtils.html#a120">00482</a> _dbus_uid_from_string (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>      *uid_str,
00483                        dbus_uid_t            *uid)
00484 {
00485   <font class="keywordtype">int</font> end;
00486   <font class="keywordtype">long</font> val;
00487   
00488   <font class="keywordflow">if</font> (_dbus_string_get_length (uid_str) == 0)
00489     {
00490       _dbus_verbose (<font class="stringliteral">"UID string was zero length\n"</font>);
00491       <font class="keywordflow">return</font> FALSE;
00492     }
00493 
00494   val = -1;
00495   end = 0;
00496   <font class="keywordflow">if</font> (!_dbus_string_parse_int (uid_str, 0, &amp;val,
00497                                &amp;end))
00498     {
00499       _dbus_verbose (<font class="stringliteral">"could not parse string as a UID\n"</font>);
00500       <font class="keywordflow">return</font> FALSE;
00501     }
00502   
00503   <font class="keywordflow">if</font> (end != _dbus_string_get_length (uid_str))
00504     {
00505       _dbus_verbose (<font class="stringliteral">"string contained trailing stuff after UID\n"</font>);
00506       <font class="keywordflow">return</font> FALSE;
00507     }
00508 
00509   *uid = val;
00510 
00511   <font class="keywordflow">return</font> TRUE;
00512 }
00513 
00521 dbus_bool_t
<a name="l00522"></a><a class="code" href="group__DBusInternalsUtils.html#a121">00522</a> _dbus_credentials_from_username (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *username,
00523                                  <a class="code" href="structDBusCredentials.html">DBusCredentials</a>  *credentials)
00524 {
00525   <a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a> *db;
00526   <font class="keyword">const</font> <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a> *info;
00527   _dbus_user_database_lock_system ();
00528 
00529   db = _dbus_user_database_get_system ();
00530   <font class="keywordflow">if</font> (db == NULL)
00531     {
00532       _dbus_user_database_unlock_system ();
00533       <font class="keywordflow">return</font> FALSE;
00534     }
00535 
00536   <font class="keywordflow">if</font> (!_dbus_user_database_get_username (db, username,
00537                                          &amp;info, NULL))
00538     {
00539       _dbus_user_database_unlock_system ();
00540       <font class="keywordflow">return</font> FALSE;
00541     }
00542 
00543   credentials-&gt;<a class="code" href="structDBusCredentials.html#m0">pid</a> = DBUS_PID_UNSET;
00544   credentials-&gt;<a class="code" href="structDBusCredentials.html#m1">uid</a> = info-&gt;<a class="code" href="structDBusUserInfo.html#m0">uid</a>;
00545   credentials-&gt;<a class="code" href="structDBusCredentials.html#m2">gid</a> = info-&gt;<a class="code" href="structDBusUserInfo.html#m1">primary_gid</a>;
00546   
00547   _dbus_user_database_unlock_system ();
00548   <font class="keywordflow">return</font> TRUE;
00549 }
00550 
00558 dbus_bool_t
<a name="l00559"></a><a class="code" href="group__DBusInternalsUtils.html#a122">00559</a> _dbus_credentials_from_uid (dbus_uid_t        uid,
00560                             <a class="code" href="structDBusCredentials.html">DBusCredentials</a>  *credentials)
00561 {
00562   <a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a> *db;
00563   <font class="keyword">const</font> <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a> *info;
00564   _dbus_user_database_lock_system ();
00565 
00566   db = _dbus_user_database_get_system ();
00567   <font class="keywordflow">if</font> (db == NULL)
00568     {
00569       _dbus_user_database_unlock_system ();
00570       <font class="keywordflow">return</font> FALSE;
00571     }
00572 
00573   <font class="keywordflow">if</font> (!_dbus_user_database_get_uid (db, uid,
00574                                     &amp;info, NULL))
00575     {
00576       _dbus_user_database_unlock_system ();
00577       <font class="keywordflow">return</font> FALSE;
00578     }
00579 
00580   _dbus_assert (info-&gt;<a class="code" href="structDBusUserInfo.html#m0">uid</a> == uid);
00581   
00582   credentials-&gt;<a class="code" href="structDBusCredentials.html#m0">pid</a> = DBUS_PID_UNSET;
00583   credentials-&gt;<a class="code" href="structDBusCredentials.html#m1">uid</a> = info-&gt;<a class="code" href="structDBusUserInfo.html#m0">uid</a>;
00584   credentials-&gt;<a class="code" href="structDBusCredentials.html#m2">gid</a> = info-&gt;<a class="code" href="structDBusUserInfo.html#m1">primary_gid</a>;
00585   
00586   _dbus_user_database_unlock_system ();
00587   <font class="keywordflow">return</font> TRUE;
00588 }
00589 
00595 <a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>*
<a name="l00596"></a><a class="code" href="group__DBusInternalsUtils.html#a123">00596</a> _dbus_user_database_new (<font class="keywordtype">void</font>)
00597 {
00598   <a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a> *db;
00599   
00600   db = dbus_new0 (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>, 1);
00601   <font class="keywordflow">if</font> (db == NULL)
00602     <font class="keywordflow">return</font> NULL;
00603 
00604   db-&gt;<a class="code" href="structDBusUserDatabase.html#m0">refcount</a> = 1;
00605 
00606   db-&gt;<a class="code" href="structDBusUserDatabase.html#m1">users</a> = _dbus_hash_table_new (DBUS_HASH_ULONG,
00607                                     NULL, free_user_info);
00608   
00609   <font class="keywordflow">if</font> (db-&gt;<a class="code" href="structDBusUserDatabase.html#m1">users</a> == NULL)
00610     <font class="keywordflow">goto</font> failed;
00611 
00612   db-&gt;<a class="code" href="structDBusUserDatabase.html#m2">groups</a> = _dbus_hash_table_new (DBUS_HASH_ULONG,
00613                                      NULL, free_group_info);
00614   
00615   <font class="keywordflow">if</font> (db-&gt;<a class="code" href="structDBusUserDatabase.html#m2">groups</a> == NULL)
00616     <font class="keywordflow">goto</font> failed;
00617 
00618   db-&gt;<a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a> = _dbus_hash_table_new (DBUS_HASH_STRING,
00619                                             NULL, NULL);
00620   <font class="keywordflow">if</font> (db-&gt;<a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a> == NULL)
00621     <font class="keywordflow">goto</font> failed;
00622   
00623   db-&gt;<a class="code" href="structDBusUserDatabase.html#m4">groups_by_name</a> = _dbus_hash_table_new (DBUS_HASH_STRING,
00624                                              NULL, NULL);
00625   <font class="keywordflow">if</font> (db-&gt;<a class="code" href="structDBusUserDatabase.html#m4">groups_by_name</a> == NULL)
00626     <font class="keywordflow">goto</font> failed;
00627   
00628   <font class="keywordflow">return</font> db;
00629   
00630  failed:
00631   _dbus_user_database_unref (db);
00632   <font class="keywordflow">return</font> NULL;
00633 }
00634 
00640 <a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a> *
<a name="l00641"></a><a class="code" href="group__DBusInternalsUtils.html#a124">00641</a> _dbus_user_database_ref (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>  *db)
00642 {
00643   _dbus_assert (db-&gt;<a class="code" href="structDBusUserDatabase.html#m0">refcount</a> &gt; 0);
00644 
00645   db-&gt;<a class="code" href="structDBusUserDatabase.html#m0">refcount</a> += 1;
00646 
00647   <font class="keywordflow">return</font> db;
00648 }
00649 
00654 <font class="keywordtype">void</font>
<a name="l00655"></a><a class="code" href="group__DBusInternalsUtils.html#a125">00655</a> _dbus_user_database_unref (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>  *db)
00656 {
00657   _dbus_assert (db-&gt;<a class="code" href="structDBusUserDatabase.html#m0">refcount</a> &gt; 0);
00658 
00659   db-&gt;<a class="code" href="structDBusUserDatabase.html#m0">refcount</a> -= 1;
00660   <font class="keywordflow">if</font> (db-&gt;<a class="code" href="structDBusUserDatabase.html#m0">refcount</a> == 0)
00661     {
00662       <font class="keywordflow">if</font> (db-&gt;<a class="code" href="structDBusUserDatabase.html#m1">users</a>)
00663         _dbus_hash_table_unref (db-&gt;<a class="code" href="structDBusUserDatabase.html#m1">users</a>);
00664 
00665       <font class="keywordflow">if</font> (db-&gt;<a class="code" href="structDBusUserDatabase.html#m2">groups</a>)
00666         _dbus_hash_table_unref (db-&gt;<a class="code" href="structDBusUserDatabase.html#m2">groups</a>);
00667 
00668       <font class="keywordflow">if</font> (db-&gt;<a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a>)
00669         _dbus_hash_table_unref (db-&gt;<a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a>);
00670 
00671       <font class="keywordflow">if</font> (db-&gt;<a class="code" href="structDBusUserDatabase.html#m4">groups_by_name</a>)
00672         _dbus_hash_table_unref (db-&gt;<a class="code" href="structDBusUserDatabase.html#m4">groups_by_name</a>);
00673       
00674       dbus_free (db);
00675     }
00676 }
00677 
00691 dbus_bool_t
<a name="l00692"></a><a class="code" href="group__DBusInternalsUtils.html#a126">00692</a> _dbus_user_database_get_groups (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>  *db,
00693                                 dbus_uid_t         uid,
00694                                 dbus_gid_t       **group_ids,
00695                                 <font class="keywordtype">int</font>               *n_group_ids,
00696                                 <a class="code" href="structDBusError.html">DBusError</a>         *error)
00697 {
00698   <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a> *info;
00699   
00700   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
00701 
00702   *group_ids = NULL;
00703   *n_group_ids = 0;
00704   
00705   info = _dbus_user_database_lookup (db, uid, NULL, error);
00706   <font class="keywordflow">if</font> (info == NULL)
00707     {
00708       _DBUS_ASSERT_ERROR_IS_SET (error);
00709       <font class="keywordflow">return</font> FALSE;
00710     }
00711 
00712   <font class="keywordflow">if</font> (info-&gt;<a class="code" href="structDBusUserInfo.html#m3">n_group_ids</a> &gt; 0)
00713     {
00714       *group_ids = dbus_new (dbus_gid_t, info-&gt;<a class="code" href="structDBusUserInfo.html#m3">n_group_ids</a>);
00715       <font class="keywordflow">if</font> (*group_ids == NULL)
00716         {
00717           dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
00718           <font class="keywordflow">return</font> FALSE;
00719         }
00720 
00721       *n_group_ids = info-&gt;<a class="code" href="structDBusUserInfo.html#m3">n_group_ids</a>;
00722 
00723       memcpy (*group_ids, info-&gt;<a class="code" href="structDBusUserInfo.html#m2">group_ids</a>, info-&gt;<a class="code" href="structDBusUserInfo.html#m3">n_group_ids</a> * sizeof (dbus_gid_t));
00724     }
00725 
00726   <font class="keywordflow">return</font> TRUE;
00727 }
00728 
00739 dbus_bool_t
<a name="l00740"></a><a class="code" href="group__DBusInternalsUtils.html#a127">00740</a> _dbus_user_database_get_uid (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>    *db,
00741                              dbus_uid_t           uid,
00742                              <font class="keyword">const</font> <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a> **info,
00743                              <a class="code" href="structDBusError.html">DBusError</a>           *error)
00744 {
00745   *info = _dbus_user_database_lookup (db, uid, NULL, error);
00746   <font class="keywordflow">return</font> *info != NULL;
00747 }
00748 
00759 dbus_bool_t
<a name="l00760"></a><a class="code" href="group__DBusInternalsUtils.html#a128">00760</a> _dbus_user_database_get_gid (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>     *db,
00761                              dbus_gid_t            gid,
00762                              <font class="keyword">const</font> <a class="code" href="structDBusGroupInfo.html">DBusGroupInfo</a> **info,
00763                              <a class="code" href="structDBusError.html">DBusError</a>            *error)
00764 {
00765   *info = _dbus_user_database_lookup_group (db, gid, NULL, error);
00766   <font class="keywordflow">return</font> *info != NULL;
00767 }
00768 
00778 dbus_bool_t
<a name="l00779"></a><a class="code" href="group__DBusInternalsUtils.html#a129">00779</a> _dbus_user_database_get_username  (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>     *db,
00780                                    <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>     *username,
00781                                    <font class="keyword">const</font> <a class="code" href="structDBusUserInfo.html">DBusUserInfo</a>  **info,
00782                                    <a class="code" href="structDBusError.html">DBusError</a>            *error)
00783 {
00784   *info = _dbus_user_database_lookup (db, DBUS_UID_UNSET, username, error);
00785   <font class="keywordflow">return</font> *info != NULL;
00786 }
00787 
00798 dbus_bool_t
<a name="l00799"></a><a class="code" href="group__DBusInternalsUtils.html#a130">00799</a> _dbus_user_database_get_groupname (<a class="code" href="structDBusUserDatabase.html">DBusUserDatabase</a>     *db,
00800                                    <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>     *groupname,
00801                                    <font class="keyword">const</font> <a class="code" href="structDBusGroupInfo.html">DBusGroupInfo</a> **info,
00802                                    <a class="code" href="structDBusError.html">DBusError</a>            *error)
00803 {
00804   *info = _dbus_user_database_lookup_group (db, DBUS_GID_UNSET, groupname, error);
00805   <font class="keywordflow">return</font> *info != NULL;
00806 }
00807 
00810 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
00811 <font class="preprocessor"></font><font class="preprocessor">#include &lt;stdio.h&gt;</font>
00812 
00818 dbus_bool_t
00819 _dbus_userdb_test (<font class="keyword">const</font> <font class="keywordtype">char</font> *test_data_dir)
00820 {
00821   <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *username;
00822   <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *homedir;
00823 
00824   <font class="keywordflow">if</font> (!_dbus_username_from_current_process (&amp;username))
00825     _dbus_assert_not_reached (<font class="stringliteral">"didn't get username"</font>);
00826 
00827   <font class="keywordflow">if</font> (!_dbus_homedir_from_current_process (&amp;homedir))
00828     _dbus_assert_not_reached (<font class="stringliteral">"didn't get homedir"</font>);  
00829 
00830   printf (<font class="stringliteral">"    Current user: %s homedir: %s\n"</font>,
00831           _dbus_string_get_const_data (username),
00832           _dbus_string_get_const_data (homedir));
00833   
00834   <font class="keywordflow">return</font> TRUE;
00835 }
00836 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_BUILD_TESTS */</font>
</pre></div><hr><address align="right"><small>Generated on Wed Jun 9 05:01:27 2004 for D-BUS by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.15 </small></address>
</body>
</html>