<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="pages.html">Related Pages</a> </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 <string.h></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-><a class="code" href="structDBusUserDatabase.html#m1">users</a>, uid); 00079 <font class="keywordflow">else</font> 00080 info = _dbus_hash_table_lookup_string (db-><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-><a class="code" href="structDBusUserDatabase.html#m1">users</a>, info-><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-><a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a>, 00132 info-><a class="code" href="structDBusUserInfo.html#m4">username</a>, 00133 info)) 00134 { 00135 _dbus_hash_table_remove_ulong (db-><a class="code" href="structDBusUserDatabase.html#m1">users</a>, info-><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-><a class="code" href="structDBusUserDatabase.html#m2">groups</a>, gid); 00156 <font class="keywordflow">else</font> 00157 info = _dbus_hash_table_lookup_string (db-><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-><a class="code" href="structDBusUserDatabase.html#m2">groups</a>, info-><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-><a class="code" href="structDBusUserDatabase.html#m4">groups_by_name</a>, 00193 info-><a class="code" href="structDBusGroupInfo.html#m1">groupname</a>, 00194 info)) 00195 { 00196 _dbus_hash_table_remove_ulong (db-><a class="code" href="structDBusUserDatabase.html#m2">groups</a>, info-><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 (&process_username); 00217 _dbus_string_free (&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 (&error); 00235 00236 <font class="keywordflow">if</font> (!_dbus_user_database_get_uid (system_db, 00237 _dbus_getuid (), 00238 &info, 00239 &error)) 00240 { 00241 _dbus_user_database_unref (system_db); 00242 system_db = NULL; 00243 00244 <font class="keywordflow">if</font> (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 00245 { 00246 dbus_error_free (&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 (&error); 00255 <font class="keywordflow">return</font> FALSE; 00256 } 00257 } 00258 00259 <font class="keywordflow">if</font> (!_dbus_string_init (&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 (&process_homedir)) 00267 { 00268 _dbus_string_free (&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 (&process_username, 00275 info-><a class="code" href="structDBusUserInfo.html#m4">username</a>) || 00276 !_dbus_string_append (&process_homedir, 00277 info-><a class="code" href="structDBusUserInfo.html#m5">homedir</a>) || 00278 !_dbus_register_shutdown_func (shutdown_system_db, NULL)) 00279 { 00280 _dbus_string_free (&process_username); 00281 _dbus_string_free (&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 = &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 = &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, &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 &info, NULL)) 00424 { 00425 _dbus_user_database_unlock_system (); 00426 <font class="keywordflow">return</font> FALSE; 00427 } 00428 00429 *gid = info-><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 &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-><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, &val, 00497 &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 &info, NULL)) 00538 { 00539 _dbus_user_database_unlock_system (); 00540 <font class="keywordflow">return</font> FALSE; 00541 } 00542 00543 credentials-><a class="code" href="structDBusCredentials.html#m0">pid</a> = DBUS_PID_UNSET; 00544 credentials-><a class="code" href="structDBusCredentials.html#m1">uid</a> = info-><a class="code" href="structDBusUserInfo.html#m0">uid</a>; 00545 credentials-><a class="code" href="structDBusCredentials.html#m2">gid</a> = info-><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 &info, NULL)) 00575 { 00576 _dbus_user_database_unlock_system (); 00577 <font class="keywordflow">return</font> FALSE; 00578 } 00579 00580 _dbus_assert (info-><a class="code" href="structDBusUserInfo.html#m0">uid</a> == uid); 00581 00582 credentials-><a class="code" href="structDBusCredentials.html#m0">pid</a> = DBUS_PID_UNSET; 00583 credentials-><a class="code" href="structDBusCredentials.html#m1">uid</a> = info-><a class="code" href="structDBusUserInfo.html#m0">uid</a>; 00584 credentials-><a class="code" href="structDBusCredentials.html#m2">gid</a> = info-><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-><a class="code" href="structDBusUserDatabase.html#m0">refcount</a> = 1; 00605 00606 db-><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-><a class="code" href="structDBusUserDatabase.html#m1">users</a> == NULL) 00610 <font class="keywordflow">goto</font> failed; 00611 00612 db-><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-><a class="code" href="structDBusUserDatabase.html#m2">groups</a> == NULL) 00616 <font class="keywordflow">goto</font> failed; 00617 00618 db-><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-><a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a> == NULL) 00621 <font class="keywordflow">goto</font> failed; 00622 00623 db-><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-><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-><a class="code" href="structDBusUserDatabase.html#m0">refcount</a> > 0); 00644 00645 db-><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-><a class="code" href="structDBusUserDatabase.html#m0">refcount</a> > 0); 00658 00659 db-><a class="code" href="structDBusUserDatabase.html#m0">refcount</a> -= 1; 00660 <font class="keywordflow">if</font> (db-><a class="code" href="structDBusUserDatabase.html#m0">refcount</a> == 0) 00661 { 00662 <font class="keywordflow">if</font> (db-><a class="code" href="structDBusUserDatabase.html#m1">users</a>) 00663 _dbus_hash_table_unref (db-><a class="code" href="structDBusUserDatabase.html#m1">users</a>); 00664 00665 <font class="keywordflow">if</font> (db-><a class="code" href="structDBusUserDatabase.html#m2">groups</a>) 00666 _dbus_hash_table_unref (db-><a class="code" href="structDBusUserDatabase.html#m2">groups</a>); 00667 00668 <font class="keywordflow">if</font> (db-><a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a>) 00669 _dbus_hash_table_unref (db-><a class="code" href="structDBusUserDatabase.html#m3">users_by_name</a>); 00670 00671 <font class="keywordflow">if</font> (db-><a class="code" href="structDBusUserDatabase.html#m4">groups_by_name</a>) 00672 _dbus_hash_table_unref (db-><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-><a class="code" href="structDBusUserInfo.html#m3">n_group_ids</a> > 0) 00713 { 00714 *group_ids = dbus_new (dbus_gid_t, info-><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-><a class="code" href="structDBusUserInfo.html#m3">n_group_ids</a>; 00722 00723 memcpy (*group_ids, info-><a class="code" href="structDBusUserInfo.html#m2">group_ids</a>, info-><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 <stdio.h></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 (&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 (&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>