Sophie

Sophie

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

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-internals.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-internals.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font>
00002 <font class="comment">/* dbus-internals.c  random utility stuff (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 <font class="preprocessor">#include "dbus-internals.h"</font>
00024 <font class="preprocessor">#include "dbus-protocol.h"</font>
00025 <font class="preprocessor">#include "dbus-test.h"</font>
00026 <font class="preprocessor">#include &lt;stdio.h&gt;</font>
00027 <font class="preprocessor">#include &lt;stdarg.h&gt;</font>
00028 <font class="preprocessor">#include &lt;string.h&gt;</font>
00029 <font class="preprocessor">#include &lt;sys/types.h&gt;</font>
00030 <font class="preprocessor">#include &lt;errno.h&gt;</font>
00031 <font class="preprocessor">#include &lt;unistd.h&gt;</font>
00032 <font class="preprocessor">#include &lt;fcntl.h&gt;</font>
00033 <font class="preprocessor">#include &lt;stdlib.h&gt;</font>
00034 
<a name="l00158"></a><a class="code" href="group__DBusInternalsUtils.html#a0">00158</a> <font class="keyword">const</font> <font class="keywordtype">char</font> _dbus_no_memory_message[] = <font class="stringliteral">"Not enough memory"</font>;
00159 
00165 <font class="keywordtype">void</font>
<a name="l00166"></a><a class="code" href="group__DBusInternalsUtils.html#a4">00166</a> _dbus_warn (<font class="keyword">const</font> <font class="keywordtype">char</font> *format,
00167             ...)
00168 {
00169   <font class="comment">/* FIXME not portable enough? */</font>
00170   va_list args;
00171 
00172   va_start (args, format);
00173   vfprintf (stderr, format, args);
00174   va_end (args);
00175 }
00176 
00177 <font class="keyword">static</font> dbus_bool_t verbose_initted = FALSE;
00178 
00187 <font class="keywordtype">void</font>
<a name="l00188"></a><a class="code" href="group__DBusInternalsUtils.html#a5">00188</a> _dbus_verbose_real (<font class="keyword">const</font> <font class="keywordtype">char</font> *format,
00189                     ...)
00190 {
00191   va_list args;
00192   <font class="keyword">static</font> dbus_bool_t verbose = TRUE;
00193   <font class="keyword">static</font> dbus_bool_t need_pid = TRUE;
00194   
00195   <font class="comment">/* things are written a bit oddly here so that</font>
00196 <font class="comment">   * in the non-verbose case we just have the one</font>
00197 <font class="comment">   * conditional and return immediately.</font>
00198 <font class="comment">   */</font>
00199   <font class="keywordflow">if</font> (!verbose)
00200     <font class="keywordflow">return</font>;
00201   
00202   <font class="keywordflow">if</font> (!verbose_initted)
00203     {
00204       verbose = _dbus_getenv (<font class="stringliteral">"DBUS_VERBOSE"</font>) != NULL;
00205       verbose_initted = TRUE;
00206       <font class="keywordflow">if</font> (!verbose)
00207         <font class="keywordflow">return</font>;
00208     }
00209 
00210   <font class="keywordflow">if</font> (need_pid)
00211     {
00212       <font class="keywordtype">int</font> len;
00213       
00214       fprintf (stderr, <font class="stringliteral">"%lu: "</font>, _dbus_getpid ());
00215 
00216       len = strlen (format);
00217       <font class="keywordflow">if</font> (format[len-1] == <font class="charliteral">'\n'</font>)
00218         need_pid = TRUE;
00219       <font class="keywordflow">else</font>
00220         need_pid = FALSE;
00221     }
00222   
00223   va_start (args, format);
00224   vfprintf (stderr, format, args);
00225   va_end (args);
00226 
00227   fflush (stderr);
00228 }
00229 
00236 <font class="keywordtype">void</font>
<a name="l00237"></a><a class="code" href="group__DBusInternalsUtils.html#a6">00237</a> _dbus_verbose_reset_real (<font class="keywordtype">void</font>)
00238 {
00239   verbose_initted = FALSE;
00240 }
00241 
00250 <font class="keywordtype">char</font>*
<a name="l00251"></a><a class="code" href="group__DBusInternalsUtils.html#a7">00251</a> _dbus_strdup (<font class="keyword">const</font> <font class="keywordtype">char</font> *str)
00252 {
00253   size_t len;
00254   <font class="keywordtype">char</font> *copy;
00255   
00256   <font class="keywordflow">if</font> (str == NULL)
00257     <font class="keywordflow">return</font> NULL;
00258   
00259   len = strlen (str);
00260 
00261   copy = dbus_malloc (len + 1);
00262   <font class="keywordflow">if</font> (copy == NULL)
00263     <font class="keywordflow">return</font> NULL;
00264 
00265   memcpy (copy, str, len + 1);
00266   
00267   <font class="keywordflow">return</font> copy;
00268 }
00269 
00278 <font class="keywordtype">void</font>*
<a name="l00279"></a><a class="code" href="group__DBusInternalsUtils.html#a8">00279</a> _dbus_memdup (<font class="keyword">const</font> <font class="keywordtype">void</font>  *mem,
00280               size_t       n_bytes)
00281 {
00282   <font class="keywordtype">void</font> *copy;
00283 
00284   copy = dbus_malloc (n_bytes);
00285   <font class="keywordflow">if</font> (copy == NULL)
00286     <font class="keywordflow">return</font> NULL;
00287 
00288   memcpy (copy, mem, n_bytes);
00289   
00290   <font class="keywordflow">return</font> copy;
00291 }
00292 
00301 <font class="keywordtype">char</font>**
<a name="l00302"></a><a class="code" href="group__DBusInternalsUtils.html#a9">00302</a> _dbus_dup_string_array (<font class="keyword">const</font> <font class="keywordtype">char</font> **array)
00303 {
00304   <font class="keywordtype">int</font> len;
00305   <font class="keywordtype">int</font> i;
00306   <font class="keywordtype">char</font> **copy;
00307   
00308   <font class="keywordflow">if</font> (array == NULL)
00309     <font class="keywordflow">return</font> NULL;
00310 
00311   <font class="keywordflow">for</font> (len = 0; array[len] != NULL; ++len)
00312     ;
00313 
00314   copy = dbus_new0 (<font class="keywordtype">char</font>*, len + 1);
00315   <font class="keywordflow">if</font> (copy == NULL)
00316     <font class="keywordflow">return</font> NULL;
00317 
00318   i = 0;
00319   <font class="keywordflow">while</font> (i &lt; len)
00320     {
00321       copy[i] = _dbus_strdup (array[i]);
00322       <font class="keywordflow">if</font> (copy[i] == NULL)
00323         {
00324           dbus_free_string_array (copy);
00325           <font class="keywordflow">return</font> NULL;
00326         }
00327 
00328       ++i;
00329     }
00330 
00331   <font class="keywordflow">return</font> copy;
00332 }
00333 
00341 dbus_bool_t
<a name="l00342"></a><a class="code" href="group__DBusInternalsUtils.html#a10">00342</a> _dbus_string_array_contains (<font class="keyword">const</font> <font class="keywordtype">char</font> **array,
00343                              <font class="keyword">const</font> <font class="keywordtype">char</font>  *str)
00344 {
00345   <font class="keywordtype">int</font> i;
00346 
00347   i = 0;
00348   <font class="keywordflow">while</font> (array[i] != NULL)
00349     {
00350       <font class="keywordflow">if</font> (strcmp (array[i], str) == 0)
00351         <font class="keywordflow">return</font> TRUE;
00352       ++i;
00353     }
00354 
00355   <font class="keywordflow">return</font> FALSE;
00356 }
00357 
00364 <font class="keyword">const</font> <font class="keywordtype">char</font> *
<a name="l00365"></a><a class="code" href="group__DBusInternalsUtils.html#a11">00365</a> _dbus_type_to_string (<font class="keywordtype">int</font> type)
00366 {
00367   <font class="keywordflow">switch</font> (type)
00368     {
00369     <font class="keywordflow">case</font> DBUS_TYPE_INVALID:
00370       <font class="keywordflow">return</font> <font class="stringliteral">"invalid"</font>;
00371     <font class="keywordflow">case</font> DBUS_TYPE_NIL:
00372       <font class="keywordflow">return</font> <font class="stringliteral">"nil"</font>;
00373     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
00374       <font class="keywordflow">return</font> <font class="stringliteral">"boolean"</font>;
00375     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
00376       <font class="keywordflow">return</font> <font class="stringliteral">"int32"</font>;
00377     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
00378       <font class="keywordflow">return</font> <font class="stringliteral">"uint32"</font>;
00379     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
00380       <font class="keywordflow">return</font> <font class="stringliteral">"double"</font>;
00381     <font class="keywordflow">case</font> DBUS_TYPE_STRING:
00382       <font class="keywordflow">return</font> <font class="stringliteral">"string"</font>;
00383     <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
00384       <font class="keywordflow">return</font> <font class="stringliteral">"custom"</font>;
00385     <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
00386       <font class="keywordflow">return</font> <font class="stringliteral">"array"</font>;
00387     <font class="keywordflow">case</font> DBUS_TYPE_DICT:
00388       <font class="keywordflow">return</font> <font class="stringliteral">"dict"</font>;
00389     <font class="keywordflow">default</font>:
00390       <font class="keywordflow">return</font> <font class="stringliteral">"unknown"</font>;
00391     }
00392 }
00393 
00400 <font class="keyword">const</font> <font class="keywordtype">char</font> *
<a name="l00401"></a><a class="code" href="group__DBusInternalsUtils.html#a12">00401</a> _dbus_header_field_to_string (<font class="keywordtype">int</font> header_field)
00402 {
00403   <font class="keywordflow">switch</font> (header_field)
00404     {
00405     <font class="keywordflow">case</font> DBUS_HEADER_FIELD_INVALID:
00406       <font class="keywordflow">return</font> <font class="stringliteral">"invalid"</font>;
00407     <font class="keywordflow">case</font> DBUS_HEADER_FIELD_PATH:
00408       <font class="keywordflow">return</font> <font class="stringliteral">"path"</font>;
00409     <font class="keywordflow">case</font> DBUS_HEADER_FIELD_INTERFACE:
00410       <font class="keywordflow">return</font> <font class="stringliteral">"interface"</font>;
00411     <font class="keywordflow">case</font> DBUS_HEADER_FIELD_MEMBER:
00412       <font class="keywordflow">return</font> <font class="stringliteral">"member"</font>;
00413     <font class="keywordflow">case</font> DBUS_HEADER_FIELD_ERROR_NAME:
00414       <font class="keywordflow">return</font> <font class="stringliteral">"error-name"</font>;
00415     <font class="keywordflow">case</font> DBUS_HEADER_FIELD_REPLY_SERIAL:
00416       <font class="keywordflow">return</font> <font class="stringliteral">"reply-serial"</font>;
00417     <font class="keywordflow">case</font> DBUS_HEADER_FIELD_DESTINATION:
00418       <font class="keywordflow">return</font> <font class="stringliteral">"destination"</font>;
00419     <font class="keywordflow">case</font> DBUS_HEADER_FIELD_SENDER:
00420       <font class="keywordflow">return</font> <font class="stringliteral">"sender"</font>;
00421     <font class="keywordflow">default</font>:
00422       <font class="keywordflow">return</font> <font class="stringliteral">"unknown"</font>;
00423     }
00424 }
00425 
00426 <font class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</font>
00427 <font class="preprocessor"></font>
<a name="l00428"></a><a class="code" href="group__DBusInternalsUtils.html#a2">00428</a> <font class="keyword">const</font> <font class="keywordtype">char</font> _dbus_return_if_fail_warning_format[] =
00429 <font class="stringliteral">"%lu: arguments to %s() were incorrect, assertion \"%s\" failed in file %s line %d.\n"</font>
00430 <font class="stringliteral">"This is normally a bug in some application using the D-BUS library.\n"</font>;
00431 <font class="preprocessor">#endif</font>
00432 <font class="preprocessor"></font>
00433 <font class="preprocessor">#ifndef DBUS_DISABLE_ASSERT</font>
00434 <font class="preprocessor"></font>
00445 <font class="keywordtype">void</font>
<a name="l00446"></a><a class="code" href="group__DBusInternalsUtils.html#a13">00446</a> _dbus_real_assert (dbus_bool_t  condition,
00447                    <font class="keyword">const</font> <font class="keywordtype">char</font>  *condition_text,
00448                    <font class="keyword">const</font> <font class="keywordtype">char</font>  *file,
00449                    <font class="keywordtype">int</font>          line)
00450 {
00451   <font class="keywordflow">if</font> (_DBUS_UNLIKELY (!condition))
00452     {
00453       _dbus_warn (<font class="stringliteral">"%lu: assertion failed \"%s\" file \"%s\" line %d\n"</font>,
00454                   _dbus_getpid (), condition_text, file, line);
00455       _dbus_abort ();
00456     }
00457 }
00458 
00469 <font class="keywordtype">void</font>
<a name="l00470"></a><a class="code" href="group__DBusInternalsUtils.html#a14">00470</a> _dbus_real_assert_not_reached (<font class="keyword">const</font> <font class="keywordtype">char</font> *explanation,
00471                                <font class="keyword">const</font> <font class="keywordtype">char</font> *file,
00472                                <font class="keywordtype">int</font>         line)
00473 {
00474   _dbus_warn (<font class="stringliteral">"File \"%s\" line %d process %lu should not have been reached: %s\n"</font>,
00475               file, line, _dbus_getpid (), explanation);
00476   _dbus_abort ();
00477 }
00478 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_DISABLE_ASSERT */</font>
00479   
00480 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
00481 <font class="preprocessor"></font><font class="keyword">static</font> dbus_bool_t
00482 run_failing_each_malloc (<font class="keywordtype">int</font>                    n_mallocs,
00483                          <font class="keyword">const</font> <font class="keywordtype">char</font>            *description,
00484                          DBusTestMemoryFunction func,
00485                          <font class="keywordtype">void</font>                  *data)
00486 {
00487   n_mallocs += 10; <font class="comment">/* fudge factor to ensure reallocs etc. are covered */</font>
00488   
00489   <font class="keywordflow">while</font> (n_mallocs &gt;= 0)
00490     {      
00491       _dbus_set_fail_alloc_counter (n_mallocs);
00492 
00493       _dbus_verbose (<font class="stringliteral">"\n===\n%s: (will fail malloc %d with %d failures)\n===\n"</font>,
00494                      description, n_mallocs,
00495                      _dbus_get_fail_alloc_failures ());
00496 
00497       <font class="keywordflow">if</font> (!(* func) (data))
00498         <font class="keywordflow">return</font> FALSE;
00499       
00500       n_mallocs -= 1;
00501     }
00502 
00503   _dbus_set_fail_alloc_counter (_DBUS_INT_MAX);
00504 
00505   <font class="keywordflow">return</font> TRUE;
00506 }                        
00507 
00521 dbus_bool_t
<a name="l00522"></a><a class="code" href="group__DBusInternalsUtils.html#a16">00522</a> _dbus_test_oom_handling (<font class="keyword">const</font> <font class="keywordtype">char</font>             *description,
00523                          DBusTestMemoryFunction  func,
00524                          <font class="keywordtype">void</font>                   *data)
00525 {
00526   <font class="keywordtype">int</font> approx_mallocs;
00527 
00528   <font class="comment">/* Run once to see about how many mallocs are involved */</font>
00529   
00530   _dbus_set_fail_alloc_counter (_DBUS_INT_MAX);
00531 
00532   _dbus_verbose (<font class="stringliteral">"Running once to count mallocs\n"</font>);
00533   
00534   <font class="keywordflow">if</font> (!(* func) (data))
00535     <font class="keywordflow">return</font> FALSE;
00536   
00537   approx_mallocs = _DBUS_INT_MAX - _dbus_get_fail_alloc_counter ();
00538 
00539   _dbus_verbose (<font class="stringliteral">"\n=================\n%s: about %d mallocs total\n=================\n"</font>,
00540                  description, approx_mallocs);
00541 
00542   _dbus_set_fail_alloc_failures (1);
00543   <font class="keywordflow">if</font> (!run_failing_each_malloc (approx_mallocs, description, func, data))
00544     <font class="keywordflow">return</font> FALSE;
00545 
00546   _dbus_set_fail_alloc_failures (2);
00547   <font class="keywordflow">if</font> (!run_failing_each_malloc (approx_mallocs, description, func, data))
00548     <font class="keywordflow">return</font> FALSE;
00549   
00550   _dbus_set_fail_alloc_failures (3);
00551   <font class="keywordflow">if</font> (!run_failing_each_malloc (approx_mallocs, description, func, data))
00552     <font class="keywordflow">return</font> FALSE;
00553 
00554   _dbus_set_fail_alloc_failures (4);
00555   <font class="keywordflow">if</font> (!run_failing_each_malloc (approx_mallocs, description, func, data))
00556     <font class="keywordflow">return</font> FALSE;
00557   
00558   _dbus_verbose (<font class="stringliteral">"\n=================\n%s: all iterations passed\n=================\n"</font>,
00559                  description);
00560 
00561   <font class="keywordflow">return</font> TRUE;
00562 }
00563 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_BUILD_TESTS */</font>
00564 
</pre></div><hr><address align="right"><small>Generated on Wed Jun 9 05:01:25 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>