<!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-transport.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-transport.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font> 00002 <font class="comment">/* dbus-transport.c DBusTransport object (internal to D-BUS implementation)</font> 00003 <font class="comment"> *</font> 00004 <font class="comment"> * Copyright (C) 2002, 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 00024 <font class="preprocessor">#include "dbus-transport-protected.h"</font> 00025 <font class="preprocessor">#include "dbus-transport-unix.h"</font> 00026 <font class="preprocessor">#include "dbus-connection-internal.h"</font> 00027 <font class="preprocessor">#include "dbus-watch.h"</font> 00028 <font class="preprocessor">#include "dbus-auth.h"</font> 00029 <font class="preprocessor">#include "dbus-address.h"</font> 00030 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font> 00031 <font class="preprocessor"></font><font class="preprocessor">#include "dbus-server-debug-pipe.h"</font> 00032 <font class="preprocessor">#endif</font> 00033 <font class="preprocessor"></font> 00055 <font class="keyword">static</font> <font class="keywordtype">void</font> 00056 live_messages_size_notify (<a class="code" href="structDBusCounter.html">DBusCounter</a> *counter, 00057 <font class="keywordtype">void</font> *user_data) 00058 { 00059 <a class="code" href="structDBusTransport.html">DBusTransport</a> *transport = user_data; 00060 00061 _dbus_transport_ref (transport); 00062 00063 <font class="preprocessor">#if 0</font> 00064 <font class="preprocessor"></font> _dbus_verbose (<font class="stringliteral">"Counter value is now %d\n"</font>, 00065 (<font class="keywordtype">int</font>) _dbus_counter_get_value (counter)); 00066 <font class="preprocessor">#endif</font> 00067 <font class="preprocessor"></font> 00068 <font class="comment">/* disable or re-enable the read watch for the transport if</font> 00069 <font class="comment"> * required.</font> 00070 <font class="comment"> */</font> 00071 <font class="keywordflow">if</font> (* transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m6">live_messages_changed</a>) 00072 (* transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m6">live_messages_changed</a>) (transport); 00073 00074 _dbus_transport_unref (transport); 00075 } 00076 00087 dbus_bool_t <a name="l00088"></a><a class="code" href="group__DBusTransport.html#a1">00088</a> _dbus_transport_init_base (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00089 <font class="keyword">const</font> <a class="code" href="structDBusTransportVTable.html">DBusTransportVTable</a> *vtable, 00090 dbus_bool_t server, 00091 <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *address) 00092 { 00093 <a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader; 00094 <a class="code" href="structDBusAuth.html">DBusAuth</a> *auth; 00095 <a class="code" href="structDBusCounter.html">DBusCounter</a> *counter; 00096 <font class="keywordtype">char</font> *address_copy; 00097 00098 loader = _dbus_message_loader_new (); 00099 <font class="keywordflow">if</font> (loader == NULL) 00100 <font class="keywordflow">return</font> FALSE; 00101 00102 <font class="keywordflow">if</font> (server) 00103 auth = _dbus_auth_server_new (); 00104 <font class="keywordflow">else</font> 00105 auth = _dbus_auth_client_new (); 00106 <font class="keywordflow">if</font> (auth == NULL) 00107 { 00108 _dbus_message_loader_unref (loader); 00109 <font class="keywordflow">return</font> FALSE; 00110 } 00111 00112 counter = _dbus_counter_new (); 00113 <font class="keywordflow">if</font> (counter == NULL) 00114 { 00115 _dbus_auth_unref (auth); 00116 _dbus_message_loader_unref (loader); 00117 <font class="keywordflow">return</font> FALSE; 00118 } 00119 00120 <font class="keywordflow">if</font> (server) 00121 { 00122 _dbus_assert (address == NULL); 00123 address_copy = NULL; 00124 } 00125 <font class="keywordflow">else</font> 00126 { 00127 _dbus_assert (address != NULL); 00128 00129 <font class="keywordflow">if</font> (!_dbus_string_copy_data (address, &address_copy)) 00130 { 00131 _dbus_counter_unref (counter); 00132 _dbus_auth_unref (auth); 00133 _dbus_message_loader_unref (loader); 00134 <font class="keywordflow">return</font> FALSE; 00135 } 00136 } 00137 00138 transport-><a class="code" href="structDBusTransport.html#m0">refcount</a> = 1; 00139 transport-><a class="code" href="structDBusTransport.html#m1">vtable</a> = vtable; 00140 transport-><a class="code" href="structDBusTransport.html#m3">loader</a> = loader; 00141 transport-><a class="code" href="structDBusTransport.html#m4">auth</a> = auth; 00142 transport-><a class="code" href="structDBusTransport.html#m7">live_messages_size</a> = counter; 00143 transport-><a class="code" href="structDBusTransport.html#m13">authenticated</a> = FALSE; 00144 transport-><a class="code" href="structDBusTransport.html#m14">messages_need_sending</a> = FALSE; 00145 transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a> = FALSE; 00146 transport-><a class="code" href="structDBusTransport.html#m15">send_credentials_pending</a> = !server; 00147 transport-><a class="code" href="structDBusTransport.html#m16">receive_credentials_pending</a> = server; 00148 transport-><a class="code" href="structDBusTransport.html#m17">is_server</a> = server; 00149 transport-><a class="code" href="structDBusTransport.html#m8">address</a> = address_copy; 00150 00151 transport-><a class="code" href="structDBusTransport.html#m9">unix_user_function</a> = NULL; 00152 transport-><a class="code" href="structDBusTransport.html#m10">unix_user_data</a> = NULL; 00153 transport-><a class="code" href="structDBusTransport.html#m11">free_unix_user_data</a> = NULL; 00154 00155 <font class="comment">/* Try to default to something that won't totally hose the system,</font> 00156 <font class="comment"> * but doesn't impose too much of a limitation.</font> 00157 <font class="comment"> */</font> 00158 transport-><a class="code" href="structDBusTransport.html#m6">max_live_messages_size</a> = _DBUS_ONE_MEGABYTE * 63; 00159 00160 transport-><a class="code" href="structDBusTransport.html#m5">credentials</a>.<a class="code" href="structDBusCredentials.html#m0">pid</a> = -1; 00161 transport-><a class="code" href="structDBusTransport.html#m5">credentials</a>.<a class="code" href="structDBusCredentials.html#m1">uid</a> = -1; 00162 transport-><a class="code" href="structDBusTransport.html#m5">credentials</a>.<a class="code" href="structDBusCredentials.html#m2">gid</a> = -1; 00163 00164 _dbus_counter_set_notify (transport-><a class="code" href="structDBusTransport.html#m7">live_messages_size</a>, 00165 transport-><a class="code" href="structDBusTransport.html#m6">max_live_messages_size</a>, 00166 live_messages_size_notify, 00167 transport); 00168 00169 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m8">address</a>) 00170 _dbus_verbose (<font class="stringliteral">"Initialized transport on address %s\n"</font>, transport-><a class="code" href="structDBusTransport.html#m8">address</a>); 00171 00172 <font class="keywordflow">return</font> TRUE; 00173 } 00174 00181 <font class="keywordtype">void</font> <a name="l00182"></a><a class="code" href="group__DBusTransport.html#a2">00182</a> _dbus_transport_finalize_base (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00183 { 00184 <font class="keywordflow">if</font> (!transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a>) 00185 _dbus_transport_disconnect (transport); 00186 00187 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m11">free_unix_user_data</a> != NULL) 00188 (* transport-><a class="code" href="structDBusTransport.html#m11">free_unix_user_data</a>) (transport-><a class="code" href="structDBusTransport.html#m10">unix_user_data</a>); 00189 00190 _dbus_message_loader_unref (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>); 00191 _dbus_auth_unref (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>); 00192 _dbus_counter_set_notify (transport-><a class="code" href="structDBusTransport.html#m7">live_messages_size</a>, 00193 0, NULL, NULL); 00194 _dbus_counter_unref (transport-><a class="code" href="structDBusTransport.html#m7">live_messages_size</a>); 00195 dbus_free (transport-><a class="code" href="structDBusTransport.html#m8">address</a>); 00196 } 00197 00209 <a class="code" href="structDBusTransport.html">DBusTransport</a>* <a name="l00210"></a><a class="code" href="group__DBusTransport.html#a3">00210</a> _dbus_transport_open (<font class="keyword">const</font> <font class="keywordtype">char</font> *address, 00211 <a class="code" href="structDBusError.html">DBusError</a> *error) 00212 { 00213 <a class="code" href="structDBusTransport.html">DBusTransport</a> *transport; 00214 <a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> **entries; 00215 <a class="code" href="structDBusError.html">DBusError</a> tmp_error; 00216 <a class="code" href="structDBusError.html">DBusError</a> first_error; 00217 <font class="keywordtype">int</font> len, i; 00218 <font class="keyword">const</font> <font class="keywordtype">char</font> *address_problem_type; 00219 <font class="keyword">const</font> <font class="keywordtype">char</font> *address_problem_field; 00220 <font class="keyword">const</font> <font class="keywordtype">char</font> *address_problem_other; 00221 00222 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 00223 00224 <font class="keywordflow">if</font> (!dbus_parse_address (address, &entries, &len, error)) 00225 <font class="keywordflow">return</font> NULL; 00226 00227 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 00228 00229 transport = NULL; 00230 address_problem_type = NULL; 00231 address_problem_field = NULL; 00232 address_problem_other = NULL; 00233 00234 dbus_error_init (&tmp_error); 00235 dbus_error_init (&first_error); 00236 <font class="keywordflow">for</font> (i = 0; i < len; i++) 00237 { 00238 <font class="keyword">const</font> <font class="keywordtype">char</font> *method; 00239 00240 method = dbus_address_entry_get_method (entries[i]); 00241 00242 <font class="keywordflow">if</font> (strcmp (method, <font class="stringliteral">"unix"</font>) == 0) 00243 { 00244 <font class="keyword">const</font> <font class="keywordtype">char</font> *path = dbus_address_entry_get_value (entries[i], <font class="stringliteral">"path"</font>); 00245 <font class="keyword">const</font> <font class="keywordtype">char</font> *tmpdir = dbus_address_entry_get_value (entries[i], <font class="stringliteral">"tmpdir"</font>); 00246 <font class="keyword">const</font> <font class="keywordtype">char</font> *<font class="keyword">abstract</font> = dbus_address_entry_get_value (entries[i], <font class="stringliteral">"abstract"</font>); 00247 00248 <font class="keywordflow">if</font> (tmpdir != NULL) 00249 { 00250 address_problem_other = <font class="stringliteral">"cannot use the \"tmpdir\" option for an address to connect to, only in an address to listen on"</font>; 00251 <font class="keywordflow">goto</font> bad_address; 00252 } 00253 00254 <font class="keywordflow">if</font> (path == NULL && <font class="keyword">abstract</font> == NULL) 00255 { 00256 address_problem_type = <font class="stringliteral">"unix"</font>; 00257 address_problem_field = <font class="stringliteral">"path or abstract"</font>; 00258 <font class="keywordflow">goto</font> bad_address; 00259 } 00260 00261 <font class="keywordflow">if</font> (path != NULL && <font class="keyword">abstract</font> != NULL) 00262 { 00263 address_problem_other = <font class="stringliteral">"can't specify both \"path\" and \"abstract\" options in an address"</font>; 00264 <font class="keywordflow">goto</font> bad_address; 00265 } 00266 00267 <font class="keywordflow">if</font> (path) 00268 transport = _dbus_transport_new_for_domain_socket (path, FALSE, 00269 &tmp_error); 00270 <font class="keywordflow">else</font> 00271 transport = _dbus_transport_new_for_domain_socket (<font class="keyword">abstract</font>, TRUE, 00272 &tmp_error); 00273 } 00274 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (method, <font class="stringliteral">"tcp"</font>) == 0) 00275 { 00276 <font class="keyword">const</font> <font class="keywordtype">char</font> *host = dbus_address_entry_get_value (entries[i], <font class="stringliteral">"host"</font>); 00277 <font class="keyword">const</font> <font class="keywordtype">char</font> *port = dbus_address_entry_get_value (entries[i], <font class="stringliteral">"port"</font>); 00278 <a class="code" href="structDBusString.html">DBusString</a> str; 00279 <font class="keywordtype">long</font> lport; 00280 dbus_bool_t sresult; 00281 00282 <font class="keywordflow">if</font> (port == NULL) 00283 { 00284 address_problem_type = <font class="stringliteral">"tcp"</font>; 00285 address_problem_field = <font class="stringliteral">"port"</font>; 00286 <font class="keywordflow">goto</font> bad_address; 00287 } 00288 00289 _dbus_string_init_const (&str, port); 00290 sresult = _dbus_string_parse_int (&str, 0, &lport, NULL); 00291 _dbus_string_free (&str); 00292 00293 <font class="keywordflow">if</font> (sresult == FALSE || lport <= 0 || lport > 65535) 00294 { 00295 address_problem_other = <font class="stringliteral">"Port is not an integer between 0 and 65535"</font>; 00296 <font class="keywordflow">goto</font> bad_address; 00297 } 00298 00299 transport = _dbus_transport_new_for_tcp_socket (host, lport, &tmp_error); 00300 } 00301 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font> 00302 <font class="preprocessor"></font> <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (method, <font class="stringliteral">"debug-pipe"</font>) == 0) 00303 { 00304 <font class="keyword">const</font> <font class="keywordtype">char</font> *name = dbus_address_entry_get_value (entries[i], <font class="stringliteral">"name"</font>); 00305 00306 <font class="keywordflow">if</font> (name == NULL) 00307 { 00308 address_problem_type = <font class="stringliteral">"debug-pipe"</font>; 00309 address_problem_field = <font class="stringliteral">"name"</font>; 00310 <font class="keywordflow">goto</font> bad_address; 00311 } 00312 00313 transport = _dbus_transport_debug_pipe_new (name, &tmp_error); 00314 } 00315 <font class="preprocessor">#endif</font> 00316 <font class="preprocessor"></font> <font class="keywordflow">else</font> 00317 { 00318 address_problem_other = <font class="stringliteral">"Unknown address type (examples of valid types are \"unix\" and \"tcp\")"</font>; 00319 <font class="keywordflow">goto</font> bad_address; 00320 } 00321 00322 <font class="keywordflow">if</font> (transport) 00323 <font class="keywordflow">break</font>; 00324 00325 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error); 00326 00327 <font class="keywordflow">if</font> (i == 0) 00328 dbus_move_error (&tmp_error, &first_error); 00329 <font class="keywordflow">else</font> 00330 dbus_error_free (&tmp_error); 00331 } 00332 00333 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 00334 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error); 00335 00336 <font class="keywordflow">if</font> (transport == NULL) 00337 { 00338 _DBUS_ASSERT_ERROR_IS_SET (&first_error); 00339 dbus_move_error (&first_error, error); 00340 } 00341 <font class="keywordflow">else</font> 00342 { 00343 dbus_error_free (&first_error); 00344 } 00345 00346 dbus_address_entries_free (entries); 00347 <font class="keywordflow">return</font> transport; 00348 00349 bad_address: 00350 dbus_address_entries_free (entries); 00351 00352 <font class="keywordflow">if</font> (address_problem_type != NULL) 00353 dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS, 00354 <font class="stringliteral">"Address of type %s was missing argument %s"</font>, 00355 address_problem_type, address_problem_field); 00356 <font class="keywordflow">else</font> 00357 dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS, 00358 <font class="stringliteral">"Could not parse address: %s"</font>, 00359 address_problem_other); 00360 00361 <font class="keywordflow">return</font> NULL; 00362 } 00363 00370 <a class="code" href="structDBusTransport.html">DBusTransport</a> * <a name="l00371"></a><a class="code" href="group__DBusTransport.html#a4">00371</a> _dbus_transport_ref (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00372 { 00373 _dbus_assert (transport-><a class="code" href="structDBusTransport.html#m0">refcount</a> > 0); 00374 00375 transport-><a class="code" href="structDBusTransport.html#m0">refcount</a> += 1; 00376 00377 <font class="keywordflow">return</font> transport; 00378 } 00379 00387 <font class="keywordtype">void</font> <a name="l00388"></a><a class="code" href="group__DBusTransport.html#a5">00388</a> _dbus_transport_unref (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00389 { 00390 _dbus_assert (transport != NULL); 00391 _dbus_assert (transport-><a class="code" href="structDBusTransport.html#m0">refcount</a> > 0); 00392 00393 transport-><a class="code" href="structDBusTransport.html#m0">refcount</a> -= 1; 00394 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m0">refcount</a> == 0) 00395 { 00396 _dbus_assert (transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m0">finalize</a> != NULL); 00397 00398 (* transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m0">finalize</a>) (transport); 00399 } 00400 } 00401 00410 <font class="keywordtype">void</font> <a name="l00411"></a><a class="code" href="group__DBusTransport.html#a6">00411</a> _dbus_transport_disconnect (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00412 { 00413 _dbus_assert (transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m2">disconnect</a> != NULL); 00414 00415 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a>) 00416 <font class="keywordflow">return</font>; 00417 00418 (* transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m2">disconnect</a>) (transport); 00419 00420 transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a> = TRUE; 00421 } 00422 00431 dbus_bool_t <a name="l00432"></a><a class="code" href="group__DBusTransport.html#a7">00432</a> _dbus_transport_get_is_connected (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00433 { 00434 <font class="keywordflow">return</font> !transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a>; 00435 } 00436 00446 dbus_bool_t <a name="l00447"></a><a class="code" href="group__DBusTransport.html#a8">00447</a> _dbus_transport_get_is_authenticated (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00448 { 00449 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m13">authenticated</a>) 00450 <font class="keywordflow">return</font> TRUE; 00451 <font class="keywordflow">else</font> 00452 { 00453 dbus_bool_t maybe_authenticated; 00454 00455 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a>) 00456 <font class="keywordflow">return</font> FALSE; 00457 00458 maybe_authenticated = 00459 (!(transport-><a class="code" href="structDBusTransport.html#m15">send_credentials_pending</a> || 00460 transport-><a class="code" href="structDBusTransport.html#m16">receive_credentials_pending</a>)); 00461 00462 <font class="keywordflow">if</font> (maybe_authenticated) 00463 { 00464 <font class="keywordflow">switch</font> (_dbus_auth_do_work (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>)) 00465 { 00466 <font class="keywordflow">case</font> DBUS_AUTH_STATE_AUTHENTICATED: 00467 <font class="comment">/* leave as maybe_authenticated */</font> 00468 <font class="keywordflow">break</font>; 00469 <font class="keywordflow">default</font>: 00470 maybe_authenticated = FALSE; 00471 } 00472 } 00473 00474 <font class="comment">/* If we've authenticated as some identity, check that the auth</font> 00475 <font class="comment"> * identity is the same as our own identity. In the future, we</font> 00476 <font class="comment"> * may have API allowing applications to specify how this is</font> 00477 <font class="comment"> * done, for example they may allow connection as any identity,</font> 00478 <font class="comment"> * but then impose restrictions on certain identities.</font> 00479 <font class="comment"> * Or they may give certain identities extra privileges.</font> 00480 <font class="comment"> */</font> 00481 00482 <font class="keywordflow">if</font> (maybe_authenticated && transport-><a class="code" href="structDBusTransport.html#m17">is_server</a>) 00483 { 00484 <a class="code" href="structDBusCredentials.html">DBusCredentials</a> auth_identity; 00485 00486 _dbus_auth_get_identity (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>, &auth_identity); 00487 00488 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m9">unix_user_function</a> != NULL) 00489 { 00490 <font class="comment">/* FIXME we hold the connection lock here and should drop it */</font> 00491 <font class="keywordflow">if</font> (!(* transport-><a class="code" href="structDBusTransport.html#m9">unix_user_function</a>) (transport-><a class="code" href="structDBusTransport.html#m2">connection</a>, 00492 auth_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a>, 00493 transport-><a class="code" href="structDBusTransport.html#m10">unix_user_data</a>)) 00494 { 00495 _dbus_verbose (<font class="stringliteral">"Client UID "</font>DBUS_UID_FORMAT 00496 <font class="stringliteral">" was rejected, disconnecting\n"</font>, 00497 auth_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a>); 00498 _dbus_transport_disconnect (transport); 00499 <font class="keywordflow">return</font> FALSE; 00500 } 00501 <font class="keywordflow">else</font> 00502 { 00503 _dbus_verbose (<font class="stringliteral">"Client UID "</font>DBUS_UID_FORMAT<font class="stringliteral">" authorized\n"</font>, auth_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a>); 00504 } 00505 } 00506 <font class="keywordflow">else</font> 00507 { 00508 <a class="code" href="structDBusCredentials.html">DBusCredentials</a> our_identity; 00509 00510 _dbus_credentials_from_current_process (&our_identity); 00511 00512 <font class="keywordflow">if</font> (!_dbus_credentials_match (&our_identity, 00513 &auth_identity)) 00514 { 00515 _dbus_verbose (<font class="stringliteral">"Client authorized as UID "</font>DBUS_UID_FORMAT 00516 <font class="stringliteral">" but our UID is "</font>DBUS_UID_FORMAT<font class="stringliteral">", disconnecting\n"</font>, 00517 auth_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a>, our_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a>); 00518 _dbus_transport_disconnect (transport); 00519 <font class="keywordflow">return</font> FALSE; 00520 } 00521 <font class="keywordflow">else</font> 00522 { 00523 _dbus_verbose (<font class="stringliteral">"Client authorized as UID "</font>DBUS_UID_FORMAT 00524 <font class="stringliteral">" matching our UID "</font>DBUS_UID_FORMAT<font class="stringliteral">"\n"</font>, 00525 auth_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a>, our_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a>); 00526 } 00527 } 00528 } 00529 00530 transport-><a class="code" href="structDBusTransport.html#m13">authenticated</a> = maybe_authenticated; 00531 00532 <font class="keywordflow">return</font> transport-><a class="code" href="structDBusTransport.html#m13">authenticated</a>; 00533 } 00534 } 00535 00543 <font class="keyword">const</font> <font class="keywordtype">char</font>* <a name="l00544"></a><a class="code" href="group__DBusTransport.html#a9">00544</a> _dbus_transport_get_address (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00545 { 00546 <font class="keywordflow">return</font> transport-><a class="code" href="structDBusTransport.html#m8">address</a>; 00547 } 00548 00558 dbus_bool_t <a name="l00559"></a><a class="code" href="group__DBusTransport.html#a10">00559</a> _dbus_transport_handle_watch (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00560 <a class="code" href="structDBusWatch.html">DBusWatch</a> *watch, 00561 <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> condition) 00562 { 00563 dbus_bool_t retval; 00564 00565 _dbus_assert (transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m1">handle_watch</a> != NULL); 00566 00567 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a>) 00568 <font class="keywordflow">return</font> TRUE; 00569 00570 <font class="keywordflow">if</font> (dbus_watch_get_fd (watch) < 0) 00571 { 00572 _dbus_warn (<font class="stringliteral">"Tried to handle an invalidated watch; this watch should have been removed\n"</font>); 00573 <font class="keywordflow">return</font> TRUE; 00574 } 00575 00576 _dbus_watch_sanitize_condition (watch, &condition); 00577 00578 _dbus_transport_ref (transport); 00579 _dbus_watch_ref (watch); 00580 retval = (* transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m1">handle_watch</a>) (transport, watch, condition); 00581 _dbus_watch_unref (watch); 00582 _dbus_transport_unref (transport); 00583 00584 <font class="keywordflow">return</font> retval; 00585 } 00586 00596 dbus_bool_t <a name="l00597"></a><a class="code" href="group__DBusTransport.html#a11">00597</a> _dbus_transport_set_connection (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00598 <a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 00599 { 00600 _dbus_assert (transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m3">connection_set</a> != NULL); 00601 _dbus_assert (transport-><a class="code" href="structDBusTransport.html#m2">connection</a> == NULL); 00602 00603 transport-><a class="code" href="structDBusTransport.html#m2">connection</a> = connection; 00604 00605 _dbus_transport_ref (transport); 00606 <font class="keywordflow">if</font> (!(* transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m3">connection_set</a>) (transport)) 00607 transport-><a class="code" href="structDBusTransport.html#m2">connection</a> = NULL; 00608 _dbus_transport_unref (transport); 00609 00610 <font class="keywordflow">return</font> transport-><a class="code" href="structDBusTransport.html#m2">connection</a> != NULL; 00611 } 00612 00622 <font class="keywordtype">void</font> <a name="l00623"></a><a class="code" href="group__DBusTransport.html#a12">00623</a> _dbus_transport_messages_pending (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00624 <font class="keywordtype">int</font> queue_length) 00625 { 00626 _dbus_assert (transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m4">messages_pending</a> != NULL); 00627 00628 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a>) 00629 <font class="keywordflow">return</font>; 00630 00631 transport-><a class="code" href="structDBusTransport.html#m14">messages_need_sending</a> = queue_length > 0; 00632 00633 _dbus_transport_ref (transport); 00634 (* transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m4">messages_pending</a>) (transport, 00635 queue_length); 00636 _dbus_transport_unref (transport); 00637 } 00638 00650 <font class="keywordtype">void</font> <a name="l00651"></a><a class="code" href="group__DBusTransport.html#a13">00651</a> _dbus_transport_do_iteration (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00652 <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> flags, 00653 <font class="keywordtype">int</font> timeout_milliseconds) 00654 { 00655 _dbus_assert (transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m5">do_iteration</a> != NULL); 00656 00657 _dbus_verbose (<font class="stringliteral">"Transport iteration flags 0x%x timeout %d connected = %d\n"</font>, 00658 flags, timeout_milliseconds, !transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a>); 00659 00660 <font class="keywordflow">if</font> ((flags & (DBUS_ITERATION_DO_WRITING | 00661 DBUS_ITERATION_DO_READING)) == 0) 00662 <font class="keywordflow">return</font>; <font class="comment">/* Nothing to do */</font> 00663 00664 <font class="keywordflow">if</font> (transport-><a class="code" href="structDBusTransport.html#m12">disconnected</a>) 00665 <font class="keywordflow">return</font>; 00666 00667 _dbus_transport_ref (transport); 00668 (* transport-><a class="code" href="structDBusTransport.html#m1">vtable</a>-><a class="code" href="structDBusTransportVTable.html#m5">do_iteration</a>) (transport, flags, 00669 timeout_milliseconds); 00670 _dbus_transport_unref (transport); 00671 } 00672 00673 <font class="keyword">static</font> dbus_bool_t 00674 recover_unused_bytes (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00675 { 00676 <font class="keywordflow">if</font> (_dbus_auth_needs_decoding (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>)) 00677 { 00678 <a class="code" href="structDBusString.html">DBusString</a> plaintext; 00679 <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *encoded; 00680 <a class="code" href="structDBusString.html">DBusString</a> *buffer; 00681 <font class="keywordtype">int</font> orig_len; 00682 00683 <font class="keywordflow">if</font> (!_dbus_string_init (&plaintext)) 00684 <font class="keywordflow">goto</font> nomem; 00685 00686 _dbus_auth_get_unused_bytes (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>, 00687 &encoded); 00688 00689 <font class="keywordflow">if</font> (!_dbus_auth_decode_data (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>, 00690 encoded, &plaintext)) 00691 { 00692 _dbus_string_free (&plaintext); 00693 <font class="keywordflow">goto</font> nomem; 00694 } 00695 00696 _dbus_message_loader_get_buffer (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>, 00697 &buffer); 00698 00699 orig_len = _dbus_string_get_length (buffer); 00700 00701 <font class="keywordflow">if</font> (!_dbus_string_move (&plaintext, 0, buffer, 00702 orig_len)) 00703 { 00704 _dbus_string_free (&plaintext); 00705 <font class="keywordflow">goto</font> nomem; 00706 } 00707 00708 _dbus_verbose (<font class="stringliteral">" %d unused bytes sent to message loader\n"</font>, 00709 _dbus_string_get_length (buffer) - 00710 orig_len); 00711 00712 _dbus_message_loader_return_buffer (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>, 00713 buffer, 00714 _dbus_string_get_length (buffer) - 00715 orig_len); 00716 00717 _dbus_auth_delete_unused_bytes (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>); 00718 00719 _dbus_string_free (&plaintext); 00720 } 00721 <font class="keywordflow">else</font> 00722 { 00723 <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *bytes; 00724 <a class="code" href="structDBusString.html">DBusString</a> *buffer; 00725 <font class="keywordtype">int</font> orig_len; 00726 dbus_bool_t succeeded; 00727 00728 _dbus_message_loader_get_buffer (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>, 00729 &buffer); 00730 00731 orig_len = _dbus_string_get_length (buffer); 00732 00733 _dbus_auth_get_unused_bytes (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>, 00734 &bytes); 00735 00736 succeeded = TRUE; 00737 <font class="keywordflow">if</font> (!_dbus_string_copy (bytes, 0, buffer, _dbus_string_get_length (buffer))) 00738 succeeded = FALSE; 00739 00740 _dbus_verbose (<font class="stringliteral">" %d unused bytes sent to message loader\n"</font>, 00741 _dbus_string_get_length (buffer) - 00742 orig_len); 00743 00744 _dbus_message_loader_return_buffer (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>, 00745 buffer, 00746 _dbus_string_get_length (buffer) - 00747 orig_len); 00748 00749 <font class="keywordflow">if</font> (succeeded) 00750 _dbus_auth_delete_unused_bytes (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>); 00751 <font class="keywordflow">else</font> 00752 <font class="keywordflow">goto</font> nomem; 00753 } 00754 00755 <font class="keywordflow">return</font> TRUE; 00756 00757 nomem: 00758 _dbus_verbose (<font class="stringliteral">"Not enough memory to transfer unused bytes from auth conversation\n"</font>); 00759 <font class="keywordflow">return</font> FALSE; 00760 } 00761 00769 DBusDispatchStatus <a name="l00770"></a><a class="code" href="group__DBusTransport.html#a15">00770</a> _dbus_transport_get_dispatch_status (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00771 { 00772 <font class="keywordflow">if</font> (_dbus_counter_get_value (transport-><a class="code" href="structDBusTransport.html#m7">live_messages_size</a>) >= transport-><a class="code" href="structDBusTransport.html#m6">max_live_messages_size</a>) 00773 <font class="keywordflow">return</font> DBUS_DISPATCH_COMPLETE; <font class="comment">/* complete for now */</font> 00774 00775 <font class="keywordflow">if</font> (!_dbus_transport_get_is_authenticated (transport)) 00776 { 00777 <font class="keywordflow">if</font> (_dbus_auth_do_work (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>) == 00778 DBUS_AUTH_STATE_WAITING_FOR_MEMORY) 00779 <font class="keywordflow">return</font> DBUS_DISPATCH_NEED_MEMORY; 00780 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (!_dbus_transport_get_is_authenticated (transport)) 00781 <font class="keywordflow">return</font> DBUS_DISPATCH_COMPLETE; 00782 } 00783 00784 <font class="keywordflow">if</font> (!transport-><a class="code" href="structDBusTransport.html#m18">unused_bytes_recovered</a> && 00785 !recover_unused_bytes (transport)) 00786 <font class="keywordflow">return</font> DBUS_DISPATCH_NEED_MEMORY; 00787 00788 transport-><a class="code" href="structDBusTransport.html#m18">unused_bytes_recovered</a> = TRUE; 00789 00790 <font class="keywordflow">if</font> (!_dbus_message_loader_queue_messages (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>)) 00791 <font class="keywordflow">return</font> DBUS_DISPATCH_NEED_MEMORY; 00792 00793 <font class="keywordflow">if</font> (_dbus_message_loader_peek_message (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>) != NULL) 00794 <font class="keywordflow">return</font> DBUS_DISPATCH_DATA_REMAINS; 00795 <font class="keywordflow">else</font> 00796 <font class="keywordflow">return</font> DBUS_DISPATCH_COMPLETE; 00797 } 00798 00807 dbus_bool_t <a name="l00808"></a><a class="code" href="group__DBusTransport.html#a16">00808</a> _dbus_transport_queue_messages (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00809 { 00810 DBusDispatchStatus status; 00811 00812 <font class="preprocessor">#if 0</font> 00813 <font class="preprocessor"></font> _dbus_verbose (<font class="stringliteral">"_dbus_transport_queue_messages()\n"</font>); 00814 <font class="preprocessor">#endif</font> 00815 <font class="preprocessor"></font> 00816 <font class="comment">/* Queue any messages */</font> 00817 <font class="keywordflow">while</font> ((status = _dbus_transport_get_dispatch_status (transport)) == DBUS_DISPATCH_DATA_REMAINS) 00818 { 00819 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message; 00820 <a class="code" href="structDBusList.html">DBusList</a> *link; 00821 00822 link = _dbus_message_loader_pop_message_link (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>); 00823 _dbus_assert (link != NULL); 00824 00825 message = link-><a class="code" href="structDBusList.html#m2">data</a>; 00826 00827 _dbus_verbose (<font class="stringliteral">"queueing received message %p\n"</font>, message); 00828 00829 <font class="keywordflow">if</font> (!_dbus_message_add_size_counter (message, transport-><a class="code" href="structDBusTransport.html#m7">live_messages_size</a>)) 00830 { 00831 _dbus_message_loader_putback_message_link (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>, 00832 link); 00833 status = DBUS_DISPATCH_NEED_MEMORY; 00834 <font class="keywordflow">break</font>; 00835 } 00836 <font class="keywordflow">else</font> 00837 { 00838 <font class="comment">/* pass ownership of link and message ref to connection */</font> 00839 _dbus_connection_queue_received_message_link (transport-><a class="code" href="structDBusTransport.html#m2">connection</a>, 00840 link); 00841 } 00842 } 00843 00844 <font class="keywordflow">if</font> (_dbus_message_loader_get_is_corrupted (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>)) 00845 { 00846 _dbus_verbose (<font class="stringliteral">"Corrupted message stream, disconnecting\n"</font>); 00847 _dbus_transport_disconnect (transport); 00848 } 00849 00850 <font class="keywordflow">return</font> status != DBUS_DISPATCH_NEED_MEMORY; 00851 } 00852 00859 <font class="keywordtype">void</font> <a name="l00860"></a><a class="code" href="group__DBusTransport.html#a17">00860</a> _dbus_transport_set_max_message_size (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00861 <font class="keywordtype">long</font> size) 00862 { 00863 _dbus_message_loader_set_max_message_size (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>, size); 00864 } 00865 00872 <font class="keywordtype">long</font> <a name="l00873"></a><a class="code" href="group__DBusTransport.html#a18">00873</a> _dbus_transport_get_max_message_size (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00874 { 00875 <font class="keywordflow">return</font> _dbus_message_loader_get_max_message_size (transport-><a class="code" href="structDBusTransport.html#m3">loader</a>); 00876 } 00877 00884 <font class="keywordtype">void</font> <a name="l00885"></a><a class="code" href="group__DBusTransport.html#a19">00885</a> _dbus_transport_set_max_received_size (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00886 <font class="keywordtype">long</font> size) 00887 { 00888 transport-><a class="code" href="structDBusTransport.html#m6">max_live_messages_size</a> = size; 00889 _dbus_counter_set_notify (transport-><a class="code" href="structDBusTransport.html#m7">live_messages_size</a>, 00890 transport-><a class="code" href="structDBusTransport.html#m6">max_live_messages_size</a>, 00891 live_messages_size_notify, 00892 transport); 00893 } 00894 00895 00902 <font class="keywordtype">long</font> <a name="l00903"></a><a class="code" href="group__DBusTransport.html#a20">00903</a> _dbus_transport_get_max_received_size (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00904 { 00905 <font class="keywordflow">return</font> transport-><a class="code" href="structDBusTransport.html#m6">max_live_messages_size</a>; 00906 } 00907 00915 dbus_bool_t <a name="l00916"></a><a class="code" href="group__DBusTransport.html#a21">00916</a> _dbus_transport_get_unix_user (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00917 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> *uid) 00918 { 00919 <a class="code" href="structDBusCredentials.html">DBusCredentials</a> auth_identity; 00920 00921 *uid = _DBUS_INT_MAX; <font class="comment">/* better than some root or system user in</font> 00922 <font class="comment"> * case of bugs in the caller. Caller should</font> 00923 <font class="comment"> * never use this value on purpose, however.</font> 00924 <font class="comment"> */</font> 00925 00926 <font class="keywordflow">if</font> (!transport-><a class="code" href="structDBusTransport.html#m13">authenticated</a>) 00927 <font class="keywordflow">return</font> FALSE; 00928 00929 _dbus_auth_get_identity (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>, &auth_identity); 00930 00931 <font class="keywordflow">if</font> (auth_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a> != DBUS_UID_UNSET) 00932 { 00933 *uid = auth_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a>; 00934 <font class="keywordflow">return</font> TRUE; 00935 } 00936 <font class="keywordflow">else</font> 00937 <font class="keywordflow">return</font> FALSE; 00938 } 00939 00950 <font class="keywordtype">void</font> <a name="l00951"></a><a class="code" href="group__DBusTransport.html#a22">00951</a> _dbus_transport_set_unix_user_function (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00952 DBusAllowUnixUserFunction function, 00953 <font class="keywordtype">void</font> *data, 00954 DBusFreeFunction free_data_function, 00955 <font class="keywordtype">void</font> **old_data, 00956 DBusFreeFunction *old_free_data_function) 00957 { 00958 *old_data = transport-><a class="code" href="structDBusTransport.html#m10">unix_user_data</a>; 00959 *old_free_data_function = transport-><a class="code" href="structDBusTransport.html#m11">free_unix_user_data</a>; 00960 00961 transport-><a class="code" href="structDBusTransport.html#m9">unix_user_function</a> = function; 00962 transport-><a class="code" href="structDBusTransport.html#m10">unix_user_data</a> = data; 00963 transport-><a class="code" href="structDBusTransport.html#m11">free_unix_user_data</a> = free_data_function; 00964 } 00965 00974 dbus_bool_t <a name="l00975"></a><a class="code" href="group__DBusTransport.html#a23">00975</a> _dbus_transport_set_auth_mechanisms (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport, 00976 <font class="keyword">const</font> <font class="keywordtype">char</font> **mechanisms) 00977 { 00978 <font class="keywordflow">return</font> _dbus_auth_set_mechanisms (transport-><a class="code" href="structDBusTransport.html#m4">auth</a>, mechanisms); 00979 } 00980 00981 </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>