<!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> <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-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 <stdio.h></font> 00027 <font class="preprocessor">#include <stdarg.h></font> 00028 <font class="preprocessor">#include <string.h></font> 00029 <font class="preprocessor">#include <sys/types.h></font> 00030 <font class="preprocessor">#include <errno.h></font> 00031 <font class="preprocessor">#include <unistd.h></font> 00032 <font class="preprocessor">#include <fcntl.h></font> 00033 <font class="preprocessor">#include <stdlib.h></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 < 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 >= 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>