Sophie

Sophie

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

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-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> &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-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-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<a class="code" href="structDBusTransportVTable.html#m6">live_messages_changed</a>)
00072     (* transport-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<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, &amp;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-&gt;<a class="code" href="structDBusTransport.html#m0">refcount</a> = 1;
00139   transport-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a> = vtable;
00140   transport-&gt;<a class="code" href="structDBusTransport.html#m3">loader</a> = loader;
00141   transport-&gt;<a class="code" href="structDBusTransport.html#m4">auth</a> = auth;
00142   transport-&gt;<a class="code" href="structDBusTransport.html#m7">live_messages_size</a> = counter;
00143   transport-&gt;<a class="code" href="structDBusTransport.html#m13">authenticated</a> = FALSE;
00144   transport-&gt;<a class="code" href="structDBusTransport.html#m14">messages_need_sending</a> = FALSE;
00145   transport-&gt;<a class="code" href="structDBusTransport.html#m12">disconnected</a> = FALSE;
00146   transport-&gt;<a class="code" href="structDBusTransport.html#m15">send_credentials_pending</a> = !server;
00147   transport-&gt;<a class="code" href="structDBusTransport.html#m16">receive_credentials_pending</a> = server;
00148   transport-&gt;<a class="code" href="structDBusTransport.html#m17">is_server</a> = server;
00149   transport-&gt;<a class="code" href="structDBusTransport.html#m8">address</a> = address_copy;
00150   
00151   transport-&gt;<a class="code" href="structDBusTransport.html#m9">unix_user_function</a> = NULL;
00152   transport-&gt;<a class="code" href="structDBusTransport.html#m10">unix_user_data</a> = NULL;
00153   transport-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m6">max_live_messages_size</a> = _DBUS_ONE_MEGABYTE * 63;
00159   
00160   transport-&gt;<a class="code" href="structDBusTransport.html#m5">credentials</a>.<a class="code" href="structDBusCredentials.html#m0">pid</a> = -1;
00161   transport-&gt;<a class="code" href="structDBusTransport.html#m5">credentials</a>.<a class="code" href="structDBusCredentials.html#m1">uid</a> = -1;
00162   transport-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m7">live_messages_size</a>,
00165                             transport-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m8">address</a>)
00170     _dbus_verbose (<font class="stringliteral">"Initialized transport on address %s\n"</font>, transport-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m12">disconnected</a>)
00185     _dbus_transport_disconnect (transport);
00186 
00187   <font class="keywordflow">if</font> (transport-&gt;<a class="code" href="structDBusTransport.html#m11">free_unix_user_data</a> != NULL)
00188     (* transport-&gt;<a class="code" href="structDBusTransport.html#m11">free_unix_user_data</a>) (transport-&gt;<a class="code" href="structDBusTransport.html#m10">unix_user_data</a>);
00189   
00190   _dbus_message_loader_unref (transport-&gt;<a class="code" href="structDBusTransport.html#m3">loader</a>);
00191   _dbus_auth_unref (transport-&gt;<a class="code" href="structDBusTransport.html#m4">auth</a>);
00192   _dbus_counter_set_notify (transport-&gt;<a class="code" href="structDBusTransport.html#m7">live_messages_size</a>,
00193                             0, NULL, NULL);
00194   _dbus_counter_unref (transport-&gt;<a class="code" href="structDBusTransport.html#m7">live_messages_size</a>);
00195   dbus_free (transport-&gt;<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, &amp;entries, &amp;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 (&amp;tmp_error);
00235   dbus_error_init (&amp;first_error);
00236   <font class="keywordflow">for</font> (i = 0; i &lt; 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 &amp;&amp; <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 &amp;&amp; <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                                                                &amp;tmp_error);
00270           <font class="keywordflow">else</font>
00271             transport = _dbus_transport_new_for_domain_socket (<font class="keyword">abstract</font>, TRUE,
00272                                                                &amp;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 (&amp;str, port);
00290           sresult = _dbus_string_parse_int (&amp;str, 0, &amp;lport, NULL);
00291           _dbus_string_free (&amp;str);
00292           
00293           <font class="keywordflow">if</font> (sresult == FALSE || lport &lt;= 0 || lport &gt; 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, &amp;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, &amp;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 (&amp;tmp_error);
00326       
00327       <font class="keywordflow">if</font> (i == 0)
00328         dbus_move_error (&amp;tmp_error, &amp;first_error);
00329       <font class="keywordflow">else</font>
00330         dbus_error_free (&amp;tmp_error);
00331     }
00332 
00333   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
00334   _DBUS_ASSERT_ERROR_IS_CLEAR (&amp;tmp_error);
00335   
00336   <font class="keywordflow">if</font> (transport == NULL)
00337     {
00338       _DBUS_ASSERT_ERROR_IS_SET (&amp;first_error);
00339       dbus_move_error (&amp;first_error, error);
00340     }
00341   <font class="keywordflow">else</font>
00342     {
00343       dbus_error_free (&amp;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-&gt;<a class="code" href="structDBusTransport.html#m0">refcount</a> &gt; 0);
00374   
00375   transport-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m0">refcount</a> &gt; 0);
00392 
00393   transport-&gt;<a class="code" href="structDBusTransport.html#m0">refcount</a> -= 1;
00394   <font class="keywordflow">if</font> (transport-&gt;<a class="code" href="structDBusTransport.html#m0">refcount</a> == 0)
00395     {
00396       _dbus_assert (transport-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<a class="code" href="structDBusTransportVTable.html#m0">finalize</a> != NULL);
00397       
00398       (* transport-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<a class="code" href="structDBusTransportVTable.html#m2">disconnect</a> != NULL);
00414 
00415   <font class="keywordflow">if</font> (transport-&gt;<a class="code" href="structDBusTransport.html#m12">disconnected</a>)
00416     <font class="keywordflow">return</font>;
00417 
00418   (* transport-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<a class="code" href="structDBusTransportVTable.html#m2">disconnect</a>) (transport);
00419   
00420   transport-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m12">disconnected</a>)
00456         <font class="keywordflow">return</font> FALSE;
00457       
00458       maybe_authenticated =
00459         (!(transport-&gt;<a class="code" href="structDBusTransport.html#m15">send_credentials_pending</a> ||
00460            transport-&gt;<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-&gt;<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 &amp;&amp; transport-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m4">auth</a>, &amp;auth_identity);
00487 
00488           <font class="keywordflow">if</font> (transport-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m9">unix_user_function</a>) (transport-&gt;<a class="code" href="structDBusTransport.html#m2">connection</a>,
00492                                                       auth_identity.<a class="code" href="structDBusCredentials.html#m1">uid</a>,
00493                                                       transport-&gt;<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 (&amp;our_identity);
00511               
00512               <font class="keywordflow">if</font> (!_dbus_credentials_match (&amp;our_identity,
00513                                             &amp;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-&gt;<a class="code" href="structDBusTransport.html#m13">authenticated</a> = maybe_authenticated;
00531       
00532       <font class="keywordflow">return</font> transport-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<a class="code" href="structDBusTransportVTable.html#m1">handle_watch</a> != NULL);
00566 
00567   <font class="keywordflow">if</font> (transport-&gt;<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) &lt; 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, &amp;condition);
00577 
00578   _dbus_transport_ref (transport);
00579   _dbus_watch_ref (watch);
00580   retval = (* transport-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<a class="code" href="structDBusTransportVTable.html#m3">connection_set</a> != NULL);
00601   _dbus_assert (transport-&gt;<a class="code" href="structDBusTransport.html#m2">connection</a> == NULL);
00602   
00603   transport-&gt;<a class="code" href="structDBusTransport.html#m2">connection</a> = connection;
00604 
00605   _dbus_transport_ref (transport);
00606   <font class="keywordflow">if</font> (!(* transport-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<a class="code" href="structDBusTransportVTable.html#m3">connection_set</a>) (transport))
00607     transport-&gt;<a class="code" href="structDBusTransport.html#m2">connection</a> = NULL;
00608   _dbus_transport_unref (transport);
00609 
00610   <font class="keywordflow">return</font> transport-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<a class="code" href="structDBusTransportVTable.html#m4">messages_pending</a> != NULL);
00627 
00628   <font class="keywordflow">if</font> (transport-&gt;<a class="code" href="structDBusTransport.html#m12">disconnected</a>)
00629     <font class="keywordflow">return</font>;
00630 
00631   transport-&gt;<a class="code" href="structDBusTransport.html#m14">messages_need_sending</a> = queue_length &gt; 0;
00632 
00633   _dbus_transport_ref (transport);
00634   (* transport-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m12">disconnected</a>);
00659   
00660   <font class="keywordflow">if</font> ((flags &amp; (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-&gt;<a class="code" href="structDBusTransport.html#m12">disconnected</a>)
00665     <font class="keywordflow">return</font>;
00666 
00667   _dbus_transport_ref (transport);
00668   (* transport-&gt;<a class="code" href="structDBusTransport.html#m1">vtable</a>-&gt;<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-&gt;<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 (&amp;plaintext))
00684         <font class="keywordflow">goto</font> nomem;
00685       
00686       _dbus_auth_get_unused_bytes (transport-&gt;<a class="code" href="structDBusTransport.html#m4">auth</a>,
00687                                    &amp;encoded);
00688 
00689       <font class="keywordflow">if</font> (!_dbus_auth_decode_data (transport-&gt;<a class="code" href="structDBusTransport.html#m4">auth</a>,
00690                                    encoded, &amp;plaintext))
00691         {
00692           _dbus_string_free (&amp;plaintext);
00693           <font class="keywordflow">goto</font> nomem;
00694         }
00695       
00696       _dbus_message_loader_get_buffer (transport-&gt;<a class="code" href="structDBusTransport.html#m3">loader</a>,
00697                                        &amp;buffer);
00698       
00699       orig_len = _dbus_string_get_length (buffer);
00700       
00701       <font class="keywordflow">if</font> (!_dbus_string_move (&amp;plaintext, 0, buffer,
00702                               orig_len))
00703         {
00704           _dbus_string_free (&amp;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-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m4">auth</a>);
00718       
00719       _dbus_string_free (&amp;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-&gt;<a class="code" href="structDBusTransport.html#m3">loader</a>,
00729                                        &amp;buffer);
00730                 
00731       orig_len = _dbus_string_get_length (buffer);
00732                 
00733       _dbus_auth_get_unused_bytes (transport-&gt;<a class="code" href="structDBusTransport.html#m4">auth</a>,
00734                                    &amp;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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m7">live_messages_size</a>) &gt;= transport-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m18">unused_bytes_recovered</a> &amp;&amp;
00785       !recover_unused_bytes (transport))
00786     <font class="keywordflow">return</font> DBUS_DISPATCH_NEED_MEMORY;
00787 
00788   transport-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m3">loader</a>);
00823       _dbus_assert (link != NULL);
00824       
00825       message = link-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m7">live_messages_size</a>))
00830         {
00831           _dbus_message_loader_putback_message_link (transport-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m6">max_live_messages_size</a> = size;
00889   _dbus_counter_set_notify (transport-&gt;<a class="code" href="structDBusTransport.html#m7">live_messages_size</a>,
00890                             transport-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTransport.html#m13">authenticated</a>)
00927     <font class="keywordflow">return</font> FALSE;
00928   
00929   _dbus_auth_get_identity (transport-&gt;<a class="code" href="structDBusTransport.html#m4">auth</a>, &amp;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-&gt;<a class="code" href="structDBusTransport.html#m10">unix_user_data</a>;
00959   *old_free_data_function = transport-&gt;<a class="code" href="structDBusTransport.html#m11">free_unix_user_data</a>;
00960 
00961   transport-&gt;<a class="code" href="structDBusTransport.html#m9">unix_user_function</a> = function;
00962   transport-&gt;<a class="code" href="structDBusTransport.html#m10">unix_user_data</a> = data;
00963   transport-&gt;<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-&gt;<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>