summaryrefslogtreecommitdiff
path: root/src/3rd_party/dbus-1.7.8/bus
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rd_party/dbus-1.7.8/bus')
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/Makefile.am283
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/Makefile.in1475
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/activation-exit-codes.h45
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/activation-helper-bin.c103
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/activation-helper.c549
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/activation-helper.h31
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/activation.c2595
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/activation.h69
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/bus.c1648
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/bus.h129
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/config-loader-expat.c294
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/config-parser-common.c190
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/config-parser-common.h59
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/config-parser-trivial.c716
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/config-parser-trivial.h72
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/config-parser.c3641
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/config-parser.h87
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/connection.c2387
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/connection.h154
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/dbus.service.in8
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/dbus.socket.in5
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/desktop-file.c808
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/desktop-file.h56
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/dir-watch-default.c35
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/dir-watch-inotify.c281
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/dir-watch-kqueue.c250
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/dir-watch.h40
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/dispatch.c4917
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/dispatch.h38
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/driver.c2068
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/driver.h52
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/expirelist.c402
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/expirelist.h80
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/main.c654
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/messagebus-config.in178
-rwxr-xr-xsrc/3rd_party/dbus-1.7.8/bus/messagebus.in92
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/org.freedesktop.dbus-session.plist.in33
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/policy.c1313
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/policy.h169
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/rc.messagebus.in79
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/selinux.c1092
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/selinux.h72
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/services.c1304
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/services.h94
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/session.conf.in63
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/signals.c2841
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/signals.h100
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/stats.c218
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/stats.h38
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/system.conf.in83
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/test-launch-helper.c148
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/test-main.c190
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/test-system.c107
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/test.c315
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/test.h57
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/utils.c48
-rw-r--r--src/3rd_party/dbus-1.7.8/bus/utils.h36
57 files changed, 0 insertions, 32891 deletions
diff --git a/src/3rd_party/dbus-1.7.8/bus/Makefile.am b/src/3rd_party/dbus-1.7.8/bus/Makefile.am
deleted file mode 100644
index cd0c67daeb..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/Makefile.am
+++ /dev/null
@@ -1,283 +0,0 @@
-configdir=$(sysconfdir)/dbus-1
-dbus_daemon_execdir = $(DBUS_DAEMONDIR)
-
-DBUS_BUS_LIBS = \
- $(XML_LIBS) \
- $(SELINUX_LIBS) \
- $(THREAD_LIBS) \
- $(ADT_LIBS) \
- $(NETWORK_libs) \
- $(NULL)
-
-DBUS_LAUNCHER_LIBS = \
- $(XML_LIBS) \
- $(THREAD_LIBS) \
- $(NETWORK_libs) \
- $(NULL)
-
-AM_CPPFLAGS = \
- -I$(top_srcdir) \
- $(XML_CFLAGS) \
- -DDBUS_SYSTEM_CONFIG_FILE=\""$(configdir)/system.conf"\" \
- -DDBUS_COMPILATION \
- -DDBUS_STATIC_BUILD \
- $(NULL)
-
-# if assertions are enabled, improve backtraces
-AM_LDFLAGS = @R_DYNAMIC_LDFLAG@
-
-EFENCE=
-
-CONFIG_IN_FILES= \
- session.conf.in \
- system.conf.in \
- org.freedesktop.dbus-session.plist.in
-
-config_DATA= \
- session.conf \
- system.conf
-
-if DBUS_ENABLE_LAUNCHD
-agentdir=$(LAUNCHD_AGENT_DIR)
-agent_DATA=org.freedesktop.dbus-session.plist
-endif
-
-XML_SOURCES=config-loader-expat.c
-
-if DBUS_BUS_ENABLE_KQUEUE
-DIR_WATCH_SOURCE=dir-watch-kqueue.c
-else
-if DBUS_BUS_ENABLE_INOTIFY
-DIR_WATCH_SOURCE=dir-watch-inotify.c
-else
-DIR_WATCH_SOURCE=dir-watch-default.c
-endif
-endif
-
-BUS_SOURCES= \
- activation.c \
- activation.h \
- activation-exit-codes.h \
- bus.c \
- bus.h \
- config-parser.c \
- config-parser.h \
- config-parser-common.c \
- config-parser-common.h \
- connection.c \
- connection.h \
- desktop-file.c \
- desktop-file.h \
- $(DIR_WATCH_SOURCE) \
- dir-watch.h \
- dispatch.c \
- dispatch.h \
- driver.c \
- driver.h \
- expirelist.c \
- expirelist.h \
- policy.c \
- policy.h \
- selinux.h \
- selinux.c \
- services.c \
- services.h \
- signals.c \
- signals.h \
- stats.c \
- stats.h \
- test.c \
- test.h \
- utils.c \
- utils.h \
- $(XML_SOURCES)
-
-dbus_daemon_SOURCES= \
- $(BUS_SOURCES) \
- main.c
-
-dbus_daemon_LDADD= \
- $(top_builddir)/dbus/libdbus-internal.la \
- $(EFENCE) \
- $(DBUS_BUS_LIBS)
-
-LAUNCH_HELPER_SOURCES= \
- $(XML_SOURCES) \
- config-parser-common.c \
- config-parser-common.h \
- config-parser-trivial.c \
- config-parser-trivial.h \
- desktop-file.c \
- desktop-file.h \
- utils.c \
- utils.h \
- activation-exit-codes.h \
- activation-helper.h \
- activation-helper.c
-
-## This is the installed launch helper with the setuid checks
-dbus_daemon_launch_helper_SOURCES= \
- activation-helper-bin.c \
- $(LAUNCH_HELPER_SOURCES)
-
-dbus_daemon_launch_helper_LDADD= \
- $(top_builddir)/dbus/libdbus-internal.la \
- $(DBUS_LAUNCHER_LIBS)
-
-## we build another binary so we can do the launch testing without root privs.
-## DO NOT INSTALL THIS FILE
-dbus_daemon_launch_helper_test_SOURCES= \
- activation-helper-bin.c \
- $(LAUNCH_HELPER_SOURCES)
-
-dbus_daemon_launch_helper_test_LDADD= \
- $(top_builddir)/dbus/libdbus-internal.la \
- $(DBUS_LAUNCHER_LIBS)
-
-dbus_daemon_launch_helper_test_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- -DACTIVATION_LAUNCHER_TEST
-
-## we build yet another binary so we can do the OOM tests
-## DO NOT INSTALL THIS FILE
-bus_test_launch_helper_SOURCES= \
- test-launch-helper.c \
- $(LAUNCH_HELPER_SOURCES)
-
-bus_test_launch_helper_LDADD= \
- $(top_builddir)/dbus/libdbus-internal.la \
- $(DBUS_LAUNCHER_LIBS)
-
-bus_test_launch_helper_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- -DACTIVATION_LAUNCHER_TEST \
- -DACTIVATION_LAUNCHER_DO_OOM
-
-noinst_PROGRAMS =
-dbus_daemon_exec_PROGRAMS = dbus-daemon
-if DBUS_UNIX
-libexec_PROGRAMS = dbus-daemon-launch-helper
-endif DBUS_UNIX
-
-## Note that TESTS has special meaning (stuff to use in make check).
-## We don't actually want to run any of these tests until test/ has been
-## compiled, so we don't put them in TESTS here; we run them in test/
-## instead.
-
-if DBUS_ENABLE_EMBEDDED_TESTS
-## we use noinst_PROGRAMS not check_PROGRAMS so that we build
-## even when not doing "make check"
-
-# run as a test by test/Makefile.am
-noinst_PROGRAMS += bus-test bus-test-system
-
-if DBUS_UNIX
-# run as a test by test/Makefile.am
-noinst_PROGRAMS += bus-test-launch-helper
-# this is used by the tests but is not,itself, a test
-noinst_PROGRAMS += dbus-daemon-launch-helper-test
-endif DBUS_UNIX
-
-endif DBUS_ENABLE_EMBEDDED_TESTS
-
-bus_test_system_SOURCES= \
- $(XML_SOURCES) \
- config-parser-common.c \
- config-parser-common.h \
- config-parser-trivial.c \
- config-parser-trivial.h \
- utils.c \
- utils.h \
- test-system.c
-
-bus_test_system_LDADD=$(top_builddir)/dbus/libdbus-internal.la $(DBUS_BUS_LIBS)
-
-bus_test_SOURCES= \
- $(BUS_SOURCES) \
- test-main.c
-
-bus_test_LDADD=$(top_builddir)/dbus/libdbus-internal.la $(DBUS_BUS_LIBS)
-
-## mop up the gcov files
-clean-local:
- /bin/rm *.bb *.bbg *.da *.gcov || true
-
-install-data-hook:
- $(mkinstalldirs) $(DESTDIR)$(localstatedir)/run/dbus
- $(mkinstalldirs) $(DESTDIR)$(configdir)/system.d
- $(mkinstalldirs) $(DESTDIR)$(configdir)/session.d
- $(mkinstalldirs) $(DESTDIR)$(datadir)/dbus-1/services
- $(mkinstalldirs) $(DESTDIR)$(datadir)/dbus-1/system-services
-if HAVE_SYSTEMD
-# Install dbus.socket as default implementation of a D-Bus stack.
-# Deliberately not using $(LN_S) here: ln -fs is not universally portable,
-# but neither is systemd, so it's OK to assume here that ln complies with SUS.
- $(mkinstalldirs) $(DESTDIR)$(systemdsystemunitdir)/dbus.target.wants
- ln -fs ../dbus.socket $(DESTDIR)$(systemdsystemunitdir)/dbus.target.wants/dbus.socket
-# Unconditionally enable D-Bus on systemd installations
- $(mkinstalldirs) $(DESTDIR)$(systemdsystemunitdir)/sockets.target.wants
- ln -fs ../dbus.socket $(DESTDIR)$(systemdsystemunitdir)/sockets.target.wants/dbus.socket
- $(mkinstalldirs) $(DESTDIR)$(systemdsystemunitdir)/multi-user.target.wants
- ln -fs ../dbus.service $(DESTDIR)$(systemdsystemunitdir)/multi-user.target.wants/dbus.service
-endif
-
-if DBUS_UNIX
-install-exec-hook:
- if test `id -u` -eq 0; then \
- chown root:$(DBUS_USER) $(DESTDIR)$(libexecdir)/dbus-daemon-launch-helper$(EXEEXT); \
- chmod 4750 $(DESTDIR)$(libexecdir)/dbus-daemon-launch-helper$(EXEEXT); \
- else \
- echo "Not installing $(DESTDIR)$(libexecdir)/dbus-daemon-launch-helper binary setuid!"; \
- echo "You'll need to manually set permissions to root:$(DBUS_USER) and permissions 4750"; \
- fi
-endif
-
-#### Init scripts fun
-SCRIPT_IN_FILES=messagebus.in \
- messagebus-config.in \
- rc.messagebus.in
-
-## Red Hat start
-if DBUS_INIT_SCRIPTS_RED_HAT
-
-initddir=$(sysconfdir)/rc.d/init.d
-
-initd_SCRIPTS= \
- messagebus
-
-endif
- ## Red Hat end
-
-## Slackware start
-if DBUS_INIT_SCRIPTS_SLACKWARE
-
-initddir=$(sysconfdir)/rc.d/
-
-initd_SCRIPTS= \
- rc.messagebus
-
-endif
-## Slackware end
-
-## Cygwin start
-if DBUS_INIT_SCRIPTS_CYGWIN
-
-bin_SCRIPTS= \
- messagebus-config
-
-endif
-## Cygwin end
-
-if HAVE_SYSTEMD
-SCRIPT_IN_FILES += \
- dbus.service.in \
- dbus.socket.in
-
-systemdsystemunit_DATA = \
- dbus.service \
- dbus.socket
-endif
-
-#### Extra dist
-
-EXTRA_DIST=$(CONFIG_IN_FILES) $(SCRIPT_IN_FILES)
diff --git a/src/3rd_party/dbus-1.7.8/bus/Makefile.in b/src/3rd_party/dbus-1.7.8/bus/Makefile.in
deleted file mode 100644
index b9ea356158..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/Makefile.in
+++ /dev/null
@@ -1,1475 +0,0 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
-dbus_daemon_exec_PROGRAMS = dbus-daemon$(EXEEXT)
-@DBUS_UNIX_TRUE@libexec_PROGRAMS = dbus-daemon-launch-helper$(EXEEXT)
-
-# run as a test by test/Makefile.am
-@DBUS_ENABLE_EMBEDDED_TESTS_TRUE@am__append_1 = bus-test bus-test-system
-
-# run as a test by test/Makefile.am
-# this is used by the tests but is not,itself, a test
-@DBUS_ENABLE_EMBEDDED_TESTS_TRUE@@DBUS_UNIX_TRUE@am__append_2 = bus-test-launch-helper \
-@DBUS_ENABLE_EMBEDDED_TESTS_TRUE@@DBUS_UNIX_TRUE@ dbus-daemon-launch-helper-test
-@HAVE_SYSTEMD_TRUE@am__append_3 = \
-@HAVE_SYSTEMD_TRUE@ dbus.service.in \
-@HAVE_SYSTEMD_TRUE@ dbus.socket.in
-
-subdir = bus
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(srcdir)/dbus.service.in $(srcdir)/dbus.socket.in \
- $(srcdir)/messagebus-config.in $(srcdir)/messagebus.in \
- $(srcdir)/org.freedesktop.dbus-session.plist.in \
- $(srcdir)/rc.messagebus.in $(srcdir)/session.conf.in \
- $(srcdir)/system.conf.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \
- $(top_srcdir)/m4/compiler.m4 $(top_srcdir)/m4/libtool.m4 \
- $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
- $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
- $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/m4/tp-compiler-flag.m4 \
- $(top_srcdir)/m4/tp-compiler-warnings.m4 \
- $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = system.conf session.conf messagebus \
- messagebus-config org.freedesktop.dbus-session.plist \
- rc.messagebus dbus.service dbus.socket
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(dbus_daemon_execdir)" \
- "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" \
- "$(DESTDIR)$(initddir)" "$(DESTDIR)$(agentdir)" \
- "$(DESTDIR)$(configdir)" "$(DESTDIR)$(systemdsystemunitdir)"
-@DBUS_ENABLE_EMBEDDED_TESTS_TRUE@am__EXEEXT_1 = bus-test$(EXEEXT) \
-@DBUS_ENABLE_EMBEDDED_TESTS_TRUE@ bus-test-system$(EXEEXT)
-@DBUS_ENABLE_EMBEDDED_TESTS_TRUE@@DBUS_UNIX_TRUE@am__EXEEXT_2 = bus-test-launch-helper$(EXEEXT) \
-@DBUS_ENABLE_EMBEDDED_TESTS_TRUE@@DBUS_UNIX_TRUE@ dbus-daemon-launch-helper-test$(EXEEXT)
-PROGRAMS = $(dbus_daemon_exec_PROGRAMS) $(libexec_PROGRAMS) \
- $(noinst_PROGRAMS)
-am__bus_test_SOURCES_DIST = activation.c activation.h \
- activation-exit-codes.h bus.c bus.h config-parser.c \
- config-parser.h config-parser-common.c config-parser-common.h \
- connection.c connection.h desktop-file.c desktop-file.h \
- dir-watch-default.c dir-watch-inotify.c dir-watch-kqueue.c \
- dir-watch.h dispatch.c dispatch.h driver.c driver.h \
- expirelist.c expirelist.h policy.c policy.h selinux.h \
- selinux.c services.c services.h signals.c signals.h stats.c \
- stats.h test.c test.h utils.c utils.h config-loader-expat.c \
- test-main.c
-@DBUS_BUS_ENABLE_INOTIFY_FALSE@@DBUS_BUS_ENABLE_KQUEUE_FALSE@am__objects_1 = dir-watch-default.$(OBJEXT)
-@DBUS_BUS_ENABLE_INOTIFY_TRUE@@DBUS_BUS_ENABLE_KQUEUE_FALSE@am__objects_1 = dir-watch-inotify.$(OBJEXT)
-@DBUS_BUS_ENABLE_KQUEUE_TRUE@am__objects_1 = \
-@DBUS_BUS_ENABLE_KQUEUE_TRUE@ dir-watch-kqueue.$(OBJEXT)
-am__objects_2 = config-loader-expat.$(OBJEXT)
-am__objects_3 = activation.$(OBJEXT) bus.$(OBJEXT) \
- config-parser.$(OBJEXT) config-parser-common.$(OBJEXT) \
- connection.$(OBJEXT) desktop-file.$(OBJEXT) $(am__objects_1) \
- dispatch.$(OBJEXT) driver.$(OBJEXT) expirelist.$(OBJEXT) \
- policy.$(OBJEXT) selinux.$(OBJEXT) services.$(OBJEXT) \
- signals.$(OBJEXT) stats.$(OBJEXT) test.$(OBJEXT) \
- utils.$(OBJEXT) $(am__objects_2)
-am_bus_test_OBJECTS = $(am__objects_3) test-main.$(OBJEXT)
-bus_test_OBJECTS = $(am_bus_test_OBJECTS)
-am__DEPENDENCIES_1 =
-am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-bus_test_DEPENDENCIES = $(top_builddir)/dbus/libdbus-internal.la \
- $(am__DEPENDENCIES_2)
-AM_V_lt = $(am__v_lt_@AM_V@)
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-am__objects_4 = bus_test_launch_helper-config-loader-expat.$(OBJEXT)
-am__objects_5 = $(am__objects_4) \
- bus_test_launch_helper-config-parser-common.$(OBJEXT) \
- bus_test_launch_helper-config-parser-trivial.$(OBJEXT) \
- bus_test_launch_helper-desktop-file.$(OBJEXT) \
- bus_test_launch_helper-utils.$(OBJEXT) \
- bus_test_launch_helper-activation-helper.$(OBJEXT)
-am_bus_test_launch_helper_OBJECTS = \
- bus_test_launch_helper-test-launch-helper.$(OBJEXT) \
- $(am__objects_5)
-bus_test_launch_helper_OBJECTS = $(am_bus_test_launch_helper_OBJECTS)
-am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-bus_test_launch_helper_DEPENDENCIES = \
- $(top_builddir)/dbus/libdbus-internal.la $(am__DEPENDENCIES_3)
-am_bus_test_system_OBJECTS = $(am__objects_2) \
- config-parser-common.$(OBJEXT) config-parser-trivial.$(OBJEXT) \
- utils.$(OBJEXT) test-system.$(OBJEXT)
-bus_test_system_OBJECTS = $(am_bus_test_system_OBJECTS)
-bus_test_system_DEPENDENCIES = \
- $(top_builddir)/dbus/libdbus-internal.la $(am__DEPENDENCIES_2)
-am__dbus_daemon_SOURCES_DIST = activation.c activation.h \
- activation-exit-codes.h bus.c bus.h config-parser.c \
- config-parser.h config-parser-common.c config-parser-common.h \
- connection.c connection.h desktop-file.c desktop-file.h \
- dir-watch-default.c dir-watch-inotify.c dir-watch-kqueue.c \
- dir-watch.h dispatch.c dispatch.h driver.c driver.h \
- expirelist.c expirelist.h policy.c policy.h selinux.h \
- selinux.c services.c services.h signals.c signals.h stats.c \
- stats.h test.c test.h utils.c utils.h config-loader-expat.c \
- main.c
-am_dbus_daemon_OBJECTS = $(am__objects_3) main.$(OBJEXT)
-dbus_daemon_OBJECTS = $(am_dbus_daemon_OBJECTS)
-dbus_daemon_DEPENDENCIES = $(top_builddir)/dbus/libdbus-internal.la \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
-am__objects_6 = $(am__objects_2) config-parser-common.$(OBJEXT) \
- config-parser-trivial.$(OBJEXT) desktop-file.$(OBJEXT) \
- utils.$(OBJEXT) activation-helper.$(OBJEXT)
-am_dbus_daemon_launch_helper_OBJECTS = \
- activation-helper-bin.$(OBJEXT) $(am__objects_6)
-dbus_daemon_launch_helper_OBJECTS = \
- $(am_dbus_daemon_launch_helper_OBJECTS)
-dbus_daemon_launch_helper_DEPENDENCIES = \
- $(top_builddir)/dbus/libdbus-internal.la $(am__DEPENDENCIES_3)
-am__objects_7 = \
- dbus_daemon_launch_helper_test-config-loader-expat.$(OBJEXT)
-am__objects_8 = $(am__objects_7) \
- dbus_daemon_launch_helper_test-config-parser-common.$(OBJEXT) \
- dbus_daemon_launch_helper_test-config-parser-trivial.$(OBJEXT) \
- dbus_daemon_launch_helper_test-desktop-file.$(OBJEXT) \
- dbus_daemon_launch_helper_test-utils.$(OBJEXT) \
- dbus_daemon_launch_helper_test-activation-helper.$(OBJEXT)
-am_dbus_daemon_launch_helper_test_OBJECTS = dbus_daemon_launch_helper_test-activation-helper-bin.$(OBJEXT) \
- $(am__objects_8)
-dbus_daemon_launch_helper_test_OBJECTS = \
- $(am_dbus_daemon_launch_helper_test_OBJECTS)
-dbus_daemon_launch_helper_test_DEPENDENCIES = \
- $(top_builddir)/dbus/libdbus-internal.la $(am__DEPENDENCIES_3)
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-SCRIPTS = $(bin_SCRIPTS) $(initd_SCRIPTS)
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_@AM_V@)
-am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_@AM_V@)
-am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
-SOURCES = $(bus_test_SOURCES) $(bus_test_launch_helper_SOURCES) \
- $(bus_test_system_SOURCES) $(dbus_daemon_SOURCES) \
- $(dbus_daemon_launch_helper_SOURCES) \
- $(dbus_daemon_launch_helper_test_SOURCES)
-DIST_SOURCES = $(am__bus_test_SOURCES_DIST) \
- $(bus_test_launch_helper_SOURCES) $(bus_test_system_SOURCES) \
- $(am__dbus_daemon_SOURCES_DIST) \
- $(dbus_daemon_launch_helper_SOURCES) \
- $(dbus_daemon_launch_helper_test_SOURCES)
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-DATA = $(agent_DATA) $(config_DATA) $(systemdsystemunit_DATA)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-ADT_LIBS = @ADT_LIBS@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_FILEVERSION = @BUILD_FILEVERSION@
-BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBUS_BINDIR = @DBUS_BINDIR@
-DBUS_CONSOLE_AUTH_DIR = @DBUS_CONSOLE_AUTH_DIR@
-DBUS_CONSOLE_OWNER_FILE = @DBUS_CONSOLE_OWNER_FILE@
-DBUS_DAEMONDIR = @DBUS_DAEMONDIR@
-DBUS_DATADIR = @DBUS_DATADIR@
-DBUS_GLIB_CFLAGS = @DBUS_GLIB_CFLAGS@
-DBUS_GLIB_LIBS = @DBUS_GLIB_LIBS@
-DBUS_INT16_TYPE = @DBUS_INT16_TYPE@
-DBUS_INT32_TYPE = @DBUS_INT32_TYPE@
-DBUS_INT64_CONSTANT = @DBUS_INT64_CONSTANT@
-DBUS_INT64_TYPE = @DBUS_INT64_TYPE@
-DBUS_LIBEXECDIR = @DBUS_LIBEXECDIR@
-DBUS_MAJOR_VERSION = @DBUS_MAJOR_VERSION@
-DBUS_MICRO_VERSION = @DBUS_MICRO_VERSION@
-DBUS_MINOR_VERSION = @DBUS_MINOR_VERSION@
-DBUS_PATH_OR_ABSTRACT = @DBUS_PATH_OR_ABSTRACT@
-DBUS_PREFIX = @DBUS_PREFIX@
-DBUS_SESSION_BUS_CONNECT_ADDRESS = @DBUS_SESSION_BUS_CONNECT_ADDRESS@
-DBUS_SESSION_BUS_LISTEN_ADDRESS = @DBUS_SESSION_BUS_LISTEN_ADDRESS@
-DBUS_SESSION_SOCKET_DIR = @DBUS_SESSION_SOCKET_DIR@
-DBUS_STATIC_BUILD_CPPFLAGS = @DBUS_STATIC_BUILD_CPPFLAGS@
-DBUS_SYSTEM_BUS_DEFAULT_ADDRESS = @DBUS_SYSTEM_BUS_DEFAULT_ADDRESS@
-DBUS_SYSTEM_PID_FILE = @DBUS_SYSTEM_PID_FILE@
-DBUS_SYSTEM_SOCKET = @DBUS_SYSTEM_SOCKET@
-DBUS_TEST_DATA = @DBUS_TEST_DATA@
-DBUS_TEST_EXEC = @DBUS_TEST_EXEC@
-DBUS_UINT64_CONSTANT = @DBUS_UINT64_CONSTANT@
-DBUS_USER = @DBUS_USER@
-DBUS_VERSION = @DBUS_VERSION@
-DBUS_X_CFLAGS = @DBUS_X_CFLAGS@
-DBUS_X_LIBS = @DBUS_X_LIBS@
-DEFAULT_MESSAGE_UNIX_FDS = @DEFAULT_MESSAGE_UNIX_FDS@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DOXYGEN = @DOXYGEN@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPANDED_BINDIR = @EXPANDED_BINDIR@
-EXPANDED_DATADIR = @EXPANDED_DATADIR@
-EXPANDED_LIBDIR = @EXPANDED_LIBDIR@
-EXPANDED_LIBEXECDIR = @EXPANDED_LIBEXECDIR@
-EXPANDED_LOCALSTATEDIR = @EXPANDED_LOCALSTATEDIR@
-EXPANDED_PREFIX = @EXPANDED_PREFIX@
-EXPANDED_SYSCONFDIR = @EXPANDED_SYSCONFDIR@
-FGREP = @FGREP@
-GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
-GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_LIBS = @GLIB_LIBS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LAUNCHCTL = @LAUNCHCTL@
-LAUNCHD_AGENT_DIR = @LAUNCHD_AGENT_DIR@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBDBUS_LIBS = @LIBDBUS_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_REVISION = @LT_REVISION@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NETWORK_libs = @NETWORK_libs@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PYTHON = @PYTHON@
-PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
-PYTHON_PLATFORM = @PYTHON_PLATFORM@
-PYTHON_PREFIX = @PYTHON_PREFIX@
-PYTHON_VERSION = @PYTHON_VERSION@
-RANLIB = @RANLIB@
-RC = @RC@
-R_DYNAMIC_LDFLAG = @R_DYNAMIC_LDFLAG@
-SED = @SED@
-SELINUX_LIBS = @SELINUX_LIBS@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
-SYSTEMD_LIBS = @SYSTEMD_LIBS@
-TEST_LAUNCH_HELPER_BINARY = @TEST_LAUNCH_HELPER_BINARY@
-TEST_LISTEN = @TEST_LISTEN@
-TEST_SOCKET_DIR = @TEST_SOCKET_DIR@
-THREAD_LIBS = @THREAD_LIBS@
-VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
-VALGRIND_LIBS = @VALGRIND_LIBS@
-VERSION = @VERSION@
-WINDRES = @WINDRES@
-XMKMF = @XMKMF@
-XMLTO = @XMLTO@
-XML_CFLAGS = @XML_CFLAGS@
-XML_LIBS = @XML_LIBS@
-XSLTPROC = @XSLTPROC@
-X_CFLAGS = @X_CFLAGS@
-X_EXTRA_LIBS = @X_EXTRA_LIBS@
-X_LIBS = @X_LIBS@
-X_PRE_LIBS = @X_PRE_LIBS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgpyexecdir = @pkgpyexecdir@
-pkgpythondir = @pkgpythondir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-pyexecdir = @pyexecdir@
-pythondir = @pythondir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-systemdsystemunitdir = @systemdsystemunitdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-configdir = $(sysconfdir)/dbus-1
-dbus_daemon_execdir = $(DBUS_DAEMONDIR)
-DBUS_BUS_LIBS = \
- $(XML_LIBS) \
- $(SELINUX_LIBS) \
- $(THREAD_LIBS) \
- $(ADT_LIBS) \
- $(NETWORK_libs) \
- $(NULL)
-
-DBUS_LAUNCHER_LIBS = \
- $(XML_LIBS) \
- $(THREAD_LIBS) \
- $(NETWORK_libs) \
- $(NULL)
-
-AM_CPPFLAGS = \
- -I$(top_srcdir) \
- $(XML_CFLAGS) \
- -DDBUS_SYSTEM_CONFIG_FILE=\""$(configdir)/system.conf"\" \
- -DDBUS_COMPILATION \
- -DDBUS_STATIC_BUILD \
- $(NULL)
-
-
-# if assertions are enabled, improve backtraces
-AM_LDFLAGS = @R_DYNAMIC_LDFLAG@
-EFENCE =
-CONFIG_IN_FILES = \
- session.conf.in \
- system.conf.in \
- org.freedesktop.dbus-session.plist.in
-
-config_DATA = \
- session.conf \
- system.conf
-
-@DBUS_ENABLE_LAUNCHD_TRUE@agentdir = $(LAUNCHD_AGENT_DIR)
-@DBUS_ENABLE_LAUNCHD_TRUE@agent_DATA = org.freedesktop.dbus-session.plist
-XML_SOURCES = config-loader-expat.c
-@DBUS_BUS_ENABLE_INOTIFY_FALSE@@DBUS_BUS_ENABLE_KQUEUE_FALSE@DIR_WATCH_SOURCE = dir-watch-default.c
-@DBUS_BUS_ENABLE_INOTIFY_TRUE@@DBUS_BUS_ENABLE_KQUEUE_FALSE@DIR_WATCH_SOURCE = dir-watch-inotify.c
-@DBUS_BUS_ENABLE_KQUEUE_TRUE@DIR_WATCH_SOURCE = dir-watch-kqueue.c
-BUS_SOURCES = \
- activation.c \
- activation.h \
- activation-exit-codes.h \
- bus.c \
- bus.h \
- config-parser.c \
- config-parser.h \
- config-parser-common.c \
- config-parser-common.h \
- connection.c \
- connection.h \
- desktop-file.c \
- desktop-file.h \
- $(DIR_WATCH_SOURCE) \
- dir-watch.h \
- dispatch.c \
- dispatch.h \
- driver.c \
- driver.h \
- expirelist.c \
- expirelist.h \
- policy.c \
- policy.h \
- selinux.h \
- selinux.c \
- services.c \
- services.h \
- signals.c \
- signals.h \
- stats.c \
- stats.h \
- test.c \
- test.h \
- utils.c \
- utils.h \
- $(XML_SOURCES)
-
-dbus_daemon_SOURCES = \
- $(BUS_SOURCES) \
- main.c
-
-dbus_daemon_LDADD = \
- $(top_builddir)/dbus/libdbus-internal.la \
- $(EFENCE) \
- $(DBUS_BUS_LIBS)
-
-LAUNCH_HELPER_SOURCES = \
- $(XML_SOURCES) \
- config-parser-common.c \
- config-parser-common.h \
- config-parser-trivial.c \
- config-parser-trivial.h \
- desktop-file.c \
- desktop-file.h \
- utils.c \
- utils.h \
- activation-exit-codes.h \
- activation-helper.h \
- activation-helper.c
-
-dbus_daemon_launch_helper_SOURCES = \
- activation-helper-bin.c \
- $(LAUNCH_HELPER_SOURCES)
-
-dbus_daemon_launch_helper_LDADD = \
- $(top_builddir)/dbus/libdbus-internal.la \
- $(DBUS_LAUNCHER_LIBS)
-
-dbus_daemon_launch_helper_test_SOURCES = \
- activation-helper-bin.c \
- $(LAUNCH_HELPER_SOURCES)
-
-dbus_daemon_launch_helper_test_LDADD = \
- $(top_builddir)/dbus/libdbus-internal.la \
- $(DBUS_LAUNCHER_LIBS)
-
-dbus_daemon_launch_helper_test_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- -DACTIVATION_LAUNCHER_TEST
-
-bus_test_launch_helper_SOURCES = \
- test-launch-helper.c \
- $(LAUNCH_HELPER_SOURCES)
-
-bus_test_launch_helper_LDADD = \
- $(top_builddir)/dbus/libdbus-internal.la \
- $(DBUS_LAUNCHER_LIBS)
-
-bus_test_launch_helper_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- -DACTIVATION_LAUNCHER_TEST \
- -DACTIVATION_LAUNCHER_DO_OOM
-
-bus_test_system_SOURCES = \
- $(XML_SOURCES) \
- config-parser-common.c \
- config-parser-common.h \
- config-parser-trivial.c \
- config-parser-trivial.h \
- utils.c \
- utils.h \
- test-system.c
-
-bus_test_system_LDADD = $(top_builddir)/dbus/libdbus-internal.la $(DBUS_BUS_LIBS)
-bus_test_SOURCES = \
- $(BUS_SOURCES) \
- test-main.c
-
-bus_test_LDADD = $(top_builddir)/dbus/libdbus-internal.la $(DBUS_BUS_LIBS)
-
-#### Init scripts fun
-SCRIPT_IN_FILES = messagebus.in messagebus-config.in rc.messagebus.in \
- $(am__append_3)
-@DBUS_INIT_SCRIPTS_RED_HAT_TRUE@initddir = $(sysconfdir)/rc.d/init.d
-@DBUS_INIT_SCRIPTS_SLACKWARE_TRUE@initddir = $(sysconfdir)/rc.d/
-@DBUS_INIT_SCRIPTS_RED_HAT_TRUE@initd_SCRIPTS = \
-@DBUS_INIT_SCRIPTS_RED_HAT_TRUE@ messagebus
-
-@DBUS_INIT_SCRIPTS_SLACKWARE_TRUE@initd_SCRIPTS = \
-@DBUS_INIT_SCRIPTS_SLACKWARE_TRUE@ rc.messagebus
-
-@DBUS_INIT_SCRIPTS_CYGWIN_TRUE@bin_SCRIPTS = \
-@DBUS_INIT_SCRIPTS_CYGWIN_TRUE@ messagebus-config
-
-@HAVE_SYSTEMD_TRUE@systemdsystemunit_DATA = \
-@HAVE_SYSTEMD_TRUE@ dbus.service \
-@HAVE_SYSTEMD_TRUE@ dbus.socket
-
-
-#### Extra dist
-EXTRA_DIST = $(CONFIG_IN_FILES) $(SCRIPT_IN_FILES)
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu bus/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu bus/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-system.conf: $(top_builddir)/config.status $(srcdir)/system.conf.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-session.conf: $(top_builddir)/config.status $(srcdir)/session.conf.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-messagebus: $(top_builddir)/config.status $(srcdir)/messagebus.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-messagebus-config: $(top_builddir)/config.status $(srcdir)/messagebus-config.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-org.freedesktop.dbus-session.plist: $(top_builddir)/config.status $(srcdir)/org.freedesktop.dbus-session.plist.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-rc.messagebus: $(top_builddir)/config.status $(srcdir)/rc.messagebus.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-dbus.service: $(top_builddir)/config.status $(srcdir)/dbus.service.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-dbus.socket: $(top_builddir)/config.status $(srcdir)/dbus.socket.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-install-dbus_daemon_execPROGRAMS: $(dbus_daemon_exec_PROGRAMS)
- @$(NORMAL_INSTALL)
- @list='$(dbus_daemon_exec_PROGRAMS)'; test -n "$(dbus_daemon_execdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(dbus_daemon_execdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(dbus_daemon_execdir)" || exit 1; \
- fi; \
- for p in $$list; do echo "$$p $$p"; done | \
- sed 's/$(EXEEXT)$$//' | \
- while read p p1; do if test -f $$p || test -f $$p1; \
- then echo "$$p"; echo "$$p"; else :; fi; \
- done | \
- sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
- -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
- sed 'N;N;N;s,\n, ,g' | \
- $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
- { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
- if ($$2 == $$4) files[d] = files[d] " " $$1; \
- else { print "f", $$3 "/" $$4, $$1; } } \
- END { for (d in files) print "f", d, files[d] }' | \
- while read type dir files; do \
- if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
- test -z "$$files" || { \
- echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(dbus_daemon_execdir)$$dir'"; \
- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(dbus_daemon_execdir)$$dir" || exit $$?; \
- } \
- ; done
-
-uninstall-dbus_daemon_execPROGRAMS:
- @$(NORMAL_UNINSTALL)
- @list='$(dbus_daemon_exec_PROGRAMS)'; test -n "$(dbus_daemon_execdir)" || list=; \
- files=`for p in $$list; do echo "$$p"; done | \
- sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
- -e 's/$$/$(EXEEXT)/' `; \
- test -n "$$list" || exit 0; \
- echo " ( cd '$(DESTDIR)$(dbus_daemon_execdir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(dbus_daemon_execdir)" && rm -f $$files
-
-clean-dbus_daemon_execPROGRAMS:
- @list='$(dbus_daemon_exec_PROGRAMS)'; test -n "$$list" || exit 0; \
- echo " rm -f" $$list; \
- rm -f $$list || exit $$?; \
- test -n "$(EXEEXT)" || exit 0; \
- list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f" $$list; \
- rm -f $$list
-install-libexecPROGRAMS: $(libexec_PROGRAMS)
- @$(NORMAL_INSTALL)
- @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \
- fi; \
- for p in $$list; do echo "$$p $$p"; done | \
- sed 's/$(EXEEXT)$$//' | \
- while read p p1; do if test -f $$p || test -f $$p1; \
- then echo "$$p"; echo "$$p"; else :; fi; \
- done | \
- sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
- -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
- sed 'N;N;N;s,\n, ,g' | \
- $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
- { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
- if ($$2 == $$4) files[d] = files[d] " " $$1; \
- else { print "f", $$3 "/" $$4, $$1; } } \
- END { for (d in files) print "f", d, files[d] }' | \
- while read type dir files; do \
- if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
- test -z "$$files" || { \
- echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \
- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \
- } \
- ; done
-
-uninstall-libexecPROGRAMS:
- @$(NORMAL_UNINSTALL)
- @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \
- files=`for p in $$list; do echo "$$p"; done | \
- sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
- -e 's/$$/$(EXEEXT)/' `; \
- test -n "$$list" || exit 0; \
- echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(libexecdir)" && rm -f $$files
-
-clean-libexecPROGRAMS:
- @list='$(libexec_PROGRAMS)'; test -n "$$list" || exit 0; \
- echo " rm -f" $$list; \
- rm -f $$list || exit $$?; \
- test -n "$(EXEEXT)" || exit 0; \
- list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f" $$list; \
- rm -f $$list
-
-clean-noinstPROGRAMS:
- @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
- echo " rm -f" $$list; \
- rm -f $$list || exit $$?; \
- test -n "$(EXEEXT)" || exit 0; \
- list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f" $$list; \
- rm -f $$list
-bus-test$(EXEEXT): $(bus_test_OBJECTS) $(bus_test_DEPENDENCIES) $(EXTRA_bus_test_DEPENDENCIES)
- @rm -f bus-test$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(bus_test_OBJECTS) $(bus_test_LDADD) $(LIBS)
-bus-test-launch-helper$(EXEEXT): $(bus_test_launch_helper_OBJECTS) $(bus_test_launch_helper_DEPENDENCIES) $(EXTRA_bus_test_launch_helper_DEPENDENCIES)
- @rm -f bus-test-launch-helper$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(bus_test_launch_helper_OBJECTS) $(bus_test_launch_helper_LDADD) $(LIBS)
-bus-test-system$(EXEEXT): $(bus_test_system_OBJECTS) $(bus_test_system_DEPENDENCIES) $(EXTRA_bus_test_system_DEPENDENCIES)
- @rm -f bus-test-system$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(bus_test_system_OBJECTS) $(bus_test_system_LDADD) $(LIBS)
-dbus-daemon$(EXEEXT): $(dbus_daemon_OBJECTS) $(dbus_daemon_DEPENDENCIES) $(EXTRA_dbus_daemon_DEPENDENCIES)
- @rm -f dbus-daemon$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(dbus_daemon_OBJECTS) $(dbus_daemon_LDADD) $(LIBS)
-dbus-daemon-launch-helper$(EXEEXT): $(dbus_daemon_launch_helper_OBJECTS) $(dbus_daemon_launch_helper_DEPENDENCIES) $(EXTRA_dbus_daemon_launch_helper_DEPENDENCIES)
- @rm -f dbus-daemon-launch-helper$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(dbus_daemon_launch_helper_OBJECTS) $(dbus_daemon_launch_helper_LDADD) $(LIBS)
-dbus-daemon-launch-helper-test$(EXEEXT): $(dbus_daemon_launch_helper_test_OBJECTS) $(dbus_daemon_launch_helper_test_DEPENDENCIES) $(EXTRA_dbus_daemon_launch_helper_test_DEPENDENCIES)
- @rm -f dbus-daemon-launch-helper-test$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(dbus_daemon_launch_helper_test_OBJECTS) $(dbus_daemon_launch_helper_test_LDADD) $(LIBS)
-install-binSCRIPTS: $(bin_SCRIPTS)
- @$(NORMAL_INSTALL)
- @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
- done | \
- sed -e 'p;s,.*/,,;n' \
- -e 'h;s|.*|.|' \
- -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
- $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
- { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
- if ($$2 == $$4) { files[d] = files[d] " " $$1; \
- if (++n[d] == $(am__install_max)) { \
- print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
- else { print "f", d "/" $$4, $$1 } } \
- END { for (d in files) print "f", d, files[d] }' | \
- while read type dir files; do \
- if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
- test -z "$$files" || { \
- echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
- $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
- } \
- ; done
-
-uninstall-binSCRIPTS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
- files=`for p in $$list; do echo "$$p"; done | \
- sed -e 's,.*/,,;$(transform)'`; \
- dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
-install-initdSCRIPTS: $(initd_SCRIPTS)
- @$(NORMAL_INSTALL)
- @list='$(initd_SCRIPTS)'; test -n "$(initddir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(initddir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(initddir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
- done | \
- sed -e 'p;s,.*/,,;n' \
- -e 'h;s|.*|.|' \
- -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
- $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
- { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
- if ($$2 == $$4) { files[d] = files[d] " " $$1; \
- if (++n[d] == $(am__install_max)) { \
- print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
- else { print "f", d "/" $$4, $$1 } } \
- END { for (d in files) print "f", d, files[d] }' | \
- while read type dir files; do \
- if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
- test -z "$$files" || { \
- echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(initddir)$$dir'"; \
- $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(initddir)$$dir" || exit $$?; \
- } \
- ; done
-
-uninstall-initdSCRIPTS:
- @$(NORMAL_UNINSTALL)
- @list='$(initd_SCRIPTS)'; test -n "$(initddir)" || exit 0; \
- files=`for p in $$list; do echo "$$p"; done | \
- sed -e 's,.*/,,;$(transform)'`; \
- dir='$(DESTDIR)$(initddir)'; $(am__uninstall_files_from_dir)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/activation-helper-bin.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/activation-helper.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/activation.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bus.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bus_test_launch_helper-activation-helper.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bus_test_launch_helper-config-loader-expat.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bus_test_launch_helper-config-parser-common.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bus_test_launch_helper-config-parser-trivial.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bus_test_launch_helper-desktop-file.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bus_test_launch_helper-test-launch-helper.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bus_test_launch_helper-utils.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config-loader-expat.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config-parser-common.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config-parser-trivial.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config-parser.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connection.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper-bin.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbus_daemon_launch_helper_test-config-loader-expat.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-common.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-trivial.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbus_daemon_launch_helper_test-desktop-file.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbus_daemon_launch_helper_test-utils.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/desktop-file.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir-watch-default.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir-watch-inotify.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir-watch-kqueue.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dispatch.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expirelist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selinux.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/services.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signals.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stats.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-system.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
-
-bus_test_launch_helper-test-launch-helper.o: test-launch-helper.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-test-launch-helper.o -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-test-launch-helper.Tpo -c -o bus_test_launch_helper-test-launch-helper.o `test -f 'test-launch-helper.c' || echo '$(srcdir)/'`test-launch-helper.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-test-launch-helper.Tpo $(DEPDIR)/bus_test_launch_helper-test-launch-helper.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-launch-helper.c' object='bus_test_launch_helper-test-launch-helper.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-test-launch-helper.o `test -f 'test-launch-helper.c' || echo '$(srcdir)/'`test-launch-helper.c
-
-bus_test_launch_helper-test-launch-helper.obj: test-launch-helper.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-test-launch-helper.obj -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-test-launch-helper.Tpo -c -o bus_test_launch_helper-test-launch-helper.obj `if test -f 'test-launch-helper.c'; then $(CYGPATH_W) 'test-launch-helper.c'; else $(CYGPATH_W) '$(srcdir)/test-launch-helper.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-test-launch-helper.Tpo $(DEPDIR)/bus_test_launch_helper-test-launch-helper.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-launch-helper.c' object='bus_test_launch_helper-test-launch-helper.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-test-launch-helper.obj `if test -f 'test-launch-helper.c'; then $(CYGPATH_W) 'test-launch-helper.c'; else $(CYGPATH_W) '$(srcdir)/test-launch-helper.c'; fi`
-
-bus_test_launch_helper-config-loader-expat.o: config-loader-expat.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-config-loader-expat.o -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-config-loader-expat.Tpo -c -o bus_test_launch_helper-config-loader-expat.o `test -f 'config-loader-expat.c' || echo '$(srcdir)/'`config-loader-expat.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-config-loader-expat.Tpo $(DEPDIR)/bus_test_launch_helper-config-loader-expat.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-loader-expat.c' object='bus_test_launch_helper-config-loader-expat.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-config-loader-expat.o `test -f 'config-loader-expat.c' || echo '$(srcdir)/'`config-loader-expat.c
-
-bus_test_launch_helper-config-loader-expat.obj: config-loader-expat.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-config-loader-expat.obj -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-config-loader-expat.Tpo -c -o bus_test_launch_helper-config-loader-expat.obj `if test -f 'config-loader-expat.c'; then $(CYGPATH_W) 'config-loader-expat.c'; else $(CYGPATH_W) '$(srcdir)/config-loader-expat.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-config-loader-expat.Tpo $(DEPDIR)/bus_test_launch_helper-config-loader-expat.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-loader-expat.c' object='bus_test_launch_helper-config-loader-expat.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-config-loader-expat.obj `if test -f 'config-loader-expat.c'; then $(CYGPATH_W) 'config-loader-expat.c'; else $(CYGPATH_W) '$(srcdir)/config-loader-expat.c'; fi`
-
-bus_test_launch_helper-config-parser-common.o: config-parser-common.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-config-parser-common.o -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-config-parser-common.Tpo -c -o bus_test_launch_helper-config-parser-common.o `test -f 'config-parser-common.c' || echo '$(srcdir)/'`config-parser-common.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-config-parser-common.Tpo $(DEPDIR)/bus_test_launch_helper-config-parser-common.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-parser-common.c' object='bus_test_launch_helper-config-parser-common.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-config-parser-common.o `test -f 'config-parser-common.c' || echo '$(srcdir)/'`config-parser-common.c
-
-bus_test_launch_helper-config-parser-common.obj: config-parser-common.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-config-parser-common.obj -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-config-parser-common.Tpo -c -o bus_test_launch_helper-config-parser-common.obj `if test -f 'config-parser-common.c'; then $(CYGPATH_W) 'config-parser-common.c'; else $(CYGPATH_W) '$(srcdir)/config-parser-common.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-config-parser-common.Tpo $(DEPDIR)/bus_test_launch_helper-config-parser-common.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-parser-common.c' object='bus_test_launch_helper-config-parser-common.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-config-parser-common.obj `if test -f 'config-parser-common.c'; then $(CYGPATH_W) 'config-parser-common.c'; else $(CYGPATH_W) '$(srcdir)/config-parser-common.c'; fi`
-
-bus_test_launch_helper-config-parser-trivial.o: config-parser-trivial.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-config-parser-trivial.o -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-config-parser-trivial.Tpo -c -o bus_test_launch_helper-config-parser-trivial.o `test -f 'config-parser-trivial.c' || echo '$(srcdir)/'`config-parser-trivial.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-config-parser-trivial.Tpo $(DEPDIR)/bus_test_launch_helper-config-parser-trivial.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-parser-trivial.c' object='bus_test_launch_helper-config-parser-trivial.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-config-parser-trivial.o `test -f 'config-parser-trivial.c' || echo '$(srcdir)/'`config-parser-trivial.c
-
-bus_test_launch_helper-config-parser-trivial.obj: config-parser-trivial.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-config-parser-trivial.obj -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-config-parser-trivial.Tpo -c -o bus_test_launch_helper-config-parser-trivial.obj `if test -f 'config-parser-trivial.c'; then $(CYGPATH_W) 'config-parser-trivial.c'; else $(CYGPATH_W) '$(srcdir)/config-parser-trivial.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-config-parser-trivial.Tpo $(DEPDIR)/bus_test_launch_helper-config-parser-trivial.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-parser-trivial.c' object='bus_test_launch_helper-config-parser-trivial.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-config-parser-trivial.obj `if test -f 'config-parser-trivial.c'; then $(CYGPATH_W) 'config-parser-trivial.c'; else $(CYGPATH_W) '$(srcdir)/config-parser-trivial.c'; fi`
-
-bus_test_launch_helper-desktop-file.o: desktop-file.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-desktop-file.o -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-desktop-file.Tpo -c -o bus_test_launch_helper-desktop-file.o `test -f 'desktop-file.c' || echo '$(srcdir)/'`desktop-file.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-desktop-file.Tpo $(DEPDIR)/bus_test_launch_helper-desktop-file.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='desktop-file.c' object='bus_test_launch_helper-desktop-file.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-desktop-file.o `test -f 'desktop-file.c' || echo '$(srcdir)/'`desktop-file.c
-
-bus_test_launch_helper-desktop-file.obj: desktop-file.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-desktop-file.obj -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-desktop-file.Tpo -c -o bus_test_launch_helper-desktop-file.obj `if test -f 'desktop-file.c'; then $(CYGPATH_W) 'desktop-file.c'; else $(CYGPATH_W) '$(srcdir)/desktop-file.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-desktop-file.Tpo $(DEPDIR)/bus_test_launch_helper-desktop-file.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='desktop-file.c' object='bus_test_launch_helper-desktop-file.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-desktop-file.obj `if test -f 'desktop-file.c'; then $(CYGPATH_W) 'desktop-file.c'; else $(CYGPATH_W) '$(srcdir)/desktop-file.c'; fi`
-
-bus_test_launch_helper-utils.o: utils.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-utils.o -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-utils.Tpo -c -o bus_test_launch_helper-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-utils.Tpo $(DEPDIR)/bus_test_launch_helper-utils.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='bus_test_launch_helper-utils.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
-
-bus_test_launch_helper-utils.obj: utils.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-utils.obj -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-utils.Tpo -c -o bus_test_launch_helper-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-utils.Tpo $(DEPDIR)/bus_test_launch_helper-utils.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='bus_test_launch_helper-utils.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
-
-bus_test_launch_helper-activation-helper.o: activation-helper.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-activation-helper.o -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-activation-helper.Tpo -c -o bus_test_launch_helper-activation-helper.o `test -f 'activation-helper.c' || echo '$(srcdir)/'`activation-helper.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-activation-helper.Tpo $(DEPDIR)/bus_test_launch_helper-activation-helper.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='activation-helper.c' object='bus_test_launch_helper-activation-helper.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-activation-helper.o `test -f 'activation-helper.c' || echo '$(srcdir)/'`activation-helper.c
-
-bus_test_launch_helper-activation-helper.obj: activation-helper.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bus_test_launch_helper-activation-helper.obj -MD -MP -MF $(DEPDIR)/bus_test_launch_helper-activation-helper.Tpo -c -o bus_test_launch_helper-activation-helper.obj `if test -f 'activation-helper.c'; then $(CYGPATH_W) 'activation-helper.c'; else $(CYGPATH_W) '$(srcdir)/activation-helper.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bus_test_launch_helper-activation-helper.Tpo $(DEPDIR)/bus_test_launch_helper-activation-helper.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='activation-helper.c' object='bus_test_launch_helper-activation-helper.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bus_test_launch_helper_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bus_test_launch_helper-activation-helper.obj `if test -f 'activation-helper.c'; then $(CYGPATH_W) 'activation-helper.c'; else $(CYGPATH_W) '$(srcdir)/activation-helper.c'; fi`
-
-dbus_daemon_launch_helper_test-activation-helper-bin.o: activation-helper-bin.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-activation-helper-bin.o -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper-bin.Tpo -c -o dbus_daemon_launch_helper_test-activation-helper-bin.o `test -f 'activation-helper-bin.c' || echo '$(srcdir)/'`activation-helper-bin.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper-bin.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper-bin.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='activation-helper-bin.c' object='dbus_daemon_launch_helper_test-activation-helper-bin.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-activation-helper-bin.o `test -f 'activation-helper-bin.c' || echo '$(srcdir)/'`activation-helper-bin.c
-
-dbus_daemon_launch_helper_test-activation-helper-bin.obj: activation-helper-bin.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-activation-helper-bin.obj -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper-bin.Tpo -c -o dbus_daemon_launch_helper_test-activation-helper-bin.obj `if test -f 'activation-helper-bin.c'; then $(CYGPATH_W) 'activation-helper-bin.c'; else $(CYGPATH_W) '$(srcdir)/activation-helper-bin.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper-bin.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper-bin.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='activation-helper-bin.c' object='dbus_daemon_launch_helper_test-activation-helper-bin.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-activation-helper-bin.obj `if test -f 'activation-helper-bin.c'; then $(CYGPATH_W) 'activation-helper-bin.c'; else $(CYGPATH_W) '$(srcdir)/activation-helper-bin.c'; fi`
-
-dbus_daemon_launch_helper_test-config-loader-expat.o: config-loader-expat.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-config-loader-expat.o -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-config-loader-expat.Tpo -c -o dbus_daemon_launch_helper_test-config-loader-expat.o `test -f 'config-loader-expat.c' || echo '$(srcdir)/'`config-loader-expat.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-config-loader-expat.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-config-loader-expat.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-loader-expat.c' object='dbus_daemon_launch_helper_test-config-loader-expat.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-config-loader-expat.o `test -f 'config-loader-expat.c' || echo '$(srcdir)/'`config-loader-expat.c
-
-dbus_daemon_launch_helper_test-config-loader-expat.obj: config-loader-expat.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-config-loader-expat.obj -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-config-loader-expat.Tpo -c -o dbus_daemon_launch_helper_test-config-loader-expat.obj `if test -f 'config-loader-expat.c'; then $(CYGPATH_W) 'config-loader-expat.c'; else $(CYGPATH_W) '$(srcdir)/config-loader-expat.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-config-loader-expat.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-config-loader-expat.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-loader-expat.c' object='dbus_daemon_launch_helper_test-config-loader-expat.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-config-loader-expat.obj `if test -f 'config-loader-expat.c'; then $(CYGPATH_W) 'config-loader-expat.c'; else $(CYGPATH_W) '$(srcdir)/config-loader-expat.c'; fi`
-
-dbus_daemon_launch_helper_test-config-parser-common.o: config-parser-common.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-config-parser-common.o -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-common.Tpo -c -o dbus_daemon_launch_helper_test-config-parser-common.o `test -f 'config-parser-common.c' || echo '$(srcdir)/'`config-parser-common.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-common.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-common.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-parser-common.c' object='dbus_daemon_launch_helper_test-config-parser-common.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-config-parser-common.o `test -f 'config-parser-common.c' || echo '$(srcdir)/'`config-parser-common.c
-
-dbus_daemon_launch_helper_test-config-parser-common.obj: config-parser-common.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-config-parser-common.obj -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-common.Tpo -c -o dbus_daemon_launch_helper_test-config-parser-common.obj `if test -f 'config-parser-common.c'; then $(CYGPATH_W) 'config-parser-common.c'; else $(CYGPATH_W) '$(srcdir)/config-parser-common.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-common.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-common.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-parser-common.c' object='dbus_daemon_launch_helper_test-config-parser-common.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-config-parser-common.obj `if test -f 'config-parser-common.c'; then $(CYGPATH_W) 'config-parser-common.c'; else $(CYGPATH_W) '$(srcdir)/config-parser-common.c'; fi`
-
-dbus_daemon_launch_helper_test-config-parser-trivial.o: config-parser-trivial.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-config-parser-trivial.o -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-trivial.Tpo -c -o dbus_daemon_launch_helper_test-config-parser-trivial.o `test -f 'config-parser-trivial.c' || echo '$(srcdir)/'`config-parser-trivial.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-trivial.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-trivial.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-parser-trivial.c' object='dbus_daemon_launch_helper_test-config-parser-trivial.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-config-parser-trivial.o `test -f 'config-parser-trivial.c' || echo '$(srcdir)/'`config-parser-trivial.c
-
-dbus_daemon_launch_helper_test-config-parser-trivial.obj: config-parser-trivial.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-config-parser-trivial.obj -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-trivial.Tpo -c -o dbus_daemon_launch_helper_test-config-parser-trivial.obj `if test -f 'config-parser-trivial.c'; then $(CYGPATH_W) 'config-parser-trivial.c'; else $(CYGPATH_W) '$(srcdir)/config-parser-trivial.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-trivial.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-config-parser-trivial.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config-parser-trivial.c' object='dbus_daemon_launch_helper_test-config-parser-trivial.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-config-parser-trivial.obj `if test -f 'config-parser-trivial.c'; then $(CYGPATH_W) 'config-parser-trivial.c'; else $(CYGPATH_W) '$(srcdir)/config-parser-trivial.c'; fi`
-
-dbus_daemon_launch_helper_test-desktop-file.o: desktop-file.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-desktop-file.o -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-desktop-file.Tpo -c -o dbus_daemon_launch_helper_test-desktop-file.o `test -f 'desktop-file.c' || echo '$(srcdir)/'`desktop-file.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-desktop-file.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-desktop-file.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='desktop-file.c' object='dbus_daemon_launch_helper_test-desktop-file.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-desktop-file.o `test -f 'desktop-file.c' || echo '$(srcdir)/'`desktop-file.c
-
-dbus_daemon_launch_helper_test-desktop-file.obj: desktop-file.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-desktop-file.obj -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-desktop-file.Tpo -c -o dbus_daemon_launch_helper_test-desktop-file.obj `if test -f 'desktop-file.c'; then $(CYGPATH_W) 'desktop-file.c'; else $(CYGPATH_W) '$(srcdir)/desktop-file.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-desktop-file.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-desktop-file.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='desktop-file.c' object='dbus_daemon_launch_helper_test-desktop-file.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-desktop-file.obj `if test -f 'desktop-file.c'; then $(CYGPATH_W) 'desktop-file.c'; else $(CYGPATH_W) '$(srcdir)/desktop-file.c'; fi`
-
-dbus_daemon_launch_helper_test-utils.o: utils.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-utils.o -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-utils.Tpo -c -o dbus_daemon_launch_helper_test-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-utils.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-utils.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='dbus_daemon_launch_helper_test-utils.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
-
-dbus_daemon_launch_helper_test-utils.obj: utils.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-utils.obj -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-utils.Tpo -c -o dbus_daemon_launch_helper_test-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-utils.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-utils.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='dbus_daemon_launch_helper_test-utils.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
-
-dbus_daemon_launch_helper_test-activation-helper.o: activation-helper.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-activation-helper.o -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper.Tpo -c -o dbus_daemon_launch_helper_test-activation-helper.o `test -f 'activation-helper.c' || echo '$(srcdir)/'`activation-helper.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='activation-helper.c' object='dbus_daemon_launch_helper_test-activation-helper.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-activation-helper.o `test -f 'activation-helper.c' || echo '$(srcdir)/'`activation-helper.c
-
-dbus_daemon_launch_helper_test-activation-helper.obj: activation-helper.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbus_daemon_launch_helper_test-activation-helper.obj -MD -MP -MF $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper.Tpo -c -o dbus_daemon_launch_helper_test-activation-helper.obj `if test -f 'activation-helper.c'; then $(CYGPATH_W) 'activation-helper.c'; else $(CYGPATH_W) '$(srcdir)/activation-helper.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper.Tpo $(DEPDIR)/dbus_daemon_launch_helper_test-activation-helper.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='activation-helper.c' object='dbus_daemon_launch_helper_test-activation-helper.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbus_daemon_launch_helper_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbus_daemon_launch_helper_test-activation-helper.obj `if test -f 'activation-helper.c'; then $(CYGPATH_W) 'activation-helper.c'; else $(CYGPATH_W) '$(srcdir)/activation-helper.c'; fi`
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-install-agentDATA: $(agent_DATA)
- @$(NORMAL_INSTALL)
- @list='$(agent_DATA)'; test -n "$(agentdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(agentdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(agentdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(agentdir)'"; \
- $(INSTALL_DATA) $$files "$(DESTDIR)$(agentdir)" || exit $$?; \
- done
-
-uninstall-agentDATA:
- @$(NORMAL_UNINSTALL)
- @list='$(agent_DATA)'; test -n "$(agentdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(agentdir)'; $(am__uninstall_files_from_dir)
-install-configDATA: $(config_DATA)
- @$(NORMAL_INSTALL)
- @list='$(config_DATA)'; test -n "$(configdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(configdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(configdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(configdir)'"; \
- $(INSTALL_DATA) $$files "$(DESTDIR)$(configdir)" || exit $$?; \
- done
-
-uninstall-configDATA:
- @$(NORMAL_UNINSTALL)
- @list='$(config_DATA)'; test -n "$(configdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(configdir)'; $(am__uninstall_files_from_dir)
-install-systemdsystemunitDATA: $(systemdsystemunit_DATA)
- @$(NORMAL_INSTALL)
- @list='$(systemdsystemunit_DATA)'; test -n "$(systemdsystemunitdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(systemdsystemunitdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(systemdsystemunitdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(systemdsystemunitdir)'"; \
- $(INSTALL_DATA) $$files "$(DESTDIR)$(systemdsystemunitdir)" || exit $$?; \
- done
-
-uninstall-systemdsystemunitDATA:
- @$(NORMAL_UNINSTALL)
- @list='$(systemdsystemunit_DATA)'; test -n "$(systemdsystemunitdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(systemdsystemunitdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(DATA)
-installdirs:
- for dir in "$(DESTDIR)$(dbus_daemon_execdir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(initddir)" "$(DESTDIR)$(agentdir)" "$(DESTDIR)$(configdir)" "$(DESTDIR)$(systemdsystemunitdir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-@DBUS_UNIX_FALSE@install-exec-hook:
-clean: clean-am
-
-clean-am: clean-dbus_daemon_execPROGRAMS clean-generic \
- clean-libexecPROGRAMS clean-libtool clean-local \
- clean-noinstPROGRAMS mostlyclean-am
-
-distclean: distclean-am
- -rm -rf ./$(DEPDIR)
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-agentDATA install-configDATA \
- install-initdSCRIPTS install-systemdsystemunitDATA
- @$(NORMAL_INSTALL)
- $(MAKE) $(AM_MAKEFLAGS) install-data-hook
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-binSCRIPTS install-dbus_daemon_execPROGRAMS \
- install-libexecPROGRAMS
- @$(NORMAL_INSTALL)
- $(MAKE) $(AM_MAKEFLAGS) install-exec-hook
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -rf ./$(DEPDIR)
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-agentDATA uninstall-binSCRIPTS \
- uninstall-configDATA uninstall-dbus_daemon_execPROGRAMS \
- uninstall-initdSCRIPTS uninstall-libexecPROGRAMS \
- uninstall-systemdsystemunitDATA
-
-.MAKE: install-am install-data-am install-exec-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean \
- clean-dbus_daemon_execPROGRAMS clean-generic \
- clean-libexecPROGRAMS clean-libtool clean-local \
- clean-noinstPROGRAMS ctags distclean distclean-compile \
- distclean-generic distclean-libtool distclean-tags distdir dvi \
- dvi-am html html-am info info-am install install-agentDATA \
- install-am install-binSCRIPTS install-configDATA install-data \
- install-data-am install-data-hook \
- install-dbus_daemon_execPROGRAMS install-dvi install-dvi-am \
- install-exec install-exec-am install-exec-hook install-html \
- install-html-am install-info install-info-am \
- install-initdSCRIPTS install-libexecPROGRAMS install-man \
- install-pdf install-pdf-am install-ps install-ps-am \
- install-strip install-systemdsystemunitDATA installcheck \
- installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-agentDATA uninstall-am \
- uninstall-binSCRIPTS uninstall-configDATA \
- uninstall-dbus_daemon_execPROGRAMS uninstall-initdSCRIPTS \
- uninstall-libexecPROGRAMS uninstall-systemdsystemunitDATA
-
-
-clean-local:
- /bin/rm *.bb *.bbg *.da *.gcov || true
-
-install-data-hook:
- $(mkinstalldirs) $(DESTDIR)$(localstatedir)/run/dbus
- $(mkinstalldirs) $(DESTDIR)$(configdir)/system.d
- $(mkinstalldirs) $(DESTDIR)$(configdir)/session.d
- $(mkinstalldirs) $(DESTDIR)$(datadir)/dbus-1/services
- $(mkinstalldirs) $(DESTDIR)$(datadir)/dbus-1/system-services
-# Install dbus.socket as default implementation of a D-Bus stack.
-# Deliberately not using $(LN_S) here: ln -fs is not universally portable,
-# but neither is systemd, so it's OK to assume here that ln complies with SUS.
-@HAVE_SYSTEMD_TRUE@ $(mkinstalldirs) $(DESTDIR)$(systemdsystemunitdir)/dbus.target.wants
-@HAVE_SYSTEMD_TRUE@ ln -fs ../dbus.socket $(DESTDIR)$(systemdsystemunitdir)/dbus.target.wants/dbus.socket
-# Unconditionally enable D-Bus on systemd installations
-@HAVE_SYSTEMD_TRUE@ $(mkinstalldirs) $(DESTDIR)$(systemdsystemunitdir)/sockets.target.wants
-@HAVE_SYSTEMD_TRUE@ ln -fs ../dbus.socket $(DESTDIR)$(systemdsystemunitdir)/sockets.target.wants/dbus.socket
-@HAVE_SYSTEMD_TRUE@ $(mkinstalldirs) $(DESTDIR)$(systemdsystemunitdir)/multi-user.target.wants
-@HAVE_SYSTEMD_TRUE@ ln -fs ../dbus.service $(DESTDIR)$(systemdsystemunitdir)/multi-user.target.wants/dbus.service
-
-@DBUS_UNIX_TRUE@install-exec-hook:
-@DBUS_UNIX_TRUE@ if test `id -u` -eq 0; then \
-@DBUS_UNIX_TRUE@ chown root:$(DBUS_USER) $(DESTDIR)$(libexecdir)/dbus-daemon-launch-helper$(EXEEXT); \
-@DBUS_UNIX_TRUE@ chmod 4750 $(DESTDIR)$(libexecdir)/dbus-daemon-launch-helper$(EXEEXT); \
-@DBUS_UNIX_TRUE@ else \
-@DBUS_UNIX_TRUE@ echo "Not installing $(DESTDIR)$(libexecdir)/dbus-daemon-launch-helper binary setuid!"; \
-@DBUS_UNIX_TRUE@ echo "You'll need to manually set permissions to root:$(DBUS_USER) and permissions 4750"; \
-@DBUS_UNIX_TRUE@ fi
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/src/3rd_party/dbus-1.7.8/bus/activation-exit-codes.h b/src/3rd_party/dbus-1.7.8/bus/activation-exit-codes.h
deleted file mode 100644
index bbb98dca37..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/activation-exit-codes.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* activation-exit-codes.h Return values for the launch helper which is set
- * in the helper and read in dbus-spawn.
- *
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_ACTIVATION_EXIT_CODES_H
-#define BUS_ACTIVATION_EXIT_CODES_H
-
-/** Return codes from the launch helper - not public API. However,
- * presumably if some third party did write their own launch helper,
- * they would have to rely on these, or at least always return
- * 1 for GENERIC_FAILURE.
- */
-#define BUS_SPAWN_EXIT_CODE_GENERIC_FAILURE 1
-#define BUS_SPAWN_EXIT_CODE_NO_MEMORY 2
-#define BUS_SPAWN_EXIT_CODE_CONFIG_INVALID 3
-#define BUS_SPAWN_EXIT_CODE_SETUP_FAILED 4
-#define BUS_SPAWN_EXIT_CODE_NAME_INVALID 5
-#define BUS_SPAWN_EXIT_CODE_SERVICE_NOT_FOUND 6
-#define BUS_SPAWN_EXIT_CODE_PERMISSIONS_INVALID 7
-#define BUS_SPAWN_EXIT_CODE_FILE_INVALID 8
-#define BUS_SPAWN_EXIT_CODE_EXEC_FAILED 9
-#define BUS_SPAWN_EXIT_CODE_INVALID_ARGS 10
-#define BUS_SPAWN_EXIT_CODE_CHILD_SIGNALED 11
-
-#endif /* BUS_ACTIVATION_EXIT_CODES_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/activation-helper-bin.c b/src/3rd_party/dbus-1.7.8/bus/activation-helper-bin.c
deleted file mode 100644
index f5f16d2cef..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/activation-helper-bin.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* activation-helper-bin.c Setuid helper for launching programs as a custom
- * user. This file is security sensitive.
- *
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-
-#include "utils.h"
-#include "activation-helper.h"
-#include "activation-exit-codes.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static int
-convert_error_to_exit_code (DBusError *error)
-{
- if (dbus_error_has_name (error, DBUS_ERROR_NO_MEMORY))
- return BUS_SPAWN_EXIT_CODE_NO_MEMORY;
-
- if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_CONFIG_INVALID))
- return BUS_SPAWN_EXIT_CODE_CONFIG_INVALID;
-
- if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_SETUP_FAILED))
- return BUS_SPAWN_EXIT_CODE_SETUP_FAILED;
-
- if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_SERVICE_INVALID))
- return BUS_SPAWN_EXIT_CODE_NAME_INVALID;
-
- if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_SERVICE_NOT_FOUND))
- return BUS_SPAWN_EXIT_CODE_SERVICE_NOT_FOUND;
-
- if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_PERMISSIONS_INVALID))
- return BUS_SPAWN_EXIT_CODE_PERMISSIONS_INVALID;
-
- if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_FILE_INVALID))
- return BUS_SPAWN_EXIT_CODE_FILE_INVALID;
-
- if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_EXEC_FAILED))
- return BUS_SPAWN_EXIT_CODE_EXEC_FAILED;
-
- if (dbus_error_has_name (error, DBUS_ERROR_INVALID_ARGS))
- return BUS_SPAWN_EXIT_CODE_INVALID_ARGS;
-
- if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_CHILD_SIGNALED))
- return BUS_SPAWN_EXIT_CODE_CHILD_SIGNALED;
-
- /* should we assert? */
- fprintf(stderr, "%s: %s\n", error->name, error->message);
-
- return BUS_SPAWN_EXIT_CODE_GENERIC_FAILURE;
-}
-
-int
-main (int argc, char **argv)
-{
- DBusError error;
- int retval;
-
- /* default is all okay */
- retval = 0;
-
- /* have we used a help option or not specified the correct arguments? */
- if (argc != 2 ||
- strcmp (argv[1], "--help") == 0 ||
- strcmp (argv[1], "-h") == 0 ||
- strcmp (argv[1], "-?") == 0)
- {
- fprintf (stderr, "dbus-daemon-activation-helper service.to.activate\n");
- exit (0);
- }
-
- dbus_error_init (&error);
- if (!run_launch_helper (argv[1], &error))
- {
- /* convert error to an exit code */
- retval = convert_error_to_exit_code (&error);
- dbus_error_free (&error);
- }
-
- return retval;
-}
-
diff --git a/src/3rd_party/dbus-1.7.8/bus/activation-helper.c b/src/3rd_party/dbus-1.7.8/bus/activation-helper.c
deleted file mode 100644
index 394f3938c1..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/activation-helper.c
+++ /dev/null
@@ -1,549 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* activation-helper.c Setuid helper for launching programs as a custom
- * user. This file is security sensitive.
- *
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-
-#include "bus.h"
-#include "driver.h"
-#include "utils.h"
-#include "desktop-file.h"
-#include "config-parser-trivial.h"
-#include "activation-helper.h"
-#include "activation-exit-codes.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <pwd.h>
-#include <grp.h>
-
-#include <dbus/dbus-misc.h>
-#include <dbus/dbus-shell.h>
-#include <dbus/dbus-marshal-validate.h>
-
-static BusDesktopFile *
-desktop_file_for_name (BusConfigParser *parser,
- const char *name,
- DBusError *error)
-{
- BusDesktopFile *desktop_file;
- DBusList **service_dirs;
- DBusList *link;
- DBusError tmp_error;
- DBusString full_path;
- DBusString filename;
- const char *dir;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- desktop_file = NULL;
-
- if (!_dbus_string_init (&filename))
- {
- BUS_SET_OOM (error);
- goto out_all;
- }
-
- if (!_dbus_string_init (&full_path))
- {
- BUS_SET_OOM (error);
- goto out_filename;
- }
-
- if (!_dbus_string_append (&filename, name) ||
- !_dbus_string_append (&filename, ".service"))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- service_dirs = bus_config_parser_get_service_dirs (parser);
- for (link = _dbus_list_get_first_link (service_dirs);
- link != NULL;
- link = _dbus_list_get_next_link (service_dirs, link))
- {
- dir = link->data;
- _dbus_verbose ("Looking at '%s'\n", dir);
-
- dbus_error_init (&tmp_error);
-
- /* clear the path from last time */
- _dbus_string_set_length (&full_path, 0);
-
- /* build the full path */
- if (!_dbus_string_append (&full_path, dir) ||
- !_dbus_concat_dir_and_file (&full_path, &filename))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- _dbus_verbose ("Trying to load file '%s'\n", _dbus_string_get_data (&full_path));
- desktop_file = bus_desktop_file_load (&full_path, &tmp_error);
- if (desktop_file == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
- _dbus_verbose ("Could not load %s: %s: %s\n",
- _dbus_string_get_const_data (&full_path),
- tmp_error.name, tmp_error.message);
-
- /* we may have failed if the file is not found; this is not fatal */
- if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_move_error (&tmp_error, error);
- /* we only bail out on OOM */
- goto out;
- }
- dbus_error_free (&tmp_error);
- }
-
- /* did we find the desktop file we want? */
- if (desktop_file != NULL)
- break;
- }
-
- /* Didn't find desktop file; set error */
- if (desktop_file == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_SERVICE_NOT_FOUND,
- "The name %s was not provided by any .service files",
- name);
- }
-
-out:
- _dbus_string_free (&full_path);
-out_filename:
- _dbus_string_free (&filename);
-out_all:
- return desktop_file;
-}
-
-/* Clears the environment, except for DBUS_STARTER_x,
- * which we hardcode to the system bus.
- */
-static dbus_bool_t
-clear_environment (DBusError *error)
-{
-#ifndef ACTIVATION_LAUNCHER_TEST
- /* totally clear the environment */
- if (!_dbus_clearenv ())
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_SETUP_FAILED,
- "could not clear environment\n");
- return FALSE;
- }
-
- /* Ensure the bus is set to system */
- dbus_setenv ("DBUS_STARTER_ADDRESS", DBUS_SYSTEM_BUS_DEFAULT_ADDRESS);
- dbus_setenv ("DBUS_STARTER_BUS_TYPE", "system");
-#endif
-
- return TRUE;
-}
-
-static dbus_bool_t
-check_permissions (const char *dbus_user, DBusError *error)
-{
-#ifndef ACTIVATION_LAUNCHER_TEST
- uid_t uid, euid;
- struct passwd *pw;
-
- pw = NULL;
- uid = 0;
- euid = 0;
-
- /* bail out unless the dbus user is invoking the helper */
- pw = getpwnam(dbus_user);
- if (!pw)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_PERMISSIONS_INVALID,
- "cannot find user '%s'", dbus_user);
- return FALSE;
- }
- uid = getuid();
- if (pw->pw_uid != uid)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_PERMISSIONS_INVALID,
- "not invoked from user '%s'", dbus_user);
- return FALSE;
- }
-
- /* bail out unless we are setuid to user root */
- euid = geteuid();
- if (euid != 0)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_PERMISSIONS_INVALID,
- "not setuid root");
- return FALSE;
- }
-#endif
-
- return TRUE;
-}
-
-static dbus_bool_t
-check_service_name (BusDesktopFile *desktop_file,
- const char *service_name,
- DBusError *error)
-{
- char *name_tmp;
- dbus_bool_t retval;
-
- retval = FALSE;
-
- /* try to get Name */
- if (!bus_desktop_file_get_string (desktop_file,
- DBUS_SERVICE_SECTION,
- DBUS_SERVICE_NAME,
- &name_tmp,
- error))
- goto failed;
-
- /* verify that the name is the same as the file service name */
- if (strcmp (service_name, name_tmp) != 0)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_FILE_INVALID,
- "Service '%s' does not match expected value", name_tmp);
- goto failed_free;
- }
-
- retval = TRUE;
-
-failed_free:
- /* we don't return the name, so free it here */
- dbus_free (name_tmp);
-failed:
- return retval;
-}
-
-static dbus_bool_t
-get_parameters_for_service (BusDesktopFile *desktop_file,
- const char *service_name,
- char **exec,
- char **user,
- DBusError *error)
-{
- char *exec_tmp;
- char *user_tmp;
-
- exec_tmp = NULL;
- user_tmp = NULL;
-
- /* check the name of the service */
- if (!check_service_name (desktop_file, service_name, error))
- goto failed;
-
- /* get the complete path of the executable */
- if (!bus_desktop_file_get_string (desktop_file,
- DBUS_SERVICE_SECTION,
- DBUS_SERVICE_EXEC,
- &exec_tmp,
- error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
- /* get the user that should run this service - user is compulsary for system activation */
- if (!bus_desktop_file_get_string (desktop_file,
- DBUS_SERVICE_SECTION,
- DBUS_SERVICE_USER,
- &user_tmp,
- error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
- /* only assign if all the checks passed */
- *exec = exec_tmp;
- *user = user_tmp;
- return TRUE;
-
-failed:
- dbus_free (exec_tmp);
- dbus_free (user_tmp);
- return FALSE;
-}
-
-static dbus_bool_t
-switch_user (char *user, DBusError *error)
-{
-#ifndef ACTIVATION_LAUNCHER_TEST
- struct passwd *pw;
-
- /* find user */
- pw = getpwnam (user);
- if (!pw)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_SETUP_FAILED,
- "cannot find user '%s'\n", user);
- return FALSE;
- }
-
- /* initialize the group access list */
- if (initgroups (user, pw->pw_gid))
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_SETUP_FAILED,
- "could not initialize groups");
- return FALSE;
- }
-
- /* change to the primary group for the user */
- if (setgid (pw->pw_gid))
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_SETUP_FAILED,
- "cannot setgid group %i", pw->pw_gid);
- return FALSE;
- }
-
- /* change to the user specified */
- if (setuid (pw->pw_uid) < 0)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_SETUP_FAILED,
- "cannot setuid user %i", pw->pw_uid);
- return FALSE;
- }
-#endif
- return TRUE;
-}
-
-static dbus_bool_t
-exec_for_correct_user (char *exec, char *user, DBusError *error)
-{
- char **argv;
- int argc;
- dbus_bool_t retval;
-
- argc = 0;
- retval = TRUE;
- argv = NULL;
-
- if (!switch_user (user, error))
- return FALSE;
-
- /* convert command into arguments */
- if (!_dbus_shell_parse_argv (exec, &argc, &argv, error))
- return FALSE;
-
-#ifndef ACTIVATION_LAUNCHER_DO_OOM
- /* replace with new binary, with no environment */
- if (execv (argv[0], argv) < 0)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_EXEC_FAILED,
- "Failed to exec: %s", argv[0]);
- retval = FALSE;
- }
-#endif
-
- dbus_free_string_array (argv);
- return retval;
-}
-
-static dbus_bool_t
-check_bus_name (const char *bus_name,
- DBusError *error)
-{
- DBusString str;
-
- _dbus_string_init_const (&str, bus_name);
- if (!_dbus_validate_bus_name (&str, 0, _dbus_string_get_length (&str)))
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_SERVICE_INVALID,
- "bus name '%s' is not a valid bus name\n",
- bus_name);
- return FALSE;
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-get_correct_parser (BusConfigParser **parser, DBusError *error)
-{
- DBusString config_file;
- dbus_bool_t retval;
-#ifdef ACTIVATION_LAUNCHER_TEST
- const char *test_config_file;
-#endif
-
- retval = FALSE;
-
-#ifdef ACTIVATION_LAUNCHER_TEST
- test_config_file = NULL;
-
- /* there is no _way_ we should be setuid if this define is set.
- * but we should be doubly paranoid and check... */
- if (getuid() != geteuid())
- _dbus_assert_not_reached ("dbus-daemon-launch-helper-test binary is setuid!");
-
- /* this is not a security hole. The environment variable is only passed in the
- * dbus-daemon-lauch-helper-test NON-SETUID launcher */
- test_config_file = _dbus_getenv ("TEST_LAUNCH_HELPER_CONFIG");
- if (test_config_file == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_SETUP_FAILED,
- "the TEST_LAUNCH_HELPER_CONFIG env variable is not set");
- goto out;
- }
-#endif
-
- /* we _only_ use the predefined system config file */
- if (!_dbus_string_init (&config_file))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-#ifndef ACTIVATION_LAUNCHER_TEST
- if (!_dbus_string_append (&config_file, DBUS_SYSTEM_CONFIG_FILE))
- {
- BUS_SET_OOM (error);
- goto out_free_config;
- }
-#else
- if (!_dbus_string_append (&config_file, test_config_file))
- {
- BUS_SET_OOM (error);
- goto out_free_config;
- }
-#endif
-
- /* where are we pointing.... */
- _dbus_verbose ("dbus-daemon-activation-helper: using config file: %s\n",
- _dbus_string_get_const_data (&config_file));
-
- /* get the dbus user */
- *parser = bus_config_load (&config_file, TRUE, NULL, error);
- if (*parser == NULL)
- {
- goto out_free_config;
- }
-
- /* woot */
- retval = TRUE;
-
-out_free_config:
- _dbus_string_free (&config_file);
-out:
- return retval;
-}
-
-static dbus_bool_t
-launch_bus_name (const char *bus_name, BusConfigParser *parser, DBusError *error)
-{
- BusDesktopFile *desktop_file;
- char *exec, *user;
- dbus_bool_t retval;
-
- exec = NULL;
- user = NULL;
- retval = FALSE;
-
- /* get the correct service file for the name we are trying to activate */
- desktop_file = desktop_file_for_name (parser, bus_name, error);
- if (desktop_file == NULL)
- return FALSE;
-
- /* get exec and user for service name */
- if (!get_parameters_for_service (desktop_file, bus_name, &exec, &user, error))
- goto finish;
-
- _dbus_verbose ("dbus-daemon-activation-helper: Name='%s'\n", bus_name);
- _dbus_verbose ("dbus-daemon-activation-helper: Exec='%s'\n", exec);
- _dbus_verbose ("dbus-daemon-activation-helper: User='%s'\n", user);
-
- /* actually execute */
- if (!exec_for_correct_user (exec, user, error))
- goto finish;
-
- retval = TRUE;
-
-finish:
- dbus_free (exec);
- dbus_free (user);
- bus_desktop_file_free (desktop_file);
- return retval;
-}
-
-static dbus_bool_t
-check_dbus_user (BusConfigParser *parser, DBusError *error)
-{
- const char *dbus_user;
-
- dbus_user = bus_config_parser_get_user (parser);
- if (dbus_user == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_SPAWN_CONFIG_INVALID,
- "could not get user from config file\n");
- return FALSE;
- }
-
- /* check to see if permissions are correct */
- if (!check_permissions (dbus_user, error))
- return FALSE;
-
- return TRUE;
-}
-
-dbus_bool_t
-run_launch_helper (const char *bus_name,
- DBusError *error)
-{
- BusConfigParser *parser;
- dbus_bool_t retval;
-
- parser = NULL;
- retval = FALSE;
-
- /* clear the environment, apart from a few select settings */
- if (!clear_environment (error))
- goto error;
-
- /* check to see if we have a valid bus name */
- if (!check_bus_name (bus_name, error))
- goto error;
-
- /* get the correct parser, either the test or default parser */
- if (!get_correct_parser (&parser, error))
- goto error;
-
- /* check we are being invoked by the correct dbus user */
- if (!check_dbus_user (parser, error))
- goto error_free_parser;
-
- /* launch the bus with the service defined user */
- if (!launch_bus_name (bus_name, parser, error))
- goto error_free_parser;
-
- /* woohoo! */
- retval = TRUE;
-
-error_free_parser:
- bus_config_parser_unref (parser);
-error:
- return retval;
-}
-
diff --git a/src/3rd_party/dbus-1.7.8/bus/activation-helper.h b/src/3rd_party/dbus-1.7.8/bus/activation-helper.h
deleted file mode 100644
index 361a4c6a1a..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/activation-helper.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* activation-helper.h The actual activation helper split from the main
- * function for testing.
- *
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_ACTIVATION_HELPER_H
-#define BUS_ACTIVATION_HELPER_H
-
-dbus_bool_t run_launch_helper (const char *bus_name, DBusError *error);
-
-
-#endif /* BUS_ACTIVATION_HELPER_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/activation.c b/src/3rd_party/dbus-1.7.8/bus/activation.c
deleted file mode 100644
index 868ce05c13..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/activation.c
+++ /dev/null
@@ -1,2595 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* activation.c Activation of services
- *
- * Copyright (C) 2003 CodeFactory AB
- * Copyright (C) 2003 Red Hat, Inc.
- * Copyright (C) 2004 Imendio HB
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "activation.h"
-#include "activation-exit-codes.h"
-#include "desktop-file.h"
-#include "dispatch.h"
-#include "services.h"
-#include "test.h"
-#include "utils.h"
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-hash.h>
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-shell.h>
-#include <dbus/dbus-spawn.h>
-#include <dbus/dbus-timeout.h>
-#include <dbus/dbus-sysdeps.h>
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-
-struct BusActivation
-{
- int refcount;
- DBusHashTable *entries;
- DBusHashTable *pending_activations;
- char *server_address;
- BusContext *context;
- int n_pending_activations; /**< This is in fact the number of BusPendingActivationEntry,
- * i.e. number of pending activation requests, not pending
- * activations per se
- */
- DBusHashTable *directories;
- DBusHashTable *environment;
-};
-
-typedef struct
-{
- int refcount;
- char *dir_c;
- DBusHashTable *entries;
-} BusServiceDirectory;
-
-typedef struct
-{
- int refcount;
- char *name;
- char *exec;
- char *user;
- char *systemd_service;
- unsigned long mtime;
- BusServiceDirectory *s_dir;
- char *filename;
-} BusActivationEntry;
-
-typedef struct BusPendingActivationEntry BusPendingActivationEntry;
-
-struct BusPendingActivationEntry
-{
- /* Normally a method call, but if connection is NULL, this is a signal
- * instead.
- */
- DBusMessage *activation_message;
- /* NULL if this activation entry is for the dbus-daemon itself,
- * waiting for systemd to start. In this case, auto_activation is always
- * TRUE.
- */
- DBusConnection *connection;
-
- dbus_bool_t auto_activation;
-};
-
-typedef struct
-{
- int refcount;
- BusActivation *activation;
- char *service_name;
- char *exec;
- char *systemd_service;
- DBusList *entries;
- int n_entries;
- DBusBabysitter *babysitter;
- DBusTimeout *timeout;
- unsigned int timeout_added : 1;
-} BusPendingActivation;
-
-#if 0
-static BusServiceDirectory *
-bus_service_directory_ref (BusServiceDirectory *dir)
-{
- _dbus_assert (dir->refcount);
-
- dir->refcount++;
-
- return dir;
-}
-#endif
-
-static void
-bus_service_directory_unref (BusServiceDirectory *dir)
-{
- if (dir == NULL)
- return;
-
- _dbus_assert (dir->refcount > 0);
- dir->refcount--;
-
- if (dir->refcount > 0)
- return;
-
- if (dir->entries)
- _dbus_hash_table_unref (dir->entries);
-
- dbus_free (dir->dir_c);
- dbus_free (dir);
-}
-
-static void
-bus_pending_activation_entry_free (BusPendingActivationEntry *entry)
-{
- if (entry->activation_message)
- dbus_message_unref (entry->activation_message);
-
- if (entry->connection)
- dbus_connection_unref (entry->connection);
-
- dbus_free (entry);
-}
-
-static BusPendingActivation *
-bus_pending_activation_ref (BusPendingActivation *pending_activation)
-{
- _dbus_assert (pending_activation->refcount > 0);
- pending_activation->refcount += 1;
-
- return pending_activation;
-}
-
-static void
-bus_pending_activation_unref (BusPendingActivation *pending_activation)
-{
- DBusList *link;
-
- if (pending_activation == NULL) /* hash table requires this */
- return;
-
- _dbus_assert (pending_activation->refcount > 0);
- pending_activation->refcount -= 1;
-
- if (pending_activation->refcount > 0)
- return;
-
- if (pending_activation->timeout_added)
- {
- _dbus_loop_remove_timeout (bus_context_get_loop (pending_activation->activation->context),
- pending_activation->timeout);
- pending_activation->timeout_added = FALSE;
- }
-
- if (pending_activation->timeout)
- _dbus_timeout_unref (pending_activation->timeout);
-
- if (pending_activation->babysitter)
- {
- if (!_dbus_babysitter_set_watch_functions (pending_activation->babysitter,
- NULL, NULL, NULL,
- pending_activation->babysitter,
- NULL))
- _dbus_assert_not_reached ("setting watch functions to NULL failed");
-
- _dbus_babysitter_unref (pending_activation->babysitter);
- }
-
- dbus_free (pending_activation->service_name);
- dbus_free (pending_activation->exec);
- dbus_free (pending_activation->systemd_service);
-
- link = _dbus_list_get_first_link (&pending_activation->entries);
-
- while (link != NULL)
- {
- BusPendingActivationEntry *entry = link->data;
-
- bus_pending_activation_entry_free (entry);
-
- link = _dbus_list_get_next_link (&pending_activation->entries, link);
- }
- _dbus_list_clear (&pending_activation->entries);
-
- pending_activation->activation->n_pending_activations -=
- pending_activation->n_entries;
-
- _dbus_assert (pending_activation->activation->n_pending_activations >= 0);
-
- dbus_free (pending_activation);
-}
-
-static BusActivationEntry *
-bus_activation_entry_ref (BusActivationEntry *entry)
-{
- _dbus_assert (entry->refcount > 0);
- entry->refcount++;
-
- return entry;
-}
-
-static void
-bus_activation_entry_unref (BusActivationEntry *entry)
-{
- if (entry == NULL) /* hash table requires this */
- return;
-
- _dbus_assert (entry->refcount > 0);
- entry->refcount--;
-
- if (entry->refcount > 0)
- return;
-
- dbus_free (entry->name);
- dbus_free (entry->exec);
- dbus_free (entry->user);
- dbus_free (entry->filename);
- dbus_free (entry->systemd_service);
-
- dbus_free (entry);
-}
-
-static dbus_bool_t
-update_desktop_file_entry (BusActivation *activation,
- BusServiceDirectory *s_dir,
- DBusString *filename,
- BusDesktopFile *desktop_file,
- DBusError *error)
-{
- char *name, *exec, *user, *exec_tmp, *systemd_service;
- BusActivationEntry *entry;
- DBusStat stat_buf;
- DBusString file_path;
- DBusError tmp_error;
- dbus_bool_t retval;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- retval = FALSE;
- name = NULL;
- exec = NULL;
- user = NULL;
- exec_tmp = NULL;
- entry = NULL;
- systemd_service = NULL;
-
- dbus_error_init (&tmp_error);
-
- if (!_dbus_string_init (&file_path))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_string_append (&file_path, s_dir->dir_c) ||
- !_dbus_concat_dir_and_file (&file_path, filename))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!_dbus_stat (&file_path, &stat_buf, NULL))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Can't stat the service file\n");
- goto out;
- }
-
- if (!bus_desktop_file_get_string (desktop_file,
- DBUS_SERVICE_SECTION,
- DBUS_SERVICE_NAME,
- &name,
- error))
- goto out;
-
- if (!bus_desktop_file_get_string (desktop_file,
- DBUS_SERVICE_SECTION,
- DBUS_SERVICE_EXEC,
- &exec_tmp,
- error))
- goto out;
-
- exec = _dbus_strdup (_dbus_replace_install_prefix (exec_tmp));
- dbus_free (exec_tmp);
- exec_tmp = NULL;
-
- /* user is not _required_ unless we are using system activation */
- if (!bus_desktop_file_get_string (desktop_file,
- DBUS_SERVICE_SECTION,
- DBUS_SERVICE_USER,
- &user, &tmp_error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
- /* if we got OOM, then exit */
- if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_move_error (&tmp_error, error);
- goto out;
- }
- else
- {
- /* if we have error because we didn't find anything then continue */
- dbus_error_free (&tmp_error);
- dbus_free (user);
- user = NULL;
- }
- }
- _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
-
- /* systemd service is never required */
- if (!bus_desktop_file_get_string (desktop_file,
- DBUS_SERVICE_SECTION,
- DBUS_SERVICE_SYSTEMD_SERVICE,
- &systemd_service, &tmp_error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
- /* if we got OOM, then exit */
- if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_move_error (&tmp_error, error);
- goto out;
- }
- else
- {
- /* if we have error because we didn't find anything then continue */
- dbus_error_free (&tmp_error);
- dbus_free (systemd_service);
- systemd_service = NULL;
- }
- }
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
-
- entry = _dbus_hash_table_lookup_string (s_dir->entries,
- _dbus_string_get_const_data (filename));
-
- if (entry == NULL) /* New file */
- {
- /* FIXME we need a better-defined algorithm for which service file to
- * pick than "whichever one is first in the directory listing"
- */
- if (_dbus_hash_table_lookup_string (activation->entries, name))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Service %s already exists in activation entry list\n", name);
- goto out;
- }
-
- entry = dbus_new0 (BusActivationEntry, 1);
- if (entry == NULL)
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- entry->name = name;
- entry->exec = exec;
- entry->user = user;
- entry->systemd_service = systemd_service;
- entry->refcount = 1;
-
- /* ownership has been transferred to entry, do not free separately */
- name = NULL;
- exec = NULL;
- user = NULL;
- systemd_service = NULL;
-
- entry->s_dir = s_dir;
- entry->filename = _dbus_strdup (_dbus_string_get_const_data (filename));
- if (!entry->filename)
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!_dbus_hash_table_insert_string (activation->entries, entry->name, bus_activation_entry_ref (entry)))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!_dbus_hash_table_insert_string (s_dir->entries, entry->filename, bus_activation_entry_ref (entry)))
- {
- /* Revert the insertion in the entries table */
- _dbus_hash_table_remove_string (activation->entries, entry->name);
- BUS_SET_OOM (error);
- goto out;
- }
-
- _dbus_verbose ("Added \"%s\" to list of services\n", entry->name);
- }
- else /* Just update the entry */
- {
- bus_activation_entry_ref (entry);
- _dbus_hash_table_remove_string (activation->entries, entry->name);
-
- if (_dbus_hash_table_lookup_string (activation->entries, name))
- {
- _dbus_verbose ("The new service name \"%s\" of service file \"%s\" is already in cache, ignoring\n",
- name, _dbus_string_get_const_data (&file_path));
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "The new service name \"%s\" of service file \"%s\" is already in cache, ignoring\n",
- name, _dbus_string_get_const_data (&file_path));
- goto out;
- }
-
- /* ownership has been transferred to entry, do not free separately */
- dbus_free (entry->name);
- entry->name = name;
- name = NULL;
-
- dbus_free (entry->exec);
- entry->exec = exec;
- exec = NULL;
-
- dbus_free (entry->user);
- entry->user = user;
- user = NULL;
-
- dbus_free (entry->systemd_service);
- entry->systemd_service = systemd_service;
- systemd_service = NULL;
-
- if (!_dbus_hash_table_insert_string (activation->entries,
- entry->name, bus_activation_entry_ref(entry)))
- {
- BUS_SET_OOM (error);
- /* Also remove path to entries hash since we want this in sync with
- * the entries hash table */
- _dbus_hash_table_remove_string (entry->s_dir->entries,
- entry->filename);
- goto out;
- }
- }
-
- entry->mtime = stat_buf.mtime;
- retval = TRUE;
-
-out:
- /* if these have been transferred into entry, the variables will be NULL */
- dbus_free (name);
- dbus_free (exec);
- dbus_free (user);
- dbus_free (systemd_service);
- _dbus_string_free (&file_path);
-
- if (entry)
- bus_activation_entry_unref (entry);
-
- return retval;
-}
-
-static dbus_bool_t
-check_service_file (BusActivation *activation,
- BusActivationEntry *entry,
- BusActivationEntry **updated_entry,
- DBusError *error)
-{
- DBusStat stat_buf;
- dbus_bool_t retval;
- BusActivationEntry *tmp_entry;
- DBusString file_path;
- DBusString filename;
-
- retval = TRUE;
- tmp_entry = entry;
-
- _dbus_string_init_const (&filename, entry->filename);
-
- if (!_dbus_string_init (&file_path))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_string_append (&file_path, entry->s_dir->dir_c) ||
- !_dbus_concat_dir_and_file (&file_path, &filename))
- {
- BUS_SET_OOM (error);
- retval = FALSE;
- goto out;
- }
-
- if (!_dbus_stat (&file_path, &stat_buf, NULL))
- {
- _dbus_verbose ("****** Can't stat file \"%s\", removing from cache\n",
- _dbus_string_get_const_data (&file_path));
-
- _dbus_hash_table_remove_string (activation->entries, entry->name);
- _dbus_hash_table_remove_string (entry->s_dir->entries, entry->filename);
-
- tmp_entry = NULL;
- retval = TRUE;
- goto out;
- }
- else
- {
- if (stat_buf.mtime > entry->mtime)
- {
- BusDesktopFile *desktop_file;
- DBusError tmp_error;
-
- dbus_error_init (&tmp_error);
-
- desktop_file = bus_desktop_file_load (&file_path, &tmp_error);
- if (desktop_file == NULL)
- {
- _dbus_verbose ("Could not load %s: %s\n",
- _dbus_string_get_const_data (&file_path),
- tmp_error.message);
- if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_move_error (&tmp_error, error);
- retval = FALSE;
- goto out;
- }
- dbus_error_free (&tmp_error);
- retval = TRUE;
- goto out;
- }
-
- /* @todo We can return OOM or a DBUS_ERROR_FAILED error
- * Handle these both better
- */
- if (!update_desktop_file_entry (activation, entry->s_dir, &filename, desktop_file, &tmp_error))
- {
- bus_desktop_file_free (desktop_file);
- if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_move_error (&tmp_error, error);
- retval = FALSE;
- goto out;
- }
- dbus_error_free (&tmp_error);
- retval = TRUE;
- goto out;
- }
-
- bus_desktop_file_free (desktop_file);
- retval = TRUE;
- }
- }
-
-out:
- _dbus_string_free (&file_path);
-
- if (updated_entry != NULL)
- *updated_entry = tmp_entry;
- return retval;
-}
-
-
-/* warning: this doesn't fully "undo" itself on failure, i.e. doesn't strip
- * hash entries it already added.
- */
-static dbus_bool_t
-update_directory (BusActivation *activation,
- BusServiceDirectory *s_dir,
- DBusError *error)
-{
- DBusDirIter *iter;
- DBusString dir, filename;
- BusDesktopFile *desktop_file;
- DBusError tmp_error;
- dbus_bool_t retval;
- BusActivationEntry *entry;
- DBusString full_path;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- iter = NULL;
- desktop_file = NULL;
-
- _dbus_string_init_const (&dir, s_dir->dir_c);
-
- if (!_dbus_string_init (&filename))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_string_init (&full_path))
- {
- BUS_SET_OOM (error);
- _dbus_string_free (&filename);
- return FALSE;
- }
-
- retval = FALSE;
-
- /* from this point it's safe to "goto out" */
-
- iter = _dbus_directory_open (&dir, error);
- if (iter == NULL)
- {
- _dbus_verbose ("Failed to open directory %s: %s\n",
- s_dir->dir_c,
- error ? error->message : "unknown");
- goto out;
- }
-
- /* Now read the files */
- dbus_error_init (&tmp_error);
- while (_dbus_directory_get_next_file (iter, &filename, &tmp_error))
- {
- _dbus_assert (!dbus_error_is_set (&tmp_error));
-
- _dbus_string_set_length (&full_path, 0);
-
- if (!_dbus_string_ends_with_c_str (&filename, ".service"))
- {
- _dbus_verbose ("Skipping non-.service file %s\n",
- _dbus_string_get_const_data (&filename));
- continue;
- }
-
- entry = _dbus_hash_table_lookup_string (s_dir->entries, _dbus_string_get_const_data (&filename));
- if (entry) /* Already has this service file in the cache */
- {
- if (!check_service_file (activation, entry, NULL, error))
- goto out;
-
- continue;
- }
-
- if (!_dbus_string_append (&full_path, s_dir->dir_c) ||
- !_dbus_concat_dir_and_file (&full_path, &filename))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- /* New file */
- desktop_file = bus_desktop_file_load (&full_path, &tmp_error);
- if (desktop_file == NULL)
- {
- _dbus_verbose ("Could not load %s: %s\n",
- _dbus_string_get_const_data (&full_path),
- tmp_error.message);
-
- if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_move_error (&tmp_error, error);
- goto out;
- }
-
- dbus_error_free (&tmp_error);
- continue;
- }
-
- /* @todo We can return OOM or a DBUS_ERROR_FAILED error
- * Handle these both better
- */
- if (!update_desktop_file_entry (activation, s_dir, &filename, desktop_file, &tmp_error))
- {
- bus_desktop_file_free (desktop_file);
- desktop_file = NULL;
-
- _dbus_verbose ("Could not add %s to activation entry list: %s\n",
- _dbus_string_get_const_data (&full_path), tmp_error.message);
-
- if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_move_error (&tmp_error, error);
- goto out;
- }
-
- dbus_error_free (&tmp_error);
- continue;
- }
- else
- {
- bus_desktop_file_free (desktop_file);
- desktop_file = NULL;
- continue;
- }
- }
-
- if (dbus_error_is_set (&tmp_error))
- {
- dbus_move_error (&tmp_error, error);
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (!retval)
- _DBUS_ASSERT_ERROR_IS_SET (error);
- else
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (iter != NULL)
- _dbus_directory_close (iter);
- _dbus_string_free (&filename);
- _dbus_string_free (&full_path);
-
- return retval;
-}
-
-static dbus_bool_t
-populate_environment (BusActivation *activation)
-{
- DBusString key;
- DBusString value;
- int i;
- char **environment;
- dbus_bool_t retval = FALSE;
-
- environment = _dbus_get_environment ();
-
- if (environment == NULL)
- return FALSE;
-
- if (!_dbus_string_init (&key))
- {
- dbus_free_string_array (environment);
- return FALSE;
- }
-
- if (!_dbus_string_init (&value))
- {
- _dbus_string_free (&key);
- dbus_free_string_array (environment);
- return FALSE;
- }
-
- for (i = 0; environment[i] != NULL; i++)
- {
- if (!_dbus_string_append (&key, environment[i]))
- break;
-
- if (_dbus_string_split_on_byte (&key, '=', &value))
- {
- char *hash_key, *hash_value;
-
- if (!_dbus_string_steal_data (&key, &hash_key))
- break;
-
- if (!_dbus_string_steal_data (&value, &hash_value))
- break;
-
- if (!_dbus_hash_table_insert_string (activation->environment,
- hash_key, hash_value))
- break;
- }
- _dbus_string_set_length (&key, 0);
- _dbus_string_set_length (&value, 0);
- }
-
- if (environment[i] != NULL)
- goto out;
-
- retval = TRUE;
-out:
-
- _dbus_string_free (&key);
- _dbus_string_free (&value);
- dbus_free_string_array (environment);
-
- return retval;
-}
-
-dbus_bool_t
-bus_activation_reload (BusActivation *activation,
- const DBusString *address,
- DBusList **directories,
- DBusError *error)
-{
- DBusList *link;
- char *dir;
-
- if (activation->server_address != NULL)
- dbus_free (activation->server_address);
- if (!_dbus_string_copy_data (address, &activation->server_address))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (activation->entries != NULL)
- _dbus_hash_table_unref (activation->entries);
- activation->entries = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
- (DBusFreeFunction)bus_activation_entry_unref);
- if (activation->entries == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (activation->directories != NULL)
- _dbus_hash_table_unref (activation->directories);
- activation->directories = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
- (DBusFreeFunction)bus_service_directory_unref);
-
- if (activation->directories == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- link = _dbus_list_get_first_link (directories);
- while (link != NULL)
- {
- BusServiceDirectory *s_dir;
-
- dir = _dbus_strdup ((const char *) link->data);
- if (!dir)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- s_dir = dbus_new0 (BusServiceDirectory, 1);
- if (!s_dir)
- {
- dbus_free (dir);
- BUS_SET_OOM (error);
- goto failed;
- }
-
- s_dir->refcount = 1;
- s_dir->dir_c = dir;
-
- s_dir->entries = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
- (DBusFreeFunction)bus_activation_entry_unref);
-
- if (!s_dir->entries)
- {
- bus_service_directory_unref (s_dir);
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (!_dbus_hash_table_insert_string (activation->directories, s_dir->dir_c, s_dir))
- {
- bus_service_directory_unref (s_dir);
- BUS_SET_OOM (error);
- goto failed;
- }
-
- /* only fail on OOM, it is ok if we can't read the directory */
- if (!update_directory (activation, s_dir, error))
- {
- if (dbus_error_has_name (error, DBUS_ERROR_NO_MEMORY))
- goto failed;
- else
- dbus_error_free (error);
- }
-
- link = _dbus_list_get_next_link (directories, link);
- }
-
- return TRUE;
- failed:
- return FALSE;
-}
-
-BusActivation*
-bus_activation_new (BusContext *context,
- const DBusString *address,
- DBusList **directories,
- DBusError *error)
-{
- BusActivation *activation;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- activation = dbus_new0 (BusActivation, 1);
- if (activation == NULL)
- {
- BUS_SET_OOM (error);
- return NULL;
- }
-
- activation->refcount = 1;
- activation->context = context;
- activation->n_pending_activations = 0;
-
- if (!bus_activation_reload (activation, address, directories, error))
- goto failed;
-
- /* Initialize this hash table once, we don't want to lose pending
- * activations on reload. */
- activation->pending_activations = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
- (DBusFreeFunction)bus_pending_activation_unref);
-
- if (activation->pending_activations == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- activation->environment = _dbus_hash_table_new (DBUS_HASH_STRING,
- (DBusFreeFunction) dbus_free,
- (DBusFreeFunction) dbus_free);
-
- if (activation->environment == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (!populate_environment (activation))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- return activation;
-
- failed:
- bus_activation_unref (activation);
- return NULL;
-}
-
-BusActivation *
-bus_activation_ref (BusActivation *activation)
-{
- _dbus_assert (activation->refcount > 0);
-
- activation->refcount += 1;
-
- return activation;
-}
-
-void
-bus_activation_unref (BusActivation *activation)
-{
- _dbus_assert (activation->refcount > 0);
-
- activation->refcount -= 1;
-
- if (activation->refcount > 0)
- return;
-
- dbus_free (activation->server_address);
- if (activation->entries)
- _dbus_hash_table_unref (activation->entries);
- if (activation->pending_activations)
- _dbus_hash_table_unref (activation->pending_activations);
- if (activation->directories)
- _dbus_hash_table_unref (activation->directories);
- if (activation->environment)
- _dbus_hash_table_unref (activation->environment);
-
- dbus_free (activation);
-}
-
-static dbus_bool_t
-add_bus_environment (BusActivation *activation,
- DBusError *error)
-{
- const char *type;
-
- if (!bus_activation_set_environment_variable (activation,
- "DBUS_STARTER_ADDRESS",
- activation->server_address,
- error))
- return FALSE;
-
- type = bus_context_get_type (activation->context);
- if (type != NULL)
- {
- if (!bus_activation_set_environment_variable (activation,
- "DBUS_STARTER_BUS_TYPE", type,
- error))
- return FALSE;
-
- if (strcmp (type, "session") == 0)
- {
- if (!bus_activation_set_environment_variable (activation,
- "DBUS_SESSION_BUS_ADDRESS",
- activation->server_address,
- error))
- return FALSE;
- }
- else if (strcmp (type, "system") == 0)
- {
- if (!bus_activation_set_environment_variable (activation,
- "DBUS_SYSTEM_BUS_ADDRESS",
- activation->server_address,
- error))
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-typedef struct
-{
- BusPendingActivation *pending_activation;
- DBusPreallocatedHash *hash_entry;
-} RestorePendingData;
-
-static void
-restore_pending (void *data)
-{
- RestorePendingData *d = data;
-
- _dbus_assert (d->pending_activation != NULL);
- _dbus_assert (d->hash_entry != NULL);
-
- _dbus_verbose ("Restoring pending activation for service %s, has timeout = %d\n",
- d->pending_activation->service_name,
- d->pending_activation->timeout_added);
-
- _dbus_hash_table_insert_string_preallocated (d->pending_activation->activation->pending_activations,
- d->hash_entry,
- d->pending_activation->service_name, d->pending_activation);
-
- bus_pending_activation_ref (d->pending_activation);
-
- d->hash_entry = NULL;
-}
-
-static void
-free_pending_restore_data (void *data)
-{
- RestorePendingData *d = data;
-
- if (d->hash_entry)
- _dbus_hash_table_free_preallocated_entry (d->pending_activation->activation->pending_activations,
- d->hash_entry);
-
- bus_pending_activation_unref (d->pending_activation);
-
- dbus_free (d);
-}
-
-static dbus_bool_t
-add_restore_pending_to_transaction (BusTransaction *transaction,
- BusPendingActivation *pending_activation)
-{
- RestorePendingData *d;
-
- d = dbus_new (RestorePendingData, 1);
- if (d == NULL)
- return FALSE;
-
- d->pending_activation = pending_activation;
- d->hash_entry = _dbus_hash_table_preallocate_entry (d->pending_activation->activation->pending_activations);
-
- bus_pending_activation_ref (d->pending_activation);
-
- if (d->hash_entry == NULL ||
- !bus_transaction_add_cancel_hook (transaction, restore_pending, d,
- free_pending_restore_data))
- {
- free_pending_restore_data (d);
- return FALSE;
- }
-
- _dbus_verbose ("Saved pending activation to be restored if the transaction fails\n");
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_activation_service_created (BusActivation *activation,
- const char *service_name,
- BusTransaction *transaction,
- DBusError *error)
-{
- BusPendingActivation *pending_activation;
- DBusMessage *message;
- DBusList *link;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* Check if it's a pending activation */
- pending_activation = _dbus_hash_table_lookup_string (activation->pending_activations, service_name);
-
- if (!pending_activation)
- return TRUE;
-
- bus_context_log (activation->context,
- DBUS_SYSTEM_LOG_INFO, "Successfully activated service '%s'",
- service_name);
-
- link = _dbus_list_get_first_link (&pending_activation->entries);
- while (link != NULL)
- {
- BusPendingActivationEntry *entry = link->data;
- DBusList *next = _dbus_list_get_next_link (&pending_activation->entries, link);
-
- /* entry->connection is NULL for activating systemd */
- if (entry->connection && dbus_connection_get_is_connected (entry->connection))
- {
- /* Only send activation replies to regular activation requests. */
- if (!entry->auto_activation)
- {
- dbus_uint32_t result;
-
- message = dbus_message_new_method_return (entry->activation_message);
- if (!message)
- {
- BUS_SET_OOM (error);
- goto error;
- }
-
- result = DBUS_START_REPLY_SUCCESS;
-
- if (!dbus_message_append_args (message,
- DBUS_TYPE_UINT32, &result,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- BUS_SET_OOM (error);
- goto error;
- }
-
- if (!bus_transaction_send_from_driver (transaction, entry->connection, message))
- {
- dbus_message_unref (message);
- BUS_SET_OOM (error);
- goto error;
- }
-
- dbus_message_unref (message);
- }
- }
-
- link = next;
- }
-
- return TRUE;
-
- error:
- return FALSE;
-}
-
-dbus_bool_t
-bus_activation_send_pending_auto_activation_messages (BusActivation *activation,
- BusService *service,
- BusTransaction *transaction,
- DBusError *error)
-{
- BusPendingActivation *pending_activation;
- DBusList *link;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* Check if it's a pending activation */
- pending_activation = _dbus_hash_table_lookup_string (activation->pending_activations,
- bus_service_get_name (service));
-
- if (!pending_activation)
- return TRUE;
-
- link = _dbus_list_get_first_link (&pending_activation->entries);
- while (link != NULL)
- {
- BusPendingActivationEntry *entry = link->data;
- DBusList *next = _dbus_list_get_next_link (&pending_activation->entries, link);
-
- if (entry->auto_activation && (entry->connection == NULL || dbus_connection_get_is_connected (entry->connection)))
- {
- DBusConnection *addressed_recipient;
-
- addressed_recipient = bus_service_get_primary_owners_connection (service);
-
- /* Resume dispatching where we left off in bus_dispatch() */
- if (!bus_dispatch_matches (transaction,
- entry->connection,
- addressed_recipient,
- entry->activation_message, error))
- goto error;
- }
-
- link = next;
- }
-
- if (!add_restore_pending_to_transaction (transaction, pending_activation))
- {
- _dbus_verbose ("Could not add cancel hook to transaction to revert removing pending activation\n");
- BUS_SET_OOM (error);
- goto error;
- }
-
- _dbus_hash_table_remove_string (activation->pending_activations, bus_service_get_name (service));
-
- return TRUE;
-
- error:
- return FALSE;
-}
-
-/**
- * FIXME @todo the error messages here would ideally be preallocated
- * so we don't need to allocate memory to send them.
- * Using the usual tactic, prealloc an OOM message, then
- * if we can't alloc the real error send the OOM error instead.
- */
-static dbus_bool_t
-try_send_activation_failure (BusPendingActivation *pending_activation,
- const DBusError *how)
-{
- BusActivation *activation;
- DBusList *link;
- BusTransaction *transaction;
-
- activation = pending_activation->activation;
-
- transaction = bus_transaction_new (activation->context);
- if (transaction == NULL)
- return FALSE;
-
- link = _dbus_list_get_first_link (&pending_activation->entries);
- while (link != NULL)
- {
- BusPendingActivationEntry *entry = link->data;
- DBusList *next = _dbus_list_get_next_link (&pending_activation->entries, link);
-
- if (entry->connection && dbus_connection_get_is_connected (entry->connection))
- {
- if (!bus_transaction_send_error_reply (transaction,
- entry->connection,
- how,
- entry->activation_message))
- goto error;
- }
-
- link = next;
- }
-
- bus_transaction_execute_and_free (transaction);
-
- return TRUE;
-
- error:
- if (transaction)
- bus_transaction_cancel_and_free (transaction);
- return FALSE;
-}
-
-/**
- * Free the pending activation and send an error message to all the
- * connections that were waiting for it.
- */
-static void
-pending_activation_failed (BusPendingActivation *pending_activation,
- const DBusError *how)
-{
- /* FIXME use preallocated OOM messages instead of bus_wait_for_memory() */
- while (!try_send_activation_failure (pending_activation, how))
- _dbus_wait_for_memory ();
-
- /* Destroy this pending activation */
- _dbus_hash_table_remove_string (pending_activation->activation->pending_activations,
- pending_activation->service_name);
-}
-
-/**
- * Depending on the exit code of the helper, set the error accordingly
- */
-static void
-handle_servicehelper_exit_error (int exit_code,
- DBusError *error)
-{
- switch (exit_code)
- {
- case BUS_SPAWN_EXIT_CODE_CONFIG_INVALID:
- dbus_set_error (error, DBUS_ERROR_SPAWN_CONFIG_INVALID,
- "Invalid configuration (missing or empty <user>?)");
- break;
- case BUS_SPAWN_EXIT_CODE_NO_MEMORY:
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY,
- "Launcher could not run (out of memory)");
- break;
- case BUS_SPAWN_EXIT_CODE_SETUP_FAILED:
- dbus_set_error (error, DBUS_ERROR_SPAWN_SETUP_FAILED,
- "Failed to setup environment correctly");
- break;
- case BUS_SPAWN_EXIT_CODE_NAME_INVALID:
- dbus_set_error (error, DBUS_ERROR_SPAWN_SERVICE_INVALID,
- "Bus name is not valid or missing");
- break;
- case BUS_SPAWN_EXIT_CODE_SERVICE_NOT_FOUND:
- dbus_set_error (error, DBUS_ERROR_SPAWN_SERVICE_NOT_FOUND,
- "Bus name not found in system service directory");
- break;
- case BUS_SPAWN_EXIT_CODE_PERMISSIONS_INVALID:
- dbus_set_error (error, DBUS_ERROR_SPAWN_PERMISSIONS_INVALID,
- "The permission of the setuid helper is not correct");
- break;
- case BUS_SPAWN_EXIT_CODE_FILE_INVALID:
- dbus_set_error (error, DBUS_ERROR_SPAWN_PERMISSIONS_INVALID,
- "The service file is incorrect or does not have all required attributes");
- break;
- case BUS_SPAWN_EXIT_CODE_EXEC_FAILED:
- dbus_set_error (error, DBUS_ERROR_SPAWN_EXEC_FAILED,
- "Cannot launch daemon, file not found or permissions invalid");
- break;
- case BUS_SPAWN_EXIT_CODE_INVALID_ARGS:
- dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
- "Invalid arguments to command line");
- break;
- case BUS_SPAWN_EXIT_CODE_CHILD_SIGNALED:
- dbus_set_error (error, DBUS_ERROR_SPAWN_CHILD_SIGNALED,
- "Launched child was signaled, it probably crashed");
- break;
- case BUS_SPAWN_EXIT_CODE_GENERIC_FAILURE:
- default:
- dbus_set_error (error, DBUS_ERROR_SPAWN_CHILD_EXITED,
- "Launch helper exited with unknown return code %i", exit_code);
- break;
- }
-}
-
-static void
-pending_activation_finished_cb (DBusBabysitter *babysitter,
- void *data)
-{
- BusPendingActivation *pending_activation = data;
- dbus_bool_t uses_servicehelper;
-
- _dbus_assert (babysitter == pending_activation->babysitter);
- _dbus_babysitter_ref (babysitter);
-
- /* There are two major cases here; are we the system bus or the session? Here this
- * is distinguished by whether or not we use a setuid helper launcher. With the launch helper,
- * some process exit codes are meaningful, processed by handle_servicehelper_exit_error.
- *
- * In both cases though, just ignore when a process exits with status 0; it's possible for
- * a program to (misguidedly) "daemonize", and that appears to us as an exit. This closes a race
- * condition between this code and the child process claiming the bus name.
- */
- uses_servicehelper = bus_context_get_servicehelper (pending_activation->activation->context) != NULL;
-
- /* strictly speaking this is redundant with the check in dbus-spawn now */
- if (_dbus_babysitter_get_child_exited (babysitter))
- {
- DBusError error;
- DBusHashIter iter;
- dbus_bool_t activation_failed;
- int exit_code = 0;
-
- dbus_error_init (&error);
-
- _dbus_babysitter_set_child_exit_error (babysitter, &error);
-
- /* Explicitly check for SPAWN_CHILD_EXITED to avoid overwriting an
- * exec error */
- if (dbus_error_has_name (&error, DBUS_ERROR_SPAWN_CHILD_EXITED)
- && _dbus_babysitter_get_child_exit_status (babysitter, &exit_code))
- {
- activation_failed = exit_code != 0;
-
- dbus_error_free(&error);
-
- if (activation_failed)
- {
- if (uses_servicehelper)
- handle_servicehelper_exit_error (exit_code, &error);
- else
- _dbus_babysitter_set_child_exit_error (babysitter, &error);
- }
- }
- else
- {
- activation_failed = TRUE;
- }
-
- if (activation_failed)
- {
- bus_context_log (pending_activation->activation->context,
- DBUS_SYSTEM_LOG_INFO, "Activated service '%s' failed: %s",
- pending_activation->service_name,
- error.message);
-
- /* Destroy all pending activations with the same exec */
- _dbus_hash_iter_init (pending_activation->activation->pending_activations,
- &iter);
- while (_dbus_hash_iter_next (&iter))
- {
- BusPendingActivation *p = _dbus_hash_iter_get_value (&iter);
-
- if (p != pending_activation && strcmp (p->exec, pending_activation->exec) == 0)
- pending_activation_failed (p, &error);
- }
-
- /* Destroys the pending activation */
- pending_activation_failed (pending_activation, &error);
-
- dbus_error_free (&error);
- }
- }
-
- _dbus_babysitter_unref (babysitter);
-}
-
-static dbus_bool_t
-add_babysitter_watch (DBusWatch *watch,
- void *data)
-{
- BusPendingActivation *pending_activation = data;
-
- return _dbus_loop_add_watch (
- bus_context_get_loop (pending_activation->activation->context),
- watch);
-}
-
-static void
-remove_babysitter_watch (DBusWatch *watch,
- void *data)
-{
- BusPendingActivation *pending_activation = data;
-
- _dbus_loop_remove_watch (bus_context_get_loop (pending_activation->activation->context),
- watch);
-}
-
-static void
-toggle_babysitter_watch (DBusWatch *watch,
- void *data)
-{
- BusPendingActivation *pending_activation = data;
-
- _dbus_loop_toggle_watch (bus_context_get_loop (pending_activation->activation->context),
- watch);
-}
-
-static dbus_bool_t
-pending_activation_timed_out (void *data)
-{
- BusPendingActivation *pending_activation = data;
- DBusError error;
-
- /* Kill the spawned process, since it sucks
- * (not sure this is what we want to do, but
- * may as well try it for now)
- */
- if (pending_activation->babysitter)
- _dbus_babysitter_kill_child (pending_activation->babysitter);
-
- dbus_error_init (&error);
-
- dbus_set_error (&error, DBUS_ERROR_TIMED_OUT,
- "Activation of %s timed out",
- pending_activation->service_name);
- bus_context_log (pending_activation->activation->context,
- DBUS_SYSTEM_LOG_INFO,
- "Failed to activate service '%s': timed out",
- pending_activation->service_name);
-
- pending_activation_failed (pending_activation, &error);
-
- dbus_error_free (&error);
-
- return TRUE;
-}
-
-static void
-cancel_pending (void *data)
-{
- BusPendingActivation *pending_activation = data;
-
- _dbus_verbose ("Canceling pending activation of %s\n",
- pending_activation->service_name);
-
- if (pending_activation->babysitter)
- _dbus_babysitter_kill_child (pending_activation->babysitter);
-
- _dbus_hash_table_remove_string (pending_activation->activation->pending_activations,
- pending_activation->service_name);
-}
-
-static void
-free_pending_cancel_data (void *data)
-{
- BusPendingActivation *pending_activation = data;
-
- bus_pending_activation_unref (pending_activation);
-}
-
-static dbus_bool_t
-add_cancel_pending_to_transaction (BusTransaction *transaction,
- BusPendingActivation *pending_activation)
-{
- if (!bus_transaction_add_cancel_hook (transaction, cancel_pending,
- pending_activation,
- free_pending_cancel_data))
- return FALSE;
-
- bus_pending_activation_ref (pending_activation);
-
- _dbus_verbose ("Saved pending activation to be canceled if the transaction fails\n");
-
- return TRUE;
-}
-
-static dbus_bool_t
-update_service_cache (BusActivation *activation, DBusError *error)
-{
- DBusHashIter iter;
-
- _dbus_hash_iter_init (activation->directories, &iter);
- while (_dbus_hash_iter_next (&iter))
- {
- DBusError tmp_error;
- BusServiceDirectory *s_dir;
-
- s_dir = _dbus_hash_iter_get_value (&iter);
-
- dbus_error_init (&tmp_error);
- if (!update_directory (activation, s_dir, &tmp_error))
- {
- if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_move_error (&tmp_error, error);
- return FALSE;
- }
-
- dbus_error_free (&tmp_error);
- continue;
- }
- }
-
- return TRUE;
-}
-
-static BusActivationEntry *
-activation_find_entry (BusActivation *activation,
- const char *service_name,
- DBusError *error)
-{
- BusActivationEntry *entry;
-
- entry = _dbus_hash_table_lookup_string (activation->entries, service_name);
- if (!entry)
- {
- if (!update_service_cache (activation, error))
- return NULL;
-
- entry = _dbus_hash_table_lookup_string (activation->entries,
- service_name);
- }
- else
- {
- BusActivationEntry *updated_entry;
-
- if (!check_service_file (activation, entry, &updated_entry, error))
- return NULL;
-
- entry = updated_entry;
- }
-
- if (!entry)
- {
- dbus_set_error (error, DBUS_ERROR_SERVICE_UNKNOWN,
- "The name %s was not provided by any .service files",
- service_name);
- return NULL;
- }
-
- return entry;
-}
-
-static char **
-bus_activation_get_environment (BusActivation *activation)
-{
- char **environment;
- int i, length;
- DBusString entry;
- DBusHashIter iter;
-
- length = _dbus_hash_table_get_n_entries (activation->environment);
-
- environment = dbus_new0 (char *, length + 1);
-
- if (environment == NULL)
- return NULL;
-
- i = 0;
- _dbus_hash_iter_init (activation->environment, &iter);
-
- if (!_dbus_string_init (&entry))
- {
- dbus_free_string_array (environment);
- return NULL;
- }
-
- while (_dbus_hash_iter_next (&iter))
- {
- const char *key, *value;
-
- key = (const char *) _dbus_hash_iter_get_string_key (&iter);
- value = (const char *) _dbus_hash_iter_get_value (&iter);
-
- if (!_dbus_string_append_printf (&entry, "%s=%s", key, value))
- break;
-
- if (!_dbus_string_steal_data (&entry, environment + i))
- break;
- i++;
- }
-
- _dbus_string_free (&entry);
-
- if (i != length)
- {
- dbus_free_string_array (environment);
- environment = NULL;
- }
-
- return environment;
-}
-
-dbus_bool_t
-bus_activation_set_environment_variable (BusActivation *activation,
- const char *key,
- const char *value,
- DBusError *error)
-{
- char *hash_key;
- char *hash_value;
- dbus_bool_t retval;
-
- retval = FALSE;
- hash_key = NULL;
- hash_value = NULL;
- hash_key = _dbus_strdup (key);
-
- if (hash_key == NULL)
- goto out;
-
- hash_value = _dbus_strdup (value);
-
- if (hash_value == NULL)
- goto out;
-
- if (!_dbus_hash_table_insert_string (activation->environment,
- hash_key, hash_value))
- goto out;
-
- retval = TRUE;
-out:
- if (retval == FALSE)
- {
- dbus_free (hash_key);
- dbus_free (hash_value);
- BUS_SET_OOM (error);
- }
-
- return retval;
-}
-
-dbus_bool_t
-bus_activation_activate_service (BusActivation *activation,
- DBusConnection *connection,
- BusTransaction *transaction,
- dbus_bool_t auto_activation,
- DBusMessage *activation_message,
- const char *service_name,
- DBusError *error)
-{
- DBusError tmp_error;
- BusActivationEntry *entry;
- BusPendingActivation *pending_activation;
- BusPendingActivationEntry *pending_activation_entry;
- DBusMessage *message;
- DBusString service_str;
- const char *servicehelper;
- char **argv;
- char **envp = NULL;
- int argc;
- dbus_bool_t retval;
- dbus_bool_t was_pending_activation;
- DBusString command;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (activation->n_pending_activations >=
- bus_context_get_max_pending_activations (activation->context))
- {
- dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
- "The maximum number of pending activations has been reached, activation of %s failed",
- service_name);
- return FALSE;
- }
-
- entry = activation_find_entry (activation, service_name, error);
- if (!entry)
- return FALSE;
-
- /* Bypass the registry lookup if we're auto-activating, bus_dispatch would not
- * call us if the service is already active.
- */
- if (!auto_activation)
- {
- /* Check if the service is active */
- _dbus_string_init_const (&service_str, service_name);
- if (bus_registry_lookup (bus_context_get_registry (activation->context), &service_str) != NULL)
- {
- dbus_uint32_t result;
-
- _dbus_verbose ("Service \"%s\" is already active\n", service_name);
-
- message = dbus_message_new_method_return (activation_message);
-
- if (!message)
- {
- _dbus_verbose ("No memory to create reply to activate message\n");
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- result = DBUS_START_REPLY_ALREADY_RUNNING;
-
- if (!dbus_message_append_args (message,
- DBUS_TYPE_UINT32, &result,
- DBUS_TYPE_INVALID))
- {
- _dbus_verbose ("No memory to set args of reply to activate message\n");
- BUS_SET_OOM (error);
- dbus_message_unref (message);
- return FALSE;
- }
-
- retval = bus_transaction_send_from_driver (transaction, connection, message);
- dbus_message_unref (message);
- if (!retval)
- {
- _dbus_verbose ("Failed to send reply\n");
- BUS_SET_OOM (error);
- }
-
- return retval;
- }
- }
-
- pending_activation_entry = dbus_new0 (BusPendingActivationEntry, 1);
- if (!pending_activation_entry)
- {
- _dbus_verbose ("Failed to create pending activation entry\n");
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- pending_activation_entry->auto_activation = auto_activation;
-
- pending_activation_entry->activation_message = activation_message;
- dbus_message_ref (activation_message);
- pending_activation_entry->connection = connection;
- if (connection)
- dbus_connection_ref (connection);
-
- /* Check if the service is being activated */
- pending_activation = _dbus_hash_table_lookup_string (activation->pending_activations, service_name);
- was_pending_activation = (pending_activation != NULL);
- if (was_pending_activation)
- {
- if (!_dbus_list_append (&pending_activation->entries, pending_activation_entry))
- {
- _dbus_verbose ("Failed to append a new entry to pending activation\n");
-
- BUS_SET_OOM (error);
- bus_pending_activation_entry_free (pending_activation_entry);
- return FALSE;
- }
-
- pending_activation->n_entries += 1;
- pending_activation->activation->n_pending_activations += 1;
- }
- else
- {
- pending_activation = dbus_new0 (BusPendingActivation, 1);
- if (!pending_activation)
- {
- _dbus_verbose ("Failed to create pending activation\n");
-
- BUS_SET_OOM (error);
- bus_pending_activation_entry_free (pending_activation_entry);
- return FALSE;
- }
-
- pending_activation->activation = activation;
- pending_activation->refcount = 1;
-
- pending_activation->service_name = _dbus_strdup (service_name);
- if (!pending_activation->service_name)
- {
- _dbus_verbose ("Failed to copy service name for pending activation\n");
-
- BUS_SET_OOM (error);
- bus_pending_activation_unref (pending_activation);
- bus_pending_activation_entry_free (pending_activation_entry);
- return FALSE;
- }
-
- pending_activation->exec = _dbus_strdup (entry->exec);
- if (!pending_activation->exec)
- {
- _dbus_verbose ("Failed to copy service exec for pending activation\n");
- BUS_SET_OOM (error);
- bus_pending_activation_unref (pending_activation);
- bus_pending_activation_entry_free (pending_activation_entry);
- return FALSE;
- }
-
- if (entry->systemd_service)
- {
- pending_activation->systemd_service = _dbus_strdup (entry->systemd_service);
- if (!pending_activation->systemd_service)
- {
- _dbus_verbose ("Failed to copy systemd service for pending activation\n");
- BUS_SET_OOM (error);
- bus_pending_activation_unref (pending_activation);
- bus_pending_activation_entry_free (pending_activation_entry);
- return FALSE;
- }
- }
-
- pending_activation->timeout =
- _dbus_timeout_new (bus_context_get_activation_timeout (activation->context),
- pending_activation_timed_out,
- pending_activation,
- NULL);
- if (!pending_activation->timeout)
- {
- _dbus_verbose ("Failed to create timeout for pending activation\n");
-
- BUS_SET_OOM (error);
- bus_pending_activation_unref (pending_activation);
- bus_pending_activation_entry_free (pending_activation_entry);
- return FALSE;
- }
-
- if (!_dbus_loop_add_timeout (bus_context_get_loop (activation->context),
- pending_activation->timeout))
- {
- _dbus_verbose ("Failed to add timeout for pending activation\n");
-
- BUS_SET_OOM (error);
- bus_pending_activation_unref (pending_activation);
- bus_pending_activation_entry_free (pending_activation_entry);
- return FALSE;
- }
-
- pending_activation->timeout_added = TRUE;
-
- if (!_dbus_list_append (&pending_activation->entries, pending_activation_entry))
- {
- _dbus_verbose ("Failed to add entry to just-created pending activation\n");
-
- BUS_SET_OOM (error);
- bus_pending_activation_unref (pending_activation);
- bus_pending_activation_entry_free (pending_activation_entry);
- return FALSE;
- }
-
- pending_activation->n_entries += 1;
- pending_activation->activation->n_pending_activations += 1;
-
- if (!_dbus_hash_table_insert_string (activation->pending_activations,
- pending_activation->service_name,
- pending_activation))
- {
- _dbus_verbose ("Failed to put pending activation in hash table\n");
-
- BUS_SET_OOM (error);
- bus_pending_activation_unref (pending_activation);
- return FALSE;
- }
- }
-
- if (!add_cancel_pending_to_transaction (transaction, pending_activation))
- {
- _dbus_verbose ("Failed to add pending activation cancel hook to transaction\n");
- BUS_SET_OOM (error);
- _dbus_hash_table_remove_string (activation->pending_activations,
- pending_activation->service_name);
-
- return FALSE;
- }
-
- if (was_pending_activation)
- return TRUE;
-
- if (bus_context_get_systemd_activation (activation->context))
- {
- if (strcmp (service_name, "org.freedesktop.systemd1") == 0)
- /* systemd itself is missing apparently. That can happen
- only during early startup. Let's just wait until systemd
- connects to us and do nothing. */
- return TRUE;
-
- if (entry->systemd_service)
- {
- BusTransaction *activation_transaction;
- DBusString service_string;
- BusService *service;
- BusRegistry *registry;
-
- /* OK, we have a systemd service configured for this entry,
- hence let's enqueue an activation request message. This
- is implemented as a directed signal, not a method call,
- for three reasons: 1) we don't expect a response on
- success, where we just expect a name appearing on the
- bus; 2) at this time the systemd service might not yet
- have connected, so we wouldn't know the message serial at
- this point to set up a pending call; 3) it is ugly if the
- bus suddenly becomes the caller of a remote method. */
-
- message = dbus_message_new_signal (DBUS_PATH_DBUS,
- "org.freedesktop.systemd1.Activator",
- "ActivationRequest");
- if (!message)
- {
- _dbus_verbose ("No memory to create activation message\n");
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS) ||
- !dbus_message_set_destination (message, "org.freedesktop.systemd1") ||
- !dbus_message_append_args (message,
- DBUS_TYPE_STRING, &entry->systemd_service,
- DBUS_TYPE_INVALID))
- {
- _dbus_verbose ("No memory to set args of activation message\n");
- dbus_message_unref (message);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- /* Create our transaction */
- activation_transaction = bus_transaction_new (activation->context);
- if (activation_transaction == NULL)
- {
- _dbus_verbose ("No memory to create activation transaction\n");
- dbus_message_unref (message);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- /* Check whether systemd is already connected */
- registry = bus_connection_get_registry (connection);
- _dbus_string_init_const (&service_string, "org.freedesktop.systemd1");
- service = bus_registry_lookup (registry, &service_string);
-
- if (service != NULL)
- {
- bus_context_log (activation->context,
- DBUS_SYSTEM_LOG_INFO, "Activating via systemd: service name='%s' unit='%s'",
- service_name,
- entry->systemd_service);
- /* Wonderful, systemd is connected, let's just send the msg */
- retval = bus_dispatch_matches (activation_transaction, NULL, bus_service_get_primary_owners_connection (service),
- message, error);
- }
- else
- {
- bus_context_log (activation->context,
- DBUS_SYSTEM_LOG_INFO, "Activating systemd to hand-off: service name='%s' unit='%s'",
- service_name,
- entry->systemd_service);
- /* systemd is not around, let's "activate" it. */
- retval = bus_activation_activate_service (activation, NULL, activation_transaction, TRUE,
- message, "org.freedesktop.systemd1", error);
- }
-
- dbus_message_unref (message);
-
- if (!retval)
- {
- bus_context_log (activation->context,
- DBUS_SYSTEM_LOG_INFO, "Failed to activate via systemd: service name='%s' unit='%s'",
- service_name,
- entry->systemd_service);
- _DBUS_ASSERT_ERROR_IS_SET (error);
- _dbus_verbose ("failed to send activation message: %s\n", error->name);
- bus_transaction_cancel_and_free (activation_transaction);
- return FALSE;
- }
-
- bus_transaction_execute_and_free (activation_transaction);
- return TRUE;
- }
-
- /* OK, we have no configured systemd service, hence let's
- proceed with traditional activation. */
- }
-
- /* use command as system and session different */
- if (!_dbus_string_init (&command))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- /* does the bus use a helper? */
- servicehelper = bus_context_get_servicehelper (activation->context);
- if (servicehelper != NULL)
- {
- if (entry->user == NULL)
- {
- _dbus_string_free (&command);
- dbus_set_error (error, DBUS_ERROR_SPAWN_FILE_INVALID,
- "Cannot do system-bus activation with no user\n");
- return FALSE;
- }
-
- /* join the helper path and the service name */
- if (!_dbus_string_append (&command, servicehelper))
- {
- _dbus_string_free (&command);
- BUS_SET_OOM (error);
- return FALSE;
- }
- if (!_dbus_string_append (&command, " "))
- {
- _dbus_string_free (&command);
- BUS_SET_OOM (error);
- return FALSE;
- }
- if (!_dbus_string_append (&command, service_name))
- {
- _dbus_string_free (&command);
- BUS_SET_OOM (error);
- return FALSE;
- }
- }
- else
- {
- /* the bus does not use a helper, so we can append arguments with the exec line */
- if (!_dbus_string_append (&command, entry->exec))
- {
- _dbus_string_free (&command);
- BUS_SET_OOM (error);
- return FALSE;
- }
- }
-
- /* convert command into arguments */
- if (!_dbus_shell_parse_argv (_dbus_string_get_const_data (&command), &argc, &argv, error))
- {
- _dbus_verbose ("Failed to parse command line: %s\n", entry->exec);
- _DBUS_ASSERT_ERROR_IS_SET (error);
-
- _dbus_hash_table_remove_string (activation->pending_activations,
- pending_activation->service_name);
-
- _dbus_string_free (&command);
- return FALSE;
- }
- _dbus_string_free (&command);
-
- if (!add_bus_environment (activation, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- dbus_free_string_array (argv);
- return FALSE;
- }
-
- envp = bus_activation_get_environment (activation);
-
- if (envp == NULL)
- {
- BUS_SET_OOM (error);
- dbus_free_string_array (argv);
- return FALSE;
- }
-
- _dbus_verbose ("Spawning %s ...\n", argv[0]);
- if (servicehelper != NULL)
- bus_context_log (activation->context,
- DBUS_SYSTEM_LOG_INFO, "Activating service name='%s' (using servicehelper)",
- service_name);
- else
- bus_context_log (activation->context,
- DBUS_SYSTEM_LOG_INFO, "Activating service name='%s'",
- service_name);
-
- dbus_error_init (&tmp_error);
-
- if (!_dbus_spawn_async_with_babysitter (&pending_activation->babysitter,
- service_name,
- argv,
- envp,
- NULL, activation,
- &tmp_error))
- {
- _dbus_verbose ("Failed to spawn child\n");
- bus_context_log (activation->context,
- DBUS_SYSTEM_LOG_INFO, "Failed to activate service %s: %s",
- service_name,
- tmp_error.message);
- _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
- dbus_move_error (&tmp_error, error);
- dbus_free_string_array (argv);
- dbus_free_string_array (envp);
-
- return FALSE;
- }
-
- dbus_free_string_array (argv);
- envp = NULL;
-
- _dbus_assert (pending_activation->babysitter != NULL);
-
- _dbus_babysitter_set_result_function (pending_activation->babysitter,
- pending_activation_finished_cb,
- pending_activation);
-
- if (!_dbus_babysitter_set_watch_functions (pending_activation->babysitter,
- add_babysitter_watch,
- remove_babysitter_watch,
- toggle_babysitter_watch,
- pending_activation,
- NULL))
- {
- BUS_SET_OOM (error);
- _dbus_verbose ("Failed to set babysitter watch functions\n");
- return FALSE;
- }
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_activation_list_services (BusActivation *activation,
- char ***listp,
- int *array_len)
-{
- int i, j, len;
- char **retval;
- DBusHashIter iter;
-
- len = _dbus_hash_table_get_n_entries (activation->entries);
- retval = dbus_new (char *, len + 1);
-
- if (retval == NULL)
- return FALSE;
-
- _dbus_hash_iter_init (activation->entries, &iter);
- i = 0;
- while (_dbus_hash_iter_next (&iter))
- {
- BusActivationEntry *entry = _dbus_hash_iter_get_value (&iter);
-
- retval[i] = _dbus_strdup (entry->name);
- if (retval[i] == NULL)
- goto error;
-
- i++;
- }
-
- retval[i] = NULL;
-
- if (array_len)
- *array_len = len;
-
- *listp = retval;
- return TRUE;
-
- error:
- for (j = 0; j < i; j++)
- dbus_free (retval[i]);
- dbus_free (retval);
-
- return FALSE;
-}
-
-dbus_bool_t
-dbus_activation_systemd_failure (BusActivation *activation,
- DBusMessage *message)
-{
- DBusError error;
- const char *code, *str, *unit = NULL;
-
- dbus_error_init(&error);
-
- /* This is called whenever the systemd activator sent us a
- response. We'll invalidate all pending activations that match the
- unit name. */
-
- if (dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &unit,
- DBUS_TYPE_STRING, &code,
- DBUS_TYPE_STRING, &str,
- DBUS_TYPE_INVALID))
- dbus_set_error(&error, code, str);
-
-
- if (unit)
- {
- DBusHashIter iter;
-
- bus_context_log (activation->context,
- DBUS_SYSTEM_LOG_INFO, "Activation via systemd failed for unit '%s': %s",
- unit,
- str);
-
- _dbus_hash_iter_init (activation->pending_activations,
- &iter);
-
- while (_dbus_hash_iter_next (&iter))
- {
- BusPendingActivation *p = _dbus_hash_iter_get_value (&iter);
-
- if (p->systemd_service && strcmp (p->systemd_service, unit) == 0)
- pending_activation_failed(p, &error);
- }
- }
-
- dbus_error_free(&error);
-
- return TRUE;
-}
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-
-#include <stdio.h>
-
-#define SERVICE_NAME_1 "MyService1"
-#define SERVICE_NAME_2 "MyService2"
-#define SERVICE_NAME_3 "MyService3"
-
-#define SERVICE_FILE_1 "service-1.service"
-#define SERVICE_FILE_2 "service-2.service"
-#define SERVICE_FILE_3 "service-3.service"
-
-static dbus_bool_t
-test_create_service_file (DBusString *dir,
- const char *filename,
- const char *name,
- const char *exec)
-{
- DBusString file_name, full_path;
- FILE *file;
- dbus_bool_t ret_val;
-
- ret_val = TRUE;
- _dbus_string_init_const (&file_name, filename);
-
- if (!_dbus_string_init (&full_path))
- return FALSE;
-
- if (!_dbus_string_append (&full_path, _dbus_string_get_const_data (dir)) ||
- !_dbus_concat_dir_and_file (&full_path, &file_name))
- {
- ret_val = FALSE;
- goto out;
- }
-
- file = fopen (_dbus_string_get_const_data (&full_path), "w");
- if (!file)
- {
- ret_val = FALSE;
- goto out;
- }
-
- fprintf (file, "[D-BUS Service]\nName=%s\nExec=%s\n", name, exec);
- fclose (file);
-
-out:
- _dbus_string_free (&full_path);
- return ret_val;
-}
-
-static dbus_bool_t
-test_remove_service_file (DBusString *dir, const char *filename)
-{
- DBusString file_name, full_path;
- dbus_bool_t ret_val;
-
- ret_val = TRUE;
-
- _dbus_string_init_const (&file_name, filename);
-
- if (!_dbus_string_init (&full_path))
- return FALSE;
-
- if (!_dbus_string_append (&full_path, _dbus_string_get_const_data (dir)) ||
- !_dbus_concat_dir_and_file (&full_path, &file_name))
- {
- ret_val = FALSE;
- goto out;
- }
-
- if (!_dbus_delete_file (&full_path, NULL))
- {
- ret_val = FALSE;
- goto out;
- }
-
-out:
- _dbus_string_free (&full_path);
- return ret_val;
-}
-
-static dbus_bool_t
-test_remove_directory (DBusString *dir)
-{
- DBusDirIter *iter;
- DBusString filename, full_path;
- dbus_bool_t ret_val;
-
- ret_val = TRUE;
-
- if (!_dbus_string_init (&filename))
- return FALSE;
-
- if (!_dbus_string_init (&full_path))
- {
- _dbus_string_free (&filename);
- return FALSE;
- }
-
- iter = _dbus_directory_open (dir, NULL);
- if (iter == NULL)
- {
- ret_val = FALSE;
- goto out;
- }
-
- while (_dbus_directory_get_next_file (iter, &filename, NULL))
- {
- if (!test_remove_service_file (dir, _dbus_string_get_const_data (&filename)))
- {
- ret_val = FALSE;
- goto out;
- }
- }
- _dbus_directory_close (iter);
-
- if (!_dbus_delete_directory (dir, NULL))
- {
- ret_val = FALSE;
- goto out;
- }
-
-out:
- _dbus_string_free (&filename);
- _dbus_string_free (&full_path);
-
- return ret_val;
-}
-
-static dbus_bool_t
-init_service_reload_test (DBusString *dir)
-{
- DBusStat stat_buf;
-
- if (!_dbus_stat (dir, &stat_buf, NULL))
- {
- if (!_dbus_create_directory (dir, NULL))
- return FALSE;
- }
- else
- {
- if (!test_remove_directory (dir))
- return FALSE;
-
- if (!_dbus_create_directory (dir, NULL))
- return FALSE;
- }
-
- /* Create one initial file */
- if (!test_create_service_file (dir, SERVICE_FILE_1, SERVICE_NAME_1, "exec-1"))
- return FALSE;
-
- return TRUE;
-}
-
-static dbus_bool_t
-cleanup_service_reload_test (DBusString *dir)
-{
- if (!test_remove_directory (dir))
- return FALSE;
-
- return TRUE;
-}
-
-typedef struct
-{
- BusActivation *activation;
- const char *service_name;
- dbus_bool_t expecting_find;
-} CheckData;
-
-static dbus_bool_t
-check_func (void *data)
-{
- CheckData *d;
- BusActivationEntry *entry;
- DBusError error;
- dbus_bool_t ret_val;
-
- ret_val = TRUE;
- d = data;
-
- dbus_error_init (&error);
-
- entry = activation_find_entry (d->activation, d->service_name, &error);
- if (entry == NULL)
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- ret_val = TRUE;
- }
- else
- {
- if (d->expecting_find)
- ret_val = FALSE;
- }
-
- dbus_error_free (&error);
- }
- else
- {
- if (!d->expecting_find)
- ret_val = FALSE;
- }
-
- return ret_val;
-}
-
-static dbus_bool_t
-do_test (const char *description, dbus_bool_t oom_test, CheckData *data)
-{
- dbus_bool_t err;
-
- if (oom_test)
- err = !_dbus_test_oom_handling (description, check_func, data);
- else
- err = !check_func (data);
-
- if (err)
- _dbus_assert_not_reached ("Test failed");
-
- return TRUE;
-}
-
-static dbus_bool_t
-do_service_reload_test (DBusString *dir, dbus_bool_t oom_test)
-{
- BusActivation *activation;
- DBusString address;
- DBusList *directories;
- CheckData d;
-
- directories = NULL;
- _dbus_string_init_const (&address, "");
-
- if (!_dbus_list_append (&directories, _dbus_string_get_data (dir)))
- return FALSE;
-
- activation = bus_activation_new (NULL, &address, &directories, NULL);
- if (!activation)
- return FALSE;
-
- d.activation = activation;
-
- /* Check for existing service file */
- d.expecting_find = TRUE;
- d.service_name = SERVICE_NAME_1;
-
- if (!do_test ("Existing service file", oom_test, &d))
- return FALSE;
-
- /* Check for non-existing service file */
- d.expecting_find = FALSE;
- d.service_name = SERVICE_NAME_3;
-
- if (!do_test ("Nonexisting service file", oom_test, &d))
- return FALSE;
-
- /* Check for added service file */
- if (!test_create_service_file (dir, SERVICE_FILE_2, SERVICE_NAME_2, "exec-2"))
- return FALSE;
-
- d.expecting_find = TRUE;
- d.service_name = SERVICE_NAME_2;
-
- if (!do_test ("Added service file", oom_test, &d))
- return FALSE;
-
- /* Check for removed service file */
- if (!test_remove_service_file (dir, SERVICE_FILE_2))
- return FALSE;
-
- d.expecting_find = FALSE;
- d.service_name = SERVICE_FILE_2;
-
- if (!do_test ("Removed service file", oom_test, &d))
- return FALSE;
-
- /* Check for updated service file */
-
- _dbus_sleep_milliseconds (1000); /* Sleep a second to make sure the mtime is updated */
-
- if (!test_create_service_file (dir, SERVICE_FILE_1, SERVICE_NAME_3, "exec-3"))
- return FALSE;
-
- d.expecting_find = TRUE;
- d.service_name = SERVICE_NAME_3;
-
- if (!do_test ("Updated service file, part 1", oom_test, &d))
- return FALSE;
-
- d.expecting_find = FALSE;
- d.service_name = SERVICE_NAME_1;
-
- if (!do_test ("Updated service file, part 2", oom_test, &d))
- return FALSE;
-
- bus_activation_unref (activation);
- _dbus_list_clear (&directories);
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_activation_service_reload_test (const DBusString *test_data_dir)
-{
- DBusString directory;
- const char *tmp;
-
- if (!_dbus_string_init (&directory))
- return FALSE;
-
- tmp = _dbus_get_tmpdir ();
-
- if (tmp == NULL)
- return FALSE;
-
- if (!_dbus_string_append (&directory, tmp))
- return FALSE;
-
- if (!_dbus_string_append (&directory, "/dbus-reload-test-") ||
- !_dbus_generate_random_ascii (&directory, 6))
- {
- return FALSE;
- }
-
- /* Do normal tests */
- if (!init_service_reload_test (&directory))
- _dbus_assert_not_reached ("could not initiate service reload test");
-
- if (!do_service_reload_test (&directory, FALSE))
- {
- /* Do nothing? */
- }
-
- /* Do OOM tests */
- if (!init_service_reload_test (&directory))
- _dbus_assert_not_reached ("could not initiate service reload test");
-
- if (!do_service_reload_test (&directory, TRUE))
- {
- /* Do nothing? */
- }
-
- /* Cleanup test directory */
- if (!cleanup_service_reload_test (&directory))
- return FALSE;
-
- _dbus_string_free (&directory);
-
- return TRUE;
-}
-
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
diff --git a/src/3rd_party/dbus-1.7.8/bus/activation.h b/src/3rd_party/dbus-1.7.8/bus/activation.h
deleted file mode 100644
index 97f25b1ffb..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/activation.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* activation.h Activation of services
- *
- * Copyright (C) 2003 CodeFactory AB
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_ACTIVATION_H
-#define BUS_ACTIVATION_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-list.h>
-#include "bus.h"
-
-BusActivation* bus_activation_new (BusContext *context,
- const DBusString *address,
- DBusList **directories,
- DBusError *error);
-dbus_bool_t bus_activation_reload (BusActivation *activation,
- const DBusString *address,
- DBusList **directories,
- DBusError *error);
-BusActivation* bus_activation_ref (BusActivation *activation);
-void bus_activation_unref (BusActivation *activation);
-
-dbus_bool_t bus_activation_set_environment_variable (BusActivation *activation,
- const char *key,
- const char *value,
- DBusError *error);
-dbus_bool_t bus_activation_activate_service (BusActivation *activation,
- DBusConnection *connection,
- BusTransaction *transaction,
- dbus_bool_t auto_activation,
- DBusMessage *activation_message,
- const char *service_name,
- DBusError *error);
-dbus_bool_t bus_activation_service_created (BusActivation *activation,
- const char *service_name,
- BusTransaction *transaction,
- DBusError *error);
-dbus_bool_t bus_activation_list_services (BusActivation *registry,
- char ***listp,
- int *array_len);
-dbus_bool_t dbus_activation_systemd_failure (BusActivation *activation,
- DBusMessage *message);
-
-dbus_bool_t bus_activation_send_pending_auto_activation_messages (BusActivation *activation,
- BusService *service,
- BusTransaction *transaction,
- DBusError *error);
-
-
-#endif /* BUS_ACTIVATION_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/bus.c b/src/3rd_party/dbus-1.7.8/bus/bus.c
deleted file mode 100644
index 307c158612..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/bus.c
+++ /dev/null
@@ -1,1648 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* bus.c message bus context object
- *
- * Copyright (C) 2003, 2004 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "bus.h"
-
-#include <stdio.h>
-
-#include "activation.h"
-#include "connection.h"
-#include "services.h"
-#include "utils.h"
-#include "policy.h"
-#include "config-parser.h"
-#include "signals.h"
-#include "selinux.h"
-#include "dir-watch.h"
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-hash.h>
-#include <dbus/dbus-credentials.h>
-#include <dbus/dbus-internals.h>
-
-#ifdef DBUS_CYGWIN
-#include <signal.h>
-#endif
-
-struct BusContext
-{
- int refcount;
- DBusGUID uuid;
- char *config_file;
- char *type;
- char *servicehelper;
- char *address;
- char *pidfile;
- char *user;
- char *log_prefix;
- DBusLoop *loop;
- DBusList *servers;
- BusConnections *connections;
- BusActivation *activation;
- BusRegistry *registry;
- BusPolicy *policy;
- BusMatchmaker *matchmaker;
- BusLimits limits;
- unsigned int fork : 1;
- unsigned int syslog : 1;
- unsigned int keep_umask : 1;
- unsigned int allow_anonymous : 1;
- unsigned int systemd_activation : 1;
-};
-
-static dbus_int32_t server_data_slot = -1;
-
-typedef struct
-{
- BusContext *context;
-} BusServerData;
-
-#define BUS_SERVER_DATA(server) (dbus_server_get_data ((server), server_data_slot))
-
-static BusContext*
-server_get_context (DBusServer *server)
-{
- BusContext *context;
- BusServerData *bd;
-
- if (!dbus_server_allocate_data_slot (&server_data_slot))
- return NULL;
-
- bd = BUS_SERVER_DATA (server);
- if (bd == NULL)
- {
- dbus_server_free_data_slot (&server_data_slot);
- return NULL;
- }
-
- context = bd->context;
-
- dbus_server_free_data_slot (&server_data_slot);
-
- return context;
-}
-
-static dbus_bool_t
-add_server_watch (DBusWatch *watch,
- void *data)
-{
- DBusServer *server = data;
- BusContext *context;
-
- context = server_get_context (server);
-
- return _dbus_loop_add_watch (context->loop, watch);
-}
-
-static void
-remove_server_watch (DBusWatch *watch,
- void *data)
-{
- DBusServer *server = data;
- BusContext *context;
-
- context = server_get_context (server);
-
- _dbus_loop_remove_watch (context->loop, watch);
-}
-
-static void
-toggle_server_watch (DBusWatch *watch,
- void *data)
-{
- DBusServer *server = data;
- BusContext *context;
-
- context = server_get_context (server);
-
- _dbus_loop_toggle_watch (context->loop, watch);
-}
-
-static dbus_bool_t
-add_server_timeout (DBusTimeout *timeout,
- void *data)
-{
- DBusServer *server = data;
- BusContext *context;
-
- context = server_get_context (server);
-
- return _dbus_loop_add_timeout (context->loop, timeout);
-}
-
-static void
-remove_server_timeout (DBusTimeout *timeout,
- void *data)
-{
- DBusServer *server = data;
- BusContext *context;
-
- context = server_get_context (server);
-
- _dbus_loop_remove_timeout (context->loop, timeout);
-}
-
-static void
-new_connection_callback (DBusServer *server,
- DBusConnection *new_connection,
- void *data)
-{
- BusContext *context = data;
-
- if (!bus_connections_setup_connection (context->connections, new_connection))
- {
- _dbus_verbose ("No memory to setup new connection\n");
-
- /* if we don't do this, it will get unref'd without
- * being disconnected... kind of strange really
- * that we have to do this, people won't get it right
- * in general.
- */
- dbus_connection_close (new_connection);
- }
-
- dbus_connection_set_max_received_size (new_connection,
- context->limits.max_incoming_bytes);
-
- dbus_connection_set_max_message_size (new_connection,
- context->limits.max_message_size);
-
- dbus_connection_set_max_received_unix_fds (new_connection,
- context->limits.max_incoming_unix_fds);
-
- dbus_connection_set_max_message_unix_fds (new_connection,
- context->limits.max_message_unix_fds);
-
- dbus_connection_set_allow_anonymous (new_connection,
- context->allow_anonymous);
-
- /* on OOM, we won't have ref'd the connection so it will die. */
-}
-
-static void
-free_server_data (void *data)
-{
- BusServerData *bd = data;
-
- dbus_free (bd);
-}
-
-static dbus_bool_t
-setup_server (BusContext *context,
- DBusServer *server,
- char **auth_mechanisms,
- DBusError *error)
-{
- BusServerData *bd;
-
- bd = dbus_new0 (BusServerData, 1);
- if (bd == NULL || !dbus_server_set_data (server,
- server_data_slot,
- bd, free_server_data))
- {
- dbus_free (bd);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- bd->context = context;
-
- if (!dbus_server_set_auth_mechanisms (server, (const char**) auth_mechanisms))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- dbus_server_set_new_connection_function (server,
- new_connection_callback,
- context, NULL);
-
- if (!dbus_server_set_watch_functions (server,
- add_server_watch,
- remove_server_watch,
- toggle_server_watch,
- server,
- NULL))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!dbus_server_set_timeout_functions (server,
- add_server_timeout,
- remove_server_timeout,
- NULL,
- server, NULL))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
-}
-
-/* This code only gets executed the first time the
- * config files are parsed. It is not executed
- * when config files are reloaded.
- */
-static dbus_bool_t
-process_config_first_time_only (BusContext *context,
- BusConfigParser *parser,
- const DBusString *address,
- BusContextFlags flags,
- DBusError *error)
-{
- DBusString log_prefix;
- DBusList *link;
- DBusList **addresses;
- const char *user, *pidfile;
- char **auth_mechanisms;
- DBusList **auth_mechanisms_list;
- int len;
- dbus_bool_t retval;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- retval = FALSE;
- auth_mechanisms = NULL;
- pidfile = NULL;
-
- _dbus_init_system_log (TRUE);
-
- if (flags & BUS_CONTEXT_FLAG_SYSTEMD_ACTIVATION)
- context->systemd_activation = TRUE;
- else
- context->systemd_activation = FALSE;
-
- /* Check for an existing pid file. Of course this is a race;
- * we'd have to use fcntl() locks on the pid file to
- * avoid that. But we want to check for the pid file
- * before overwriting any existing sockets, etc.
- */
-
- if (flags & BUS_CONTEXT_FLAG_WRITE_PID_FILE)
- pidfile = bus_config_parser_get_pidfile (parser);
-
- if (pidfile != NULL)
- {
- DBusString u;
- DBusStat stbuf;
-
- _dbus_string_init_const (&u, pidfile);
-
- if (_dbus_stat (&u, &stbuf, NULL))
- {
-#ifdef DBUS_CYGWIN
- DBusString p;
- long /* int */ pid;
-
- _dbus_string_init (&p);
- _dbus_file_get_contents(&p, &u, NULL);
- _dbus_string_parse_int(&p, 0, &pid, NULL);
- _dbus_string_free(&p);
-
- if ((kill((int)pid, 0))) {
- dbus_set_error(NULL, DBUS_ERROR_FILE_EXISTS,
- "pid %ld not running, removing stale pid file\n",
- pid);
- _dbus_delete_file(&u, NULL);
- } else {
-#endif
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "The pid file \"%s\" exists, if the message bus is not running, remove this file",
- pidfile);
- goto failed;
-#ifdef DBUS_CYGWIN
- }
-#endif
- }
- }
-
- /* keep around the pid filename so we can delete it later */
- context->pidfile = _dbus_strdup (pidfile);
-
- /* note that type may be NULL */
- context->type = _dbus_strdup (bus_config_parser_get_type (parser));
- if (bus_config_parser_get_type (parser) != NULL && context->type == NULL)
- goto oom;
-
- user = bus_config_parser_get_user (parser);
- if (user != NULL)
- {
- context->user = _dbus_strdup (user);
- if (context->user == NULL)
- goto oom;
- }
-
- /* Set up the prefix for syslog messages */
- if (!_dbus_string_init (&log_prefix))
- goto oom;
- if (context->type && !strcmp (context->type, "system"))
- {
- if (!_dbus_string_append (&log_prefix, "[system] "))
- goto oom;
- }
- else if (context->type && !strcmp (context->type, "session"))
- {
- DBusCredentials *credentials;
-
- credentials = _dbus_credentials_new_from_current_process ();
- if (!credentials)
- goto oom;
- if (!_dbus_string_append (&log_prefix, "[session "))
- {
- _dbus_credentials_unref (credentials);
- goto oom;
- }
- if (!_dbus_credentials_to_string_append (credentials, &log_prefix))
- {
- _dbus_credentials_unref (credentials);
- goto oom;
- }
- if (!_dbus_string_append (&log_prefix, "] "))
- {
- _dbus_credentials_unref (credentials);
- goto oom;
- }
- _dbus_credentials_unref (credentials);
- }
- if (!_dbus_string_steal_data (&log_prefix, &context->log_prefix))
- goto oom;
- _dbus_string_free (&log_prefix);
-
- /* Build an array of auth mechanisms */
-
- auth_mechanisms_list = bus_config_parser_get_mechanisms (parser);
- len = _dbus_list_get_length (auth_mechanisms_list);
-
- if (len > 0)
- {
- int i;
-
- auth_mechanisms = dbus_new0 (char*, len + 1);
- if (auth_mechanisms == NULL)
- goto oom;
-
- i = 0;
- link = _dbus_list_get_first_link (auth_mechanisms_list);
- while (link != NULL)
- {
- auth_mechanisms[i] = _dbus_strdup (link->data);
- if (auth_mechanisms[i] == NULL)
- goto oom;
- link = _dbus_list_get_next_link (auth_mechanisms_list, link);
- i += 1;
- }
- }
- else
- {
- auth_mechanisms = NULL;
- }
-
- /* Listen on our addresses */
-
- if (address)
- {
- DBusServer *server;
-
- server = dbus_server_listen (_dbus_string_get_const_data(address), error);
- if (server == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
- else if (!setup_server (context, server, auth_mechanisms, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
- if (!_dbus_list_append (&context->servers, server))
- goto oom;
- }
- else
- {
- addresses = bus_config_parser_get_addresses (parser);
-
- link = _dbus_list_get_first_link (addresses);
- while (link != NULL)
- {
- DBusServer *server;
-
- server = dbus_server_listen (link->data, error);
- if (server == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
- else if (!setup_server (context, server, auth_mechanisms, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
- if (!_dbus_list_append (&context->servers, server))
- goto oom;
-
- link = _dbus_list_get_next_link (addresses, link);
- }
- }
-
- context->fork = bus_config_parser_get_fork (parser);
- context->syslog = bus_config_parser_get_syslog (parser);
- context->keep_umask = bus_config_parser_get_keep_umask (parser);
- context->allow_anonymous = bus_config_parser_get_allow_anonymous (parser);
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- retval = TRUE;
-
- failed:
- dbus_free_string_array (auth_mechanisms);
- return retval;
-
- oom:
- BUS_SET_OOM (error);
- dbus_free_string_array (auth_mechanisms);
- return FALSE;
-}
-
-/* This code gets executed every time the config files
- * are parsed: both during BusContext construction
- * and on reloads. This function is slightly screwy
- * since it can do a "half reload" in out-of-memory
- * situations. Realistically, unlikely to ever matter.
- */
-static dbus_bool_t
-process_config_every_time (BusContext *context,
- BusConfigParser *parser,
- dbus_bool_t is_reload,
- DBusError *error)
-{
- DBusString full_address;
- DBusList *link;
- DBusList **dirs;
- char *addr;
- const char *servicehelper;
- char *s;
-
- dbus_bool_t retval;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- addr = NULL;
- retval = FALSE;
-
- if (!_dbus_string_init (&full_address))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- /* get our limits and timeout lengths */
- bus_config_parser_get_limits (parser, &context->limits);
-
- if (context->policy)
- bus_policy_unref (context->policy);
- context->policy = bus_config_parser_steal_policy (parser);
- _dbus_assert (context->policy != NULL);
-
- /* We have to build the address backward, so that
- * <listen> later in the config file have priority
- */
- link = _dbus_list_get_last_link (&context->servers);
- while (link != NULL)
- {
- addr = dbus_server_get_address (link->data);
- if (addr == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (_dbus_string_get_length (&full_address) > 0)
- {
- if (!_dbus_string_append (&full_address, ";"))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
-
- if (!_dbus_string_append (&full_address, addr))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- dbus_free (addr);
- addr = NULL;
-
- link = _dbus_list_get_prev_link (&context->servers, link);
- }
-
- if (is_reload)
- dbus_free (context->address);
-
- if (!_dbus_string_copy_data (&full_address, &context->address))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- /* get the service directories */
- dirs = bus_config_parser_get_service_dirs (parser);
-
- /* and the service helper */
- servicehelper = bus_config_parser_get_servicehelper (parser);
-
- s = _dbus_strdup(servicehelper);
- if (s == NULL && servicehelper != NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- else
- {
- dbus_free(context->servicehelper);
- context->servicehelper = s;
- }
-
- /* Create activation subsystem */
- if (context->activation)
- {
- if (!bus_activation_reload (context->activation, &full_address, dirs, error))
- goto failed;
- }
- else
- {
- context->activation = bus_activation_new (context, &full_address, dirs, error);
- }
-
- if (context->activation == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- retval = TRUE;
-
- failed:
- _dbus_string_free (&full_address);
-
- if (addr)
- dbus_free (addr);
-
- return retval;
-}
-
-static dbus_bool_t
-list_concat_new (DBusList **a,
- DBusList **b,
- DBusList **result)
-{
- DBusList *link;
-
- *result = NULL;
-
- for (link = _dbus_list_get_first_link (a); link; link = _dbus_list_get_next_link (a, link))
- {
- if (!_dbus_list_append (result, link->data))
- goto oom;
- }
- for (link = _dbus_list_get_first_link (b); link; link = _dbus_list_get_next_link (b, link))
- {
- if (!_dbus_list_append (result, link->data))
- goto oom;
- }
-
- return TRUE;
-oom:
- _dbus_list_clear (result);
- return FALSE;
-}
-
-static void
-raise_file_descriptor_limit (BusContext *context)
-{
-
- /* I just picked this out of thin air; we need some extra
- * descriptors for things like any internal pipes we create,
- * inotify, connections to SELinux, etc.
- */
- unsigned int arbitrary_extra_fds = 32;
- unsigned int limit;
-
- limit = context->limits.max_completed_connections +
- context->limits.max_incomplete_connections
- + arbitrary_extra_fds;
-
- _dbus_request_file_descriptor_limit (limit);
-}
-
-static dbus_bool_t
-process_config_postinit (BusContext *context,
- BusConfigParser *parser,
- DBusError *error)
-{
- DBusHashTable *service_context_table;
- DBusList *watched_dirs = NULL;
-
- raise_file_descriptor_limit (context);
-
- service_context_table = bus_config_parser_steal_service_context_table (parser);
- if (!bus_registry_set_service_context_table (context->registry,
- service_context_table))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- _dbus_hash_table_unref (service_context_table);
-
- /* We need to monitor both the configuration directories and directories
- * containing .service files.
- */
- if (!list_concat_new (bus_config_parser_get_conf_dirs (parser),
- bus_config_parser_get_service_dirs (parser),
- &watched_dirs))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- bus_set_watched_dirs (context, &watched_dirs);
-
- _dbus_list_clear (&watched_dirs);
-
- return TRUE;
-}
-
-BusContext*
-bus_context_new (const DBusString *config_file,
- BusContextFlags flags,
- DBusPipe *print_addr_pipe,
- DBusPipe *print_pid_pipe,
- const DBusString *address,
- DBusError *error)
-{
- BusContext *context;
- BusConfigParser *parser;
-
- _dbus_assert ((flags & BUS_CONTEXT_FLAG_FORK_NEVER) == 0 ||
- (flags & BUS_CONTEXT_FLAG_FORK_ALWAYS) == 0);
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- context = NULL;
- parser = NULL;
-
- if (!dbus_server_allocate_data_slot (&server_data_slot))
- {
- BUS_SET_OOM (error);
- return NULL;
- }
-
- context = dbus_new0 (BusContext, 1);
- if (context == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- context->refcount = 1;
-
- _dbus_generate_uuid (&context->uuid);
-
- if (!_dbus_string_copy_data (config_file, &context->config_file))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- context->loop = _dbus_loop_new ();
- if (context->loop == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- context->registry = bus_registry_new (context);
- if (context->registry == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- parser = bus_config_load (config_file, TRUE, NULL, error);
- if (parser == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
- if (!process_config_first_time_only (context, parser, address, flags, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
- if (!process_config_every_time (context, parser, FALSE, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
- /* we need another ref of the server data slot for the context
- * to own
- */
- if (!dbus_server_allocate_data_slot (&server_data_slot))
- _dbus_assert_not_reached ("second ref of server data slot failed");
-
- /* Note that we don't know whether the print_addr_pipe is
- * one of the sockets we're using to listen on, or some
- * other random thing. But I think the answer is "don't do
- * that then"
- */
- if (print_addr_pipe != NULL && _dbus_pipe_is_valid (print_addr_pipe))
- {
- DBusString addr;
- const char *a = bus_context_get_address (context);
- int bytes;
-
- _dbus_assert (a != NULL);
- if (!_dbus_string_init (&addr))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (!_dbus_string_append (&addr, a) ||
- !_dbus_string_append (&addr, "\n"))
- {
- _dbus_string_free (&addr);
- BUS_SET_OOM (error);
- goto failed;
- }
-
- bytes = _dbus_string_get_length (&addr);
- if (_dbus_pipe_write (print_addr_pipe, &addr, 0, bytes, error) != bytes)
- {
- /* pipe write returns an error on failure but not short write */
- if (error != NULL && !dbus_error_is_set (error))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Printing message bus address: did not write all bytes\n");
- }
- _dbus_string_free (&addr);
- goto failed;
- }
-
- if (!_dbus_pipe_is_stdout_or_stderr (print_addr_pipe))
- _dbus_pipe_close (print_addr_pipe, NULL);
-
- _dbus_string_free (&addr);
- }
-
- context->connections = bus_connections_new (context);
- if (context->connections == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- context->matchmaker = bus_matchmaker_new ();
- if (context->matchmaker == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- /* check user before we fork */
- if (context->user != NULL)
- {
- if (!_dbus_verify_daemon_user (context->user))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Could not get UID and GID for username \"%s\"",
- context->user);
- goto failed;
- }
- }
-
- /* Now become a daemon if appropriate and write out pid file in any case */
- {
- DBusString u;
-
- if (context->pidfile)
- _dbus_string_init_const (&u, context->pidfile);
-
- if (((flags & BUS_CONTEXT_FLAG_FORK_NEVER) == 0 && context->fork) ||
- (flags & BUS_CONTEXT_FLAG_FORK_ALWAYS))
- {
- _dbus_verbose ("Forking and becoming daemon\n");
-
- if (!_dbus_become_daemon (context->pidfile ? &u : NULL,
- print_pid_pipe,
- error,
- context->keep_umask))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
- }
- else
- {
- _dbus_verbose ("Fork not requested\n");
-
- /* Need to write PID file and to PID pipe for ourselves,
- * not for the child process. This is a no-op if the pidfile
- * is NULL and print_pid_pipe is NULL.
- */
- if (!_dbus_write_pid_to_file_and_pipe (context->pidfile ? &u : NULL,
- print_pid_pipe,
- _dbus_getpid (),
- error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
- }
- }
-
- if (print_pid_pipe && _dbus_pipe_is_valid (print_pid_pipe) &&
- !_dbus_pipe_is_stdout_or_stderr (print_pid_pipe))
- _dbus_pipe_close (print_pid_pipe, NULL);
-
- if (!bus_selinux_full_init ())
- {
- bus_context_log (context, DBUS_SYSTEM_LOG_FATAL, "SELinux enabled but AVC initialization failed; check system log\n");
- }
-
- if (!process_config_postinit (context, parser, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
- if (parser != NULL)
- {
- bus_config_parser_unref (parser);
- parser = NULL;
- }
-
- /* Here we change our credentials if required,
- * as soon as we've set up our sockets and pidfile
- */
- if (context->user != NULL)
- {
- if (!_dbus_change_to_daemon_user (context->user, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
-#ifdef HAVE_SELINUX
- /* FIXME - why not just put this in full_init() below? */
- bus_selinux_audit_init ();
-#endif
- }
-
- dbus_server_free_data_slot (&server_data_slot);
-
- return context;
-
- failed:
- if (parser != NULL)
- bus_config_parser_unref (parser);
- if (context != NULL)
- bus_context_unref (context);
-
- if (server_data_slot >= 0)
- dbus_server_free_data_slot (&server_data_slot);
-
- return NULL;
-}
-
-dbus_bool_t
-bus_context_get_id (BusContext *context,
- DBusString *uuid)
-{
- return _dbus_uuid_encode (&context->uuid, uuid);
-}
-
-dbus_bool_t
-bus_context_reload_config (BusContext *context,
- DBusError *error)
-{
- BusConfigParser *parser;
- DBusString config_file;
- dbus_bool_t ret;
-
- /* Flush the user database cache */
- _dbus_flush_caches ();
-
- ret = FALSE;
- _dbus_string_init_const (&config_file, context->config_file);
- parser = bus_config_load (&config_file, TRUE, NULL, error);
- if (parser == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
-
- if (!process_config_every_time (context, parser, TRUE, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
- if (!process_config_postinit (context, parser, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto failed;
- }
- ret = TRUE;
-
- bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Reloaded configuration");
- failed:
- if (!ret)
- bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Unable to reload configuration: %s", error->message);
- if (parser != NULL)
- bus_config_parser_unref (parser);
- return ret;
-}
-
-static void
-shutdown_server (BusContext *context,
- DBusServer *server)
-{
- if (server == NULL ||
- !dbus_server_get_is_connected (server))
- return;
-
- if (!dbus_server_set_watch_functions (server,
- NULL, NULL, NULL,
- context,
- NULL))
- _dbus_assert_not_reached ("setting watch functions to NULL failed");
-
- if (!dbus_server_set_timeout_functions (server,
- NULL, NULL, NULL,
- context,
- NULL))
- _dbus_assert_not_reached ("setting timeout functions to NULL failed");
-
- dbus_server_disconnect (server);
-}
-
-void
-bus_context_shutdown (BusContext *context)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (&context->servers);
- while (link != NULL)
- {
- shutdown_server (context, link->data);
-
- link = _dbus_list_get_next_link (&context->servers, link);
- }
-}
-
-BusContext *
-bus_context_ref (BusContext *context)
-{
- _dbus_assert (context->refcount > 0);
- context->refcount += 1;
-
- return context;
-}
-
-void
-bus_context_unref (BusContext *context)
-{
- _dbus_assert (context->refcount > 0);
- context->refcount -= 1;
-
- if (context->refcount == 0)
- {
- DBusList *link;
-
- _dbus_verbose ("Finalizing bus context %p\n", context);
-
- bus_context_shutdown (context);
-
- if (context->connections)
- {
- bus_connections_unref (context->connections);
- context->connections = NULL;
- }
-
- if (context->registry)
- {
- bus_registry_unref (context->registry);
- context->registry = NULL;
- }
-
- if (context->activation)
- {
- bus_activation_unref (context->activation);
- context->activation = NULL;
- }
-
- link = _dbus_list_get_first_link (&context->servers);
- while (link != NULL)
- {
- dbus_server_unref (link->data);
-
- link = _dbus_list_get_next_link (&context->servers, link);
- }
- _dbus_list_clear (&context->servers);
-
- if (context->policy)
- {
- bus_policy_unref (context->policy);
- context->policy = NULL;
- }
-
- if (context->loop)
- {
- _dbus_loop_unref (context->loop);
- context->loop = NULL;
- }
-
- if (context->matchmaker)
- {
- bus_matchmaker_unref (context->matchmaker);
- context->matchmaker = NULL;
- }
-
- dbus_free (context->config_file);
- dbus_free (context->log_prefix);
- dbus_free (context->type);
- dbus_free (context->address);
- dbus_free (context->user);
- dbus_free (context->servicehelper);
-
- if (context->pidfile)
- {
- DBusString u;
- _dbus_string_init_const (&u, context->pidfile);
-
- /* Deliberately ignore errors here, since there's not much
- * we can do about it, and we're exiting anyways.
- */
- _dbus_delete_file (&u, NULL);
-
- dbus_free (context->pidfile);
- }
- dbus_free (context);
-
- dbus_server_free_data_slot (&server_data_slot);
- }
-}
-
-/* type may be NULL */
-const char*
-bus_context_get_type (BusContext *context)
-{
- return context->type;
-}
-
-const char*
-bus_context_get_address (BusContext *context)
-{
- return context->address;
-}
-
-const char*
-bus_context_get_servicehelper (BusContext *context)
-{
- return context->servicehelper;
-}
-
-dbus_bool_t
-bus_context_get_systemd_activation (BusContext *context)
-{
- return context->systemd_activation;
-}
-
-BusRegistry*
-bus_context_get_registry (BusContext *context)
-{
- return context->registry;
-}
-
-BusConnections*
-bus_context_get_connections (BusContext *context)
-{
- return context->connections;
-}
-
-BusActivation*
-bus_context_get_activation (BusContext *context)
-{
- return context->activation;
-}
-
-BusMatchmaker*
-bus_context_get_matchmaker (BusContext *context)
-{
- return context->matchmaker;
-}
-
-DBusLoop*
-bus_context_get_loop (BusContext *context)
-{
- return context->loop;
-}
-
-dbus_bool_t
-bus_context_allow_unix_user (BusContext *context,
- unsigned long uid)
-{
- return bus_policy_allow_unix_user (context->policy,
- uid);
-}
-
-/* For now this is never actually called because the default
- * DBusConnection behavior of 'same user that owns the bus can connect'
- * is all it would do.
- */
-dbus_bool_t
-bus_context_allow_windows_user (BusContext *context,
- const char *windows_sid)
-{
- return bus_policy_allow_windows_user (context->policy,
- windows_sid);
-}
-
-BusPolicy *
-bus_context_get_policy (BusContext *context)
-{
- return context->policy;
-}
-
-BusClientPolicy*
-bus_context_create_client_policy (BusContext *context,
- DBusConnection *connection,
- DBusError *error)
-{
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- return bus_policy_create_client_policy (context->policy, connection,
- error);
-}
-
-int
-bus_context_get_activation_timeout (BusContext *context)
-{
-
- return context->limits.activation_timeout;
-}
-
-int
-bus_context_get_auth_timeout (BusContext *context)
-{
- return context->limits.auth_timeout;
-}
-
-int
-bus_context_get_max_completed_connections (BusContext *context)
-{
- return context->limits.max_completed_connections;
-}
-
-int
-bus_context_get_max_incomplete_connections (BusContext *context)
-{
- return context->limits.max_incomplete_connections;
-}
-
-int
-bus_context_get_max_connections_per_user (BusContext *context)
-{
- return context->limits.max_connections_per_user;
-}
-
-int
-bus_context_get_max_pending_activations (BusContext *context)
-{
- return context->limits.max_pending_activations;
-}
-
-int
-bus_context_get_max_services_per_connection (BusContext *context)
-{
- return context->limits.max_services_per_connection;
-}
-
-int
-bus_context_get_max_match_rules_per_connection (BusContext *context)
-{
- return context->limits.max_match_rules_per_connection;
-}
-
-int
-bus_context_get_max_replies_per_connection (BusContext *context)
-{
- return context->limits.max_replies_per_connection;
-}
-
-int
-bus_context_get_reply_timeout (BusContext *context)
-{
- return context->limits.reply_timeout;
-}
-
-void
-bus_context_log (BusContext *context, DBusSystemLogSeverity severity, const char *msg, ...) _DBUS_GNUC_PRINTF (3, 4);
-
-void
-bus_context_log (BusContext *context, DBusSystemLogSeverity severity, const char *msg, ...)
-{
- va_list args;
-
- if (!context->syslog)
- {
- /* we're not syslogging; just output to stderr */
- va_start (args, msg);
- vfprintf (stderr, msg, args);
- fprintf (stderr, "\n");
- va_end (args);
- return;
- }
-
- va_start (args, msg);
-
- if (context->log_prefix)
- {
- DBusString full_msg;
-
- if (!_dbus_string_init (&full_msg))
- goto out;
- if (!_dbus_string_append (&full_msg, context->log_prefix))
- goto oom_out;
- if (!_dbus_string_append_printf_valist (&full_msg, msg, args))
- goto oom_out;
-
- _dbus_system_log (severity, "%s", _dbus_string_get_const_data (&full_msg));
- oom_out:
- _dbus_string_free (&full_msg);
- }
- else
- _dbus_system_logv (severity, msg, args);
-
-out:
- va_end (args);
-}
-
-static inline const char *
-nonnull (const char *maybe_null,
- const char *if_null)
-{
- return (maybe_null ? maybe_null : if_null);
-}
-
-/*
- * Log something about a message, usually that it was rejected.
- */
-static void
-complain_about_message (BusContext *context,
- const char *error_name,
- const char *complaint,
- int matched_rules,
- DBusMessage *message,
- DBusConnection *sender,
- DBusConnection *proposed_recipient,
- dbus_bool_t requested_reply,
- dbus_bool_t log,
- DBusError *error)
-{
- DBusError stack_error = DBUS_ERROR_INIT;
- const char *sender_name;
- const char *sender_loginfo;
- const char *proposed_recipient_loginfo;
-
- if (error == NULL && !log)
- return;
-
- if (sender != NULL)
- {
- sender_name = bus_connection_get_name (sender);
- sender_loginfo = bus_connection_get_loginfo (sender);
- }
- else
- {
- sender_name = "(unset)";
- sender_loginfo = "(bus)";
- }
-
- if (proposed_recipient != NULL)
- proposed_recipient_loginfo = bus_connection_get_loginfo (proposed_recipient);
- else
- proposed_recipient_loginfo = "bus";
-
- dbus_set_error (&stack_error, error_name,
- "%s, %d matched rules; type=\"%s\", sender=\"%s\" (%s) "
- "interface=\"%s\" member=\"%s\" error name=\"%s\" "
- "requested_reply=\"%d\" destination=\"%s\" (%s)",
- complaint,
- matched_rules,
- dbus_message_type_to_string (dbus_message_get_type (message)),
- sender_name,
- sender_loginfo,
- nonnull (dbus_message_get_interface (message), "(unset)"),
- nonnull (dbus_message_get_member (message), "(unset)"),
- nonnull (dbus_message_get_error_name (message), "(unset)"),
- requested_reply,
- nonnull (dbus_message_get_destination (message), DBUS_SERVICE_DBUS),
- proposed_recipient_loginfo);
-
- /* If we hit OOM while setting the error, this will syslog "out of memory"
- * which is itself an indication that something is seriously wrong */
- if (log)
- bus_context_log (context, DBUS_SYSTEM_LOG_SECURITY, "%s",
- stack_error.message);
-
- dbus_move_error (&stack_error, error);
-}
-
-/*
- * addressed_recipient is the recipient specified in the message.
- *
- * proposed_recipient is the recipient we're considering sending
- * to right this second, and may be an eavesdropper.
- *
- * sender is the sender of the message.
- *
- * NULL for proposed_recipient or sender definitely means the bus driver.
- *
- * NULL for addressed_recipient may mean the bus driver, or may mean
- * no destination was specified in the message (e.g. a signal).
- */
-dbus_bool_t
-bus_context_check_security_policy (BusContext *context,
- BusTransaction *transaction,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusConnection *proposed_recipient,
- DBusMessage *message,
- DBusError *error)
-{
- const char *dest;
- BusClientPolicy *sender_policy;
- BusClientPolicy *recipient_policy;
- dbus_int32_t toggles;
- dbus_bool_t log;
- int type;
- dbus_bool_t requested_reply;
-
- type = dbus_message_get_type (message);
- dest = dbus_message_get_destination (message);
-
- /* dispatch.c was supposed to ensure these invariants */
- _dbus_assert (dest != NULL ||
- type == DBUS_MESSAGE_TYPE_SIGNAL ||
- (sender == NULL && !bus_connection_is_active (proposed_recipient)));
- _dbus_assert (type == DBUS_MESSAGE_TYPE_SIGNAL ||
- addressed_recipient != NULL ||
- strcmp (dest, DBUS_SERVICE_DBUS) == 0);
-
- switch (type)
- {
- case DBUS_MESSAGE_TYPE_METHOD_CALL:
- case DBUS_MESSAGE_TYPE_SIGNAL:
- case DBUS_MESSAGE_TYPE_METHOD_RETURN:
- case DBUS_MESSAGE_TYPE_ERROR:
- break;
-
- default:
- _dbus_verbose ("security check disallowing message of unknown type %d\n",
- type);
-
- dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
- "Message bus will not accept messages of unknown type\n");
-
- return FALSE;
- }
-
- requested_reply = FALSE;
-
- if (sender != NULL)
- {
- /* First verify the SELinux access controls. If allowed then
- * go on with the standard checks.
- */
- if (!bus_selinux_allows_send (sender, proposed_recipient,
- dbus_message_type_to_string (dbus_message_get_type (message)),
- dbus_message_get_interface (message),
- dbus_message_get_member (message),
- dbus_message_get_error_name (message),
- dest ? dest : DBUS_SERVICE_DBUS, error))
- {
- if (error != NULL && !dbus_error_is_set (error))
- {
- /* don't syslog this, just set the error: avc_has_perm should
- * have already written to either the audit log or syslog */
- complain_about_message (context, DBUS_ERROR_ACCESS_DENIED,
- "An SELinux policy prevents this sender from sending this "
- "message to this recipient",
- 0, message, sender, proposed_recipient, FALSE, FALSE, error);
- _dbus_verbose ("SELinux security check denying send to service\n");
- }
-
- return FALSE;
- }
-
- if (bus_connection_is_active (sender))
- {
- sender_policy = bus_connection_get_policy (sender);
- _dbus_assert (sender_policy != NULL);
-
- /* Fill in requested_reply variable with TRUE if this is a
- * reply and the reply was pending.
- */
- if (dbus_message_get_reply_serial (message) != 0)
- {
- if (proposed_recipient != NULL /* not to the bus driver */ &&
- addressed_recipient == proposed_recipient /* not eavesdropping */)
- {
- DBusError error2;
-
- dbus_error_init (&error2);
- requested_reply = bus_connections_check_reply (bus_connection_get_connections (sender),
- transaction,
- sender, addressed_recipient, message,
- &error2);
- if (dbus_error_is_set (&error2))
- {
- dbus_move_error (&error2, error);
- return FALSE;
- }
- }
- }
- }
- else
- {
- /* Policy for inactive connections is that they can only send
- * the hello message to the bus driver
- */
- if (proposed_recipient == NULL &&
- dbus_message_is_method_call (message,
- DBUS_INTERFACE_DBUS,
- "Hello"))
- {
- _dbus_verbose ("security check allowing %s message\n",
- "Hello");
- return TRUE;
- }
- else
- {
- _dbus_verbose ("security check disallowing non-%s message\n",
- "Hello");
-
- dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
- "Client tried to send a message other than %s without being registered",
- "Hello");
-
- return FALSE;
- }
- }
- }
- else
- {
- sender_policy = NULL;
-
- /* If the sender is the bus driver, we assume any reply was a
- * requested reply as bus driver won't send bogus ones
- */
- if (addressed_recipient == proposed_recipient /* not eavesdropping */ &&
- dbus_message_get_reply_serial (message) != 0)
- requested_reply = TRUE;
- }
-
- _dbus_assert ((sender != NULL && sender_policy != NULL) ||
- (sender == NULL && sender_policy == NULL));
-
- if (proposed_recipient != NULL)
- {
- /* only the bus driver can send to an inactive recipient (as it
- * owns no services, so other apps can't address it). Inactive
- * recipients can receive any message.
- */
- if (bus_connection_is_active (proposed_recipient))
- {
- recipient_policy = bus_connection_get_policy (proposed_recipient);
- _dbus_assert (recipient_policy != NULL);
- }
- else if (sender == NULL)
- {
- _dbus_verbose ("security check using NULL recipient policy for message from bus\n");
- recipient_policy = NULL;
- }
- else
- {
- _dbus_assert_not_reached ("a message was somehow sent to an inactive recipient from a source other than the message bus\n");
- recipient_policy = NULL;
- }
- }
- else
- recipient_policy = NULL;
-
- _dbus_assert ((proposed_recipient != NULL && recipient_policy != NULL) ||
- (proposed_recipient != NULL && sender == NULL && recipient_policy == NULL) ||
- (proposed_recipient == NULL && recipient_policy == NULL));
-
- log = FALSE;
- if (sender_policy &&
- !bus_client_policy_check_can_send (sender_policy,
- context->registry,
- requested_reply,
- proposed_recipient,
- message, &toggles, &log))
- {
- complain_about_message (context, DBUS_ERROR_ACCESS_DENIED,
- "Rejected send message", toggles,
- message, sender, proposed_recipient, requested_reply,
- (addressed_recipient == proposed_recipient), error);
- _dbus_verbose ("security policy disallowing message due to sender policy\n");
- return FALSE;
- }
-
- if (log)
- {
- /* We want to drop this message, and are only not doing so for backwards
- * compatibility. */
- complain_about_message (context, DBUS_ERROR_ACCESS_DENIED,
- "Would reject message", toggles,
- message, sender, proposed_recipient, requested_reply,
- TRUE, NULL);
- }
-
- if (recipient_policy &&
- !bus_client_policy_check_can_receive (recipient_policy,
- context->registry,
- requested_reply,
- sender,
- addressed_recipient, proposed_recipient,
- message, &toggles))
- {
- complain_about_message (context, DBUS_ERROR_ACCESS_DENIED,
- "Rejected receive message", toggles,
- message, sender, proposed_recipient, requested_reply,
- (addressed_recipient == proposed_recipient), NULL);
- _dbus_verbose ("security policy disallowing message due to recipient policy\n");
- return FALSE;
- }
-
- /* See if limits on size have been exceeded */
- if (proposed_recipient &&
- ((dbus_connection_get_outgoing_size (proposed_recipient) > context->limits.max_outgoing_bytes) ||
- (dbus_connection_get_outgoing_unix_fds (proposed_recipient) > context->limits.max_outgoing_unix_fds)))
- {
- complain_about_message (context, DBUS_ERROR_LIMITS_EXCEEDED,
- "Rejected: destination has a full message queue",
- 0, message, sender, proposed_recipient, requested_reply, TRUE,
- error);
- _dbus_verbose ("security policy disallowing message due to full message queue\n");
- return FALSE;
- }
-
- /* Record that we will allow a reply here in the future (don't
- * bother if the recipient is the bus or this is an eavesdropping
- * connection). Only the addressed recipient may reply.
- */
- if (type == DBUS_MESSAGE_TYPE_METHOD_CALL &&
- sender &&
- addressed_recipient &&
- addressed_recipient == proposed_recipient && /* not eavesdropping */
- !bus_connections_expect_reply (bus_connection_get_connections (sender),
- transaction,
- sender, addressed_recipient,
- message, error))
- {
- _dbus_verbose ("Failed to record reply expectation or problem with the message expecting a reply\n");
- return FALSE;
- }
-
- _dbus_verbose ("security policy allowing message\n");
- return TRUE;
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/bus.h b/src/3rd_party/dbus-1.7.8/bus/bus.h
deleted file mode 100644
index 3597884193..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/bus.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* bus.h message bus context object
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_BUS_H
-#define BUS_BUS_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-mainloop.h>
-#include <dbus/dbus-pipe.h>
-#include <dbus/dbus-sysdeps.h>
-
-typedef struct BusActivation BusActivation;
-typedef struct BusConnections BusConnections;
-typedef struct BusContext BusContext;
-typedef struct BusPolicy BusPolicy;
-typedef struct BusClientPolicy BusClientPolicy;
-typedef struct BusPolicyRule BusPolicyRule;
-typedef struct BusRegistry BusRegistry;
-typedef struct BusSELinuxID BusSELinuxID;
-typedef struct BusService BusService;
-typedef struct BusOwner BusOwner;
-typedef struct BusTransaction BusTransaction;
-typedef struct BusMatchmaker BusMatchmaker;
-typedef struct BusMatchRule BusMatchRule;
-
-typedef struct
-{
- long max_incoming_bytes; /**< How many incoming message bytes for a single connection */
- long max_incoming_unix_fds; /**< How many incoming message unix fds for a single connection */
- long max_outgoing_bytes; /**< How many outgoing bytes can be queued for a single connection */
- long max_outgoing_unix_fds; /**< How many outgoing unix fds can be queued for a single connection */
- long max_message_size; /**< Max size of a single message in bytes */
- long max_message_unix_fds; /**< Max number of unix fds of a single message*/
- int activation_timeout; /**< How long to wait for an activation to time out */
- int auth_timeout; /**< How long to wait for an authentication to time out */
- int max_completed_connections; /**< Max number of authorized connections */
- int max_incomplete_connections; /**< Max number of incomplete connections */
- int max_connections_per_user; /**< Max number of connections auth'd as same user */
- int max_pending_activations; /**< Max number of pending activations for the entire bus */
- int max_services_per_connection; /**< Max number of owned services for a single connection */
- int max_match_rules_per_connection; /**< Max number of match rules for a single connection */
- int max_replies_per_connection; /**< Max number of replies that can be pending for each connection */
- int reply_timeout; /**< How long to wait before timing out a reply */
-} BusLimits;
-
-typedef enum
-{
- BUS_CONTEXT_FLAG_NONE = 0,
- BUS_CONTEXT_FLAG_FORK_ALWAYS = (1 << 1),
- BUS_CONTEXT_FLAG_FORK_NEVER = (1 << 2),
- BUS_CONTEXT_FLAG_WRITE_PID_FILE = (1 << 3),
- BUS_CONTEXT_FLAG_SYSTEMD_ACTIVATION = (1 << 4)
-} BusContextFlags;
-
-BusContext* bus_context_new (const DBusString *config_file,
- BusContextFlags flags,
- DBusPipe *print_addr_pipe,
- DBusPipe *print_pid_pipe,
- const DBusString *address,
- DBusError *error);
-dbus_bool_t bus_context_reload_config (BusContext *context,
- DBusError *error);
-void bus_context_shutdown (BusContext *context);
-BusContext* bus_context_ref (BusContext *context);
-void bus_context_unref (BusContext *context);
-dbus_bool_t bus_context_get_id (BusContext *context,
- DBusString *uuid);
-const char* bus_context_get_type (BusContext *context);
-const char* bus_context_get_address (BusContext *context);
-const char* bus_context_get_servicehelper (BusContext *context);
-dbus_bool_t bus_context_get_systemd_activation (BusContext *context);
-BusRegistry* bus_context_get_registry (BusContext *context);
-BusConnections* bus_context_get_connections (BusContext *context);
-BusActivation* bus_context_get_activation (BusContext *context);
-BusMatchmaker* bus_context_get_matchmaker (BusContext *context);
-DBusLoop* bus_context_get_loop (BusContext *context);
-dbus_bool_t bus_context_allow_unix_user (BusContext *context,
- unsigned long uid);
-dbus_bool_t bus_context_allow_windows_user (BusContext *context,
- const char *windows_sid);
-BusPolicy* bus_context_get_policy (BusContext *context);
-
-BusClientPolicy* bus_context_create_client_policy (BusContext *context,
- DBusConnection *connection,
- DBusError *error);
-int bus_context_get_activation_timeout (BusContext *context);
-int bus_context_get_auth_timeout (BusContext *context);
-int bus_context_get_max_completed_connections (BusContext *context);
-int bus_context_get_max_incomplete_connections (BusContext *context);
-int bus_context_get_max_connections_per_user (BusContext *context);
-int bus_context_get_max_pending_activations (BusContext *context);
-int bus_context_get_max_services_per_connection (BusContext *context);
-int bus_context_get_max_match_rules_per_connection (BusContext *context);
-int bus_context_get_max_replies_per_connection (BusContext *context);
-int bus_context_get_reply_timeout (BusContext *context);
-void bus_context_log (BusContext *context,
- DBusSystemLogSeverity severity,
- const char *msg,
- ...);
-dbus_bool_t bus_context_check_security_policy (BusContext *context,
- BusTransaction *transaction,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusConnection *proposed_recipient,
- DBusMessage *message,
- DBusError *error);
-
-#endif /* BUS_BUS_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/config-loader-expat.c b/src/3rd_party/dbus-1.7.8/bus/config-loader-expat.c
deleted file mode 100644
index b571fda318..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/config-loader-expat.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* config-loader-expat.c expat XML loader
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "config-parser.h"
-#include <dbus/dbus-internals.h>
-#include <expat.h>
-
-static XML_Memory_Handling_Suite memsuite;
-
-typedef struct
-{
- BusConfigParser *parser;
- const char *filename;
- DBusString content;
- DBusError *error;
- dbus_bool_t failed;
-} ExpatParseContext;
-
-static dbus_bool_t
-process_content (ExpatParseContext *context)
-{
- if (context->failed)
- return FALSE;
-
- if (_dbus_string_get_length (&context->content) > 0)
- {
- if (!bus_config_parser_content (context->parser,
- &context->content,
- context->error))
- {
- context->failed = TRUE;
- return FALSE;
- }
- _dbus_string_set_length (&context->content, 0);
- }
-
- return TRUE;
-}
-
-static void
-expat_StartElementHandler (void *userData,
- const XML_Char *name,
- const XML_Char **atts)
-{
- ExpatParseContext *context = userData;
- int i;
- char **names;
- char **values;
-
- /* Expat seems to suck and can't abort the parse if we
- * throw an error. Expat 2.0 is supposed to fix this.
- */
- if (context->failed)
- return;
-
- if (!process_content (context))
- return;
-
- /* "atts" is key, value, key, value, NULL */
- for (i = 0; atts[i] != NULL; ++i)
- ; /* nothing */
-
- _dbus_assert (i % 2 == 0);
- names = dbus_new0 (char *, i / 2 + 1);
- values = dbus_new0 (char *, i / 2 + 1);
-
- if (names == NULL || values == NULL)
- {
- dbus_set_error (context->error, DBUS_ERROR_NO_MEMORY, NULL);
- context->failed = TRUE;
- dbus_free (names);
- dbus_free (values);
- return;
- }
-
- i = 0;
- while (atts[i] != NULL)
- {
- _dbus_assert (i % 2 == 0);
- names [i / 2] = (char*) atts[i];
- values[i / 2] = (char*) atts[i+1];
-
- i += 2;
- }
-
- if (!bus_config_parser_start_element (context->parser,
- name,
- (const char **) names,
- (const char **) values,
- context->error))
- {
- dbus_free (names);
- dbus_free (values);
- context->failed = TRUE;
- return;
- }
-
- dbus_free (names);
- dbus_free (values);
-}
-
-static void
-expat_EndElementHandler (void *userData,
- const XML_Char *name)
-{
- ExpatParseContext *context = userData;
-
- if (!process_content (context))
- return;
-
- if (!bus_config_parser_end_element (context->parser,
- name,
- context->error))
- {
- context->failed = TRUE;
- return;
- }
-}
-
-/* s is not 0 terminated. */
-static void
-expat_CharacterDataHandler (void *userData,
- const XML_Char *s,
- int len)
-{
- ExpatParseContext *context = userData;
- if (context->failed)
- return;
-
- if (!_dbus_string_append_len (&context->content,
- s, len))
- {
- dbus_set_error (context->error, DBUS_ERROR_NO_MEMORY, NULL);
- context->failed = TRUE;
- return;
- }
-}
-
-
-BusConfigParser*
-bus_config_load (const DBusString *file,
- dbus_bool_t is_toplevel,
- const BusConfigParser *parent,
- DBusError *error)
-{
- XML_Parser expat;
- const char *filename;
- BusConfigParser *parser;
- ExpatParseContext context;
- DBusString dirname;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- parser = NULL;
- expat = NULL;
- context.error = error;
- context.failed = FALSE;
-
- filename = _dbus_string_get_const_data (file);
-
- if (!_dbus_string_init (&context.content))
- {
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- return NULL;
- }
-
- if (!_dbus_string_init (&dirname))
- {
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- _dbus_string_free (&context.content);
- return NULL;
- }
-
- memsuite.malloc_fcn = dbus_malloc;
- memsuite.realloc_fcn = dbus_realloc;
- memsuite.free_fcn = dbus_free;
-
- expat = XML_ParserCreate_MM ("UTF-8", &memsuite, NULL);
- if (expat == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- goto failed;
- }
-
- if (!_dbus_string_get_dirname (file, &dirname))
- {
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- goto failed;
- }
-
- parser = bus_config_parser_new (&dirname, is_toplevel, parent);
- if (parser == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- goto failed;
- }
- context.parser = parser;
-
- XML_SetUserData (expat, &context);
- XML_SetElementHandler (expat,
- expat_StartElementHandler,
- expat_EndElementHandler);
- XML_SetCharacterDataHandler (expat,
- expat_CharacterDataHandler);
-
- {
- DBusString data;
- const char *data_str;
-
- if (!_dbus_string_init (&data))
- {
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- goto failed;
- }
-
- if (!_dbus_file_get_contents (&data, file, error))
- {
- _dbus_string_free (&data);
- goto failed;
- }
-
- data_str = _dbus_string_get_const_data (&data);
-
- if (!XML_Parse (expat, data_str, _dbus_string_get_length (&data), TRUE))
- {
- if (context.error != NULL &&
- !dbus_error_is_set (context.error))
- {
- enum XML_Error e;
-
- e = XML_GetErrorCode (expat);
- if (e == XML_ERROR_NO_MEMORY)
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- else
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Error in file %s, line %d, column %d: %s\n",
- filename,
- XML_GetCurrentLineNumber (expat),
- XML_GetCurrentColumnNumber (expat),
- XML_ErrorString (e));
- }
-
- _dbus_string_free (&data);
- goto failed;
- }
-
- _dbus_string_free (&data);
-
- if (context.failed)
- goto failed;
- }
-
- if (!bus_config_parser_finished (parser, error))
- goto failed;
-
- _dbus_string_free (&dirname);
- _dbus_string_free (&context.content);
- XML_ParserFree (expat);
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- return parser;
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
-
- _dbus_string_free (&dirname);
- _dbus_string_free (&context.content);
- if (expat)
- XML_ParserFree (expat);
- if (parser)
- bus_config_parser_unref (parser);
- return NULL;
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/config-parser-common.c b/src/3rd_party/dbus-1.7.8/bus/config-parser-common.c
deleted file mode 100644
index c522ff49f7..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/config-parser-common.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* config-parser-common.c Common defines and routines for config file parsing
- *
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include <dbus/dbus-internals.h>
-#include <string.h>
-
-#include "config-parser-common.h"
-#include "utils.h"
-
-ElementType
-bus_config_parser_element_name_to_type (const char *name)
-{
- if (strcmp (name, "none") == 0)
- {
- return ELEMENT_NONE;
- }
- else if (strcmp (name, "busconfig") == 0)
- {
- return ELEMENT_BUSCONFIG;
- }
- else if (strcmp (name, "user") == 0)
- {
- return ELEMENT_USER;
- }
- else if (strcmp (name, "auth") == 0)
- {
- return ELEMENT_AUTH;
- }
- else if (strcmp (name, "type") == 0)
- {
- return ELEMENT_CONFIGTYPE;
- }
- else if (strcmp (name, "fork") == 0)
- {
- return ELEMENT_FORK;
- }
- else if (strcmp (name, "pidfile") == 0)
- {
- return ELEMENT_PIDFILE;
- }
- else if (strcmp (name, "listen") == 0)
- {
- return ELEMENT_LISTEN;
- }
- else if (strcmp (name, "auth") == 0)
- {
- return ELEMENT_AUTH;
- }
- else if (strcmp (name, "allow") == 0)
- {
- return ELEMENT_ALLOW;
- }
- else if (strcmp (name, "deny") == 0)
- {
- return ELEMENT_DENY;
- }
- else if (strcmp (name, "servicehelper") == 0)
- {
- return ELEMENT_SERVICEHELPER;
- }
- else if (strcmp (name, "includedir") == 0)
- {
- return ELEMENT_INCLUDEDIR;
- }
- else if (strcmp (name, "standard_session_servicedirs") == 0)
- {
- return ELEMENT_STANDARD_SESSION_SERVICEDIRS;
- }
- else if (strcmp (name, "standard_system_servicedirs") == 0)
- {
- return ELEMENT_STANDARD_SYSTEM_SERVICEDIRS;
- }
- else if (strcmp (name, "servicedir") == 0)
- {
- return ELEMENT_SERVICEDIR;
- }
- else if (strcmp (name, "include") == 0)
- {
- return ELEMENT_INCLUDE;
- }
- else if (strcmp (name, "policy") == 0)
- {
- return ELEMENT_POLICY;
- }
- else if (strcmp (name, "limit") == 0)
- {
- return ELEMENT_LIMIT;
- }
- else if (strcmp (name, "selinux") == 0)
- {
- return ELEMENT_SELINUX;
- }
- else if (strcmp (name, "associate") == 0)
- {
- return ELEMENT_ASSOCIATE;
- }
- else if (strcmp (name, "syslog") == 0)
- {
- return ELEMENT_SYSLOG;
- }
- else if (strcmp (name, "keep_umask") == 0)
- {
- return ELEMENT_KEEP_UMASK;
- }
- else if (strcmp (name, "allow_anonymous") == 0)
- {
- return ELEMENT_ALLOW_ANONYMOUS;
- }
- return ELEMENT_NONE;
-}
-
-const char*
-bus_config_parser_element_type_to_name (ElementType type)
-{
- switch (type)
- {
- case ELEMENT_NONE:
- return NULL;
- case ELEMENT_BUSCONFIG:
- return "busconfig";
- case ELEMENT_INCLUDE:
- return "include";
- case ELEMENT_USER:
- return "user";
- case ELEMENT_LISTEN:
- return "listen";
- case ELEMENT_AUTH:
- return "auth";
- case ELEMENT_POLICY:
- return "policy";
- case ELEMENT_LIMIT:
- return "limit";
- case ELEMENT_ALLOW:
- return "allow";
- case ELEMENT_DENY:
- return "deny";
- case ELEMENT_FORK:
- return "fork";
- case ELEMENT_PIDFILE:
- return "pidfile";
- case ELEMENT_STANDARD_SESSION_SERVICEDIRS:
- return "standard_session_servicedirs";
- case ELEMENT_STANDARD_SYSTEM_SERVICEDIRS:
- return "standard_system_servicedirs";
- case ELEMENT_SERVICEDIR:
- return "servicedir";
- case ELEMENT_SERVICEHELPER:
- return "servicehelper";
- case ELEMENT_INCLUDEDIR:
- return "includedir";
- case ELEMENT_CONFIGTYPE:
- return "type";
- case ELEMENT_SELINUX:
- return "selinux";
- case ELEMENT_ASSOCIATE:
- return "associate";
- case ELEMENT_SYSLOG:
- return "syslog";
- case ELEMENT_KEEP_UMASK:
- return "keep_umask";
- case ELEMENT_ALLOW_ANONYMOUS:
- return "allow_anonymous";
- }
-
- _dbus_assert_not_reached ("bad element type");
-
- return NULL;
-}
-
diff --git a/src/3rd_party/dbus-1.7.8/bus/config-parser-common.h b/src/3rd_party/dbus-1.7.8/bus/config-parser-common.h
deleted file mode 100644
index 186bf4cf74..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/config-parser-common.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* config-parser-common.h Common defines and routines for config file parsing
- *
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_CONFIG_PARSER_COMMON_H
-#define BUS_CONFIG_PARSER_COMMON_H
-
-typedef enum
-{
- ELEMENT_NONE,
- ELEMENT_BUSCONFIG,
- ELEMENT_INCLUDE,
- ELEMENT_USER,
- ELEMENT_LISTEN,
- ELEMENT_AUTH,
- ELEMENT_POLICY,
- ELEMENT_LIMIT,
- ELEMENT_ALLOW,
- ELEMENT_DENY,
- ELEMENT_FORK,
- ELEMENT_PIDFILE,
- ELEMENT_SERVICEDIR,
- ELEMENT_SERVICEHELPER,
- ELEMENT_INCLUDEDIR,
- /* this is really <type>, but winioctl.h defines ELEMENT_TYPE */
- ELEMENT_CONFIGTYPE,
- ELEMENT_SELINUX,
- ELEMENT_ASSOCIATE,
- ELEMENT_STANDARD_SESSION_SERVICEDIRS,
- ELEMENT_STANDARD_SYSTEM_SERVICEDIRS,
- ELEMENT_KEEP_UMASK,
- ELEMENT_SYSLOG,
- ELEMENT_ALLOW_ANONYMOUS
-} ElementType;
-
-ElementType bus_config_parser_element_name_to_type (const char *element_name);
-const char* bus_config_parser_element_type_to_name (ElementType type);
-
-#endif /* BUS_CONFIG_PARSER_COMMON_H */
-
diff --git a/src/3rd_party/dbus-1.7.8/bus/config-parser-trivial.c b/src/3rd_party/dbus-1.7.8/bus/config-parser-trivial.c
deleted file mode 100644
index 64a05c3a76..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/config-parser-trivial.c
+++ /dev/null
@@ -1,716 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* config-parser-trivial.c XML-library-agnostic configuration file parser
- * Does not do includes or anything remotely complicated.
- *
- * Copyright (C) 2003, 2004, 2007 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "config-parser-common.h"
-#include "config-parser-trivial.h"
-#include "utils.h"
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-internals.h>
-#include <string.h>
-
-/**
- * TRIVIAL parser for bus configuration file.
- */
-struct BusConfigParser
-{
- ElementType type;
- DBusString user; /**< User the dbus-daemon runs as */
- DBusString bus_type; /**< Message bus type */
- DBusString service_helper; /**< Location of the setuid helper */
- DBusList *service_dirs; /**< Directories to look for services in */
-};
-
-static dbus_bool_t
-service_dirs_find_dir (DBusList **service_dirs,
- const char *dir)
-{
- DBusList *link;
-
- _dbus_assert (dir != NULL);
-
- for (link = *service_dirs; link; link = _dbus_list_get_next_link(service_dirs, link))
- {
- const char *link_dir;
-
- link_dir = (const char *)link->data;
- if (strcmp (dir, link_dir) == 0)
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-service_dirs_append_link_unique_or_free (DBusList **service_dirs,
- DBusList *dir_link)
-{
- if (!service_dirs_find_dir (service_dirs, dir_link->data))
- {
- _dbus_list_append_link (service_dirs, dir_link);
- }
- else
- {
- dbus_free (dir_link->data);
- _dbus_list_free_link (dir_link);
- }
-}
-
-BusConfigParser*
-bus_config_parser_new (const DBusString *basedir,
- dbus_bool_t is_toplevel,
- const BusConfigParser *parent)
-{
- BusConfigParser *parser;
-
- parser = dbus_new0 (BusConfigParser, 1);
- if (parser == NULL)
- goto failed;
-
- parser->type = ELEMENT_NONE;
-
- /* init the lists */
- parser->service_dirs = NULL;
-
- /* init the strings */
- if (!_dbus_string_init (&parser->user))
- goto failed_parser;
- if (!_dbus_string_init (&parser->bus_type))
- goto failed_type;
- if (!_dbus_string_init (&parser->service_helper))
- goto failed_helper;
-
- /* woot! */
- return parser;
-
-/* argh. we have do do this carefully because of OOM */
-failed_helper:
- _dbus_string_free (&parser->bus_type);
-failed_type:
- _dbus_string_free (&parser->user);
-failed_parser:
- dbus_free (parser);
-failed:
- return NULL;
-}
-
-void
-bus_config_parser_unref (BusConfigParser *parser)
-{
- _dbus_string_free (&parser->user);
- _dbus_string_free (&parser->service_helper);
- _dbus_string_free (&parser->bus_type);
-
- _dbus_list_foreach (&parser->service_dirs,
- (DBusForeachFunction) dbus_free,
- NULL);
-
- _dbus_list_clear (&parser->service_dirs);
-
- dbus_free (parser);
-}
-
-dbus_bool_t
-bus_config_parser_check_doctype (BusConfigParser *parser,
- const char *doctype,
- DBusError *error)
-{
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (strcmp (doctype, "busconfig") != 0)
- {
- dbus_set_error (error,
- DBUS_ERROR_FAILED,
- "Configuration file has the wrong document type %s",
- doctype);
- return FALSE;
- }
- else
- return TRUE;
-}
-
-dbus_bool_t
-bus_config_parser_start_element (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- DBusError *error)
-{
- /* we don't do processing of attribute names, we don't need to */
- parser->type = bus_config_parser_element_name_to_type (element_name);
-
- switch (parser->type)
- {
- case ELEMENT_SERVICEHELPER:
- case ELEMENT_USER:
- case ELEMENT_CONFIGTYPE:
- /* content about to be handled */
- break;
-
- case ELEMENT_STANDARD_SYSTEM_SERVICEDIRS:
- {
- DBusList *link;
- DBusList *dirs;
- dirs = NULL;
-
- if (!_dbus_get_standard_system_servicedirs (&dirs))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- while ((link = _dbus_list_pop_first_link (&dirs)))
- service_dirs_append_link_unique_or_free (&parser->service_dirs, link);
- break;
- }
-
- default:
- {
- /* we really don't care about the others... */
- _dbus_verbose (" START We don't care about '%s' type '%i'\n", element_name, parser->type);
- break;
- }
- }
- return TRUE;
-}
-
-dbus_bool_t
-bus_config_parser_end_element (BusConfigParser *parser,
- const char *element_name,
- DBusError *error)
-{
- /* we don't care */
- return TRUE;
-}
-
-dbus_bool_t
-bus_config_parser_content (BusConfigParser *parser,
- const DBusString *content,
- DBusError *error)
-{
- DBusString content_sane;
- dbus_bool_t retval;
-
- retval = FALSE;
-
- if (!_dbus_string_init (&content_sane))
- {
- BUS_SET_OOM (error);
- goto out;
- }
- if (!_dbus_string_copy (content, 0, &content_sane, 0))
- {
- BUS_SET_OOM (error);
- goto out_content;
- }
-
- /* rip out white space */
- _dbus_string_chop_white (&content_sane);
- if (_dbus_string_get_length (&content_sane) == 0)
- {
- /* optimise, there is no content */
- retval = TRUE;
- goto out_content;
- }
-
- switch (parser->type)
- {
- case ELEMENT_SERVICEDIR:
- {
- char *cpath;
-
- /* copy the sane data into a char array */
- if (!_dbus_string_copy_data(&content_sane, &cpath))
- {
- BUS_SET_OOM (error);
- goto out_content;
- }
-
- /* append the dynamic char string to service dirs */
- if (!_dbus_list_append (&parser->service_dirs, cpath))
- {
- dbus_free (cpath);
- BUS_SET_OOM (error);
- goto out_content;
- }
- }
- break;
-
- case ELEMENT_SERVICEHELPER:
- {
- if (!_dbus_string_copy (&content_sane, 0, &parser->service_helper, 0))
- {
- BUS_SET_OOM (error);
- goto out_content;
- }
- }
- break;
-
- case ELEMENT_USER:
- {
- if (!_dbus_string_copy (&content_sane, 0, &parser->user, 0))
- {
- BUS_SET_OOM (error);
- goto out_content;
- }
- }
- break;
-
- case ELEMENT_CONFIGTYPE:
- {
- if (!_dbus_string_copy (&content_sane, 0, &parser->bus_type, 0))
- {
- BUS_SET_OOM (error);
- goto out_content;
- }
- }
- break;
- default:
- {
- /* we don't care about the others... really */
- _dbus_verbose (" CONTENTS We don't care about '%s' type '%i'\n", _dbus_string_get_const_data (&content_sane), parser->type);
- break;
- }
- }
-
- /* woot! */
- retval = TRUE;
-
-out_content:
- _dbus_string_free (&content_sane);
-out:
- return retval;
-}
-
-dbus_bool_t
-bus_config_parser_finished (BusConfigParser *parser,
- DBusError *error)
-{
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- _dbus_verbose ("finished scanning!\n");
- return TRUE;
-}
-
-const char*
-bus_config_parser_get_user (BusConfigParser *parser)
-{
- return _dbus_string_get_const_data (&parser->user);
-}
-
-const char*
-bus_config_parser_get_type (BusConfigParser *parser)
-{
- return _dbus_string_get_const_data (&parser->bus_type);
-}
-
-DBusList**
-bus_config_parser_get_service_dirs (BusConfigParser *parser)
-{
- return &parser->service_dirs;
-}
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-#include <stdio.h>
-#include "test.h"
-
-typedef enum
-{
- VALID,
- INVALID,
- UNKNOWN
-} Validity;
-
-static dbus_bool_t
-check_return_values (const DBusString *full_path)
-{
- BusConfigParser *parser;
- DBusError error;
- dbus_bool_t retval;
- const char *user;
- const char *type;
- DBusList **dirs;
-
- dbus_error_init (&error);
- retval = FALSE;
-
- printf ("Testing values from: %s\n", _dbus_string_get_const_data (full_path));
-
- parser = bus_config_load (full_path, TRUE, NULL, &error);
- if (parser == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (&error);
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- _dbus_verbose ("Failed to load valid file due to OOM\n");
- goto finish;
- }
- _DBUS_ASSERT_ERROR_IS_CLEAR (&error);
-
- /* check user return value is okay */
- user = bus_config_parser_get_user (parser);
- if (user == NULL)
- {
- _dbus_warn ("User was NULL!\n");
- goto finish;
- }
-#if 0
- /* the username can be configured in configure.in so this test doesn't work */
- if (strcmp (user, "dbus") != 0)
- {
- _dbus_warn ("User was invalid; '%s'!\n", user);
- goto finish;
- }
- printf (" <user>dbus</user> OKAY!\n");
-#endif
-
- /* check type return value is okay */
- type = bus_config_parser_get_type (parser);
- if (type == NULL)
- {
- _dbus_warn ("Type was NULL!\n");
- goto finish;
- }
- if (strcmp (type, "system") != 0)
- {
- _dbus_warn ("Type was invalid; '%s'!\n", user);
- goto finish;
- }
- printf (" <type>system</type> OKAY!\n");
-
- /* check dirs return value is okay */
- dirs = bus_config_parser_get_service_dirs (parser);
- if (dirs == NULL)
- {
- _dbus_warn ("Service dirs are NULL!\n");
- goto finish;
- }
- printf (" <standard_system_service_dirs/> OKAY!\n");
- /* NOTE: We tested the specific return values in the config-parser tests */
-
- /* woohoo! */
- retval = TRUE;
-finish:
- if (parser != NULL)
- bus_config_parser_unref (parser);
- dbus_error_free (&error);
- return retval;
-}
-
-static dbus_bool_t
-do_load (const DBusString *full_path,
- Validity validity,
- dbus_bool_t oom_possible)
-{
- BusConfigParser *parser;
- DBusError error;
-
- dbus_error_init (&error);
-
- parser = bus_config_load (full_path, TRUE, NULL, &error);
- if (parser == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (&error);
-
- if (oom_possible &&
- dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- _dbus_verbose ("Failed to load valid file due to OOM\n");
- dbus_error_free (&error);
- return TRUE;
- }
- else if (validity == VALID)
- {
- _dbus_warn ("Failed to load valid file but still had memory: %s\n",
- error.message);
-
- dbus_error_free (&error);
- return FALSE;
- }
- else
- {
- dbus_error_free (&error);
- return TRUE;
- }
- }
- else
- {
- _DBUS_ASSERT_ERROR_IS_CLEAR (&error);
-
- bus_config_parser_unref (parser);
-
- if (validity == INVALID)
- {
- _dbus_warn ("Accepted invalid file\n");
- return FALSE;
- }
-
- return TRUE;
- }
-}
-
-typedef struct
-{
- const DBusString *full_path;
- Validity validity;
-} LoaderOomData;
-
-static dbus_bool_t
-check_loader_oom_func (void *data)
-{
- LoaderOomData *d = data;
-
- return do_load (d->full_path, d->validity, TRUE);
-}
-
-static dbus_bool_t
-process_test_valid_subdir (const DBusString *test_base_dir,
- const char *subdir,
- Validity validity)
-{
- DBusString test_directory;
- DBusString filename;
- DBusDirIter *dir;
- dbus_bool_t retval;
- DBusError error;
-
- retval = FALSE;
- dir = NULL;
-
- if (!_dbus_string_init (&test_directory))
- _dbus_assert_not_reached ("didn't allocate test_directory\n");
-
- _dbus_string_init_const (&filename, subdir);
-
- if (!_dbus_string_copy (test_base_dir, 0,
- &test_directory, 0))
- _dbus_assert_not_reached ("couldn't copy test_base_dir to test_directory");
-
- if (!_dbus_concat_dir_and_file (&test_directory, &filename))
- _dbus_assert_not_reached ("couldn't allocate full path");
-
- _dbus_string_free (&filename);
- if (!_dbus_string_init (&filename))
- _dbus_assert_not_reached ("didn't allocate filename string\n");
-
- dbus_error_init (&error);
- dir = _dbus_directory_open (&test_directory, &error);
- if (dir == NULL)
- {
- _dbus_warn ("Could not open %s: %s\n",
- _dbus_string_get_const_data (&test_directory),
- error.message);
- dbus_error_free (&error);
- goto failed;
- }
-
- if (validity == VALID)
- printf ("Testing valid files:\n");
- else if (validity == INVALID)
- printf ("Testing invalid files:\n");
- else
- printf ("Testing unknown files:\n");
-
- next:
- while (_dbus_directory_get_next_file (dir, &filename, &error))
- {
- DBusString full_path;
- LoaderOomData d;
-
- if (!_dbus_string_init (&full_path))
- _dbus_assert_not_reached ("couldn't init string");
-
- if (!_dbus_string_copy (&test_directory, 0, &full_path, 0))
- _dbus_assert_not_reached ("couldn't copy dir to full_path");
-
- if (!_dbus_concat_dir_and_file (&full_path, &filename))
- _dbus_assert_not_reached ("couldn't concat file to dir");
-
- if (!_dbus_string_ends_with_c_str (&full_path, ".conf"))
- {
- _dbus_verbose ("Skipping non-.conf file %s\n",
- _dbus_string_get_const_data (&filename));
- _dbus_string_free (&full_path);
- goto next;
- }
-
- printf (" %s\n", _dbus_string_get_const_data (&filename));
-
- _dbus_verbose (" expecting %s\n",
- validity == VALID ? "valid" :
- (validity == INVALID ? "invalid" :
- (validity == UNKNOWN ? "unknown" : "???")));
-
- d.full_path = &full_path;
- d.validity = validity;
-
- /* FIXME hackaround for an expat problem, see
- * https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=124747
- * http://freedesktop.org/pipermail/dbus/2004-May/001153.html
- */
- /* if (!_dbus_test_oom_handling ("config-loader", check_loader_oom_func, &d)) */
- if (!check_loader_oom_func (&d))
- _dbus_assert_not_reached ("test failed");
-
- _dbus_string_free (&full_path);
- }
-
- if (dbus_error_is_set (&error))
- {
- _dbus_warn ("Could not get next file in %s: %s\n",
- _dbus_string_get_const_data (&test_directory),
- error.message);
- dbus_error_free (&error);
- goto failed;
- }
-
- retval = TRUE;
-
- failed:
-
- if (dir)
- _dbus_directory_close (dir);
- _dbus_string_free (&test_directory);
- _dbus_string_free (&filename);
-
- return retval;
-}
-
-/* convenience function, do not reuse outside of TEST */
-static dbus_bool_t
-make_full_path (const DBusString *test_data_dir,
- const char *subdir,
- const char *file,
- DBusString *full_path)
-{
- DBusString filename;
- dbus_bool_t retval;
-
- retval = FALSE;
-
- if (!_dbus_string_init (full_path))
- {
- _dbus_warn ("couldn't allocate full path");
- goto finish;
- }
-
- if (!_dbus_string_copy (test_data_dir, 0, full_path, 0))
- {
- _dbus_warn ("couldn't allocate full path");
- goto finish;
- }
-
- _dbus_string_init_const (&filename, subdir);
- if (!_dbus_concat_dir_and_file (full_path, &filename))
- {
- _dbus_warn ("couldn't allocate full path");
- goto finish;
- }
- _dbus_string_free (&filename);
-
- _dbus_string_init_const (&filename, file);
- if (!_dbus_concat_dir_and_file (full_path, &filename))
- {
- _dbus_warn ("couldn't allocate full path");
- goto finish;
- }
-
- /* woot! */
- retval = TRUE;
-
-finish:
- _dbus_string_free (&filename);
- return retval;
-}
-
-static dbus_bool_t
-check_file_valid (DBusString *full_path,
- Validity validity)
-{
- dbus_bool_t retval;
-
- if (validity == VALID)
- printf ("Testing valid file:\n");
- else if (validity == INVALID)
- printf ("Testing invalid file:\n");
- else
- printf ("Testing unknown file:\n");
-
- /* print the filename, just so we match the other output */
- printf (" %s\n", _dbus_string_get_const_data (full_path));
-
- /* only test one file */
- retval = do_load (full_path, validity, TRUE);
-
- return retval;
-}
-
-dbus_bool_t
-bus_config_parser_trivial_test (const DBusString *test_data_dir)
-{
- DBusString full_path;
- dbus_bool_t retval;
-
- retval = FALSE;
-
- if (test_data_dir == NULL ||
- _dbus_string_get_length (test_data_dir) == 0)
- {
- printf ("No test data\n");
- return TRUE;
- }
-
- /* We already test default_session_servicedirs and default_system_servicedirs
- * in bus_config_parser_test() */
- if (!process_test_valid_subdir (test_data_dir, "valid-config-files", VALID))
- goto finish;
-
- /* we don't process all the invalid files, as the trivial parser can't hope
- * to validate them all for all different syntaxes. We just check one broken
- * file to see if junk is received */
- if (!make_full_path (test_data_dir, "invalid-config-files", "not-well-formed.conf", &full_path))
- goto finish;
- if (!check_file_valid (&full_path, INVALID))
- goto finish;
- _dbus_string_free (&full_path);
-
- /* just test if the check_file_valid works okay and we got sane values */
- if (!make_full_path (test_data_dir, "valid-config-files", "system.conf", &full_path))
- goto finish;
- if (!check_file_valid (&full_path, VALID))
- goto finish;
- /* check to see if we got the correct values from the parser */
- if (!check_return_values (&full_path))
- goto finish;
-
- /* woot! */
- retval = TRUE;
-
-finish:
- _dbus_string_free (&full_path);
-
- /* we don't process equiv-config-files as we don't handle <include> */
- return retval;
-}
-
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
-
diff --git a/src/3rd_party/dbus-1.7.8/bus/config-parser-trivial.h b/src/3rd_party/dbus-1.7.8/bus/config-parser-trivial.h
deleted file mode 100644
index 31ddef6b5d..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/config-parser-trivial.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* config-parser-trivial.h XML-library-agnostic configuration file parser
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_CONFIG_PARSER_TRIVIAL_H
-#define BUS_CONFIG_PARSER_TRIVIAL_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-hash.h>
-
-/* Whatever XML library we're using just pushes data into this API */
-
-typedef struct BusConfigParser BusConfigParser;
-
-BusConfigParser* bus_config_parser_new (const DBusString *basedir,
- dbus_bool_t is_toplevel,
- const BusConfigParser *parent);
-
-BusConfigParser* bus_config_parser_ref (BusConfigParser *parser);
-void bus_config_parser_unref (BusConfigParser *parser);
-dbus_bool_t bus_config_parser_check_doctype (BusConfigParser *parser,
- const char *doctype,
- DBusError *error);
-dbus_bool_t bus_config_parser_start_element (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- DBusError *error);
-dbus_bool_t bus_config_parser_end_element (BusConfigParser *parser,
- const char *element_name,
- DBusError *error);
-dbus_bool_t bus_config_parser_content (BusConfigParser *parser,
- const DBusString *content,
- DBusError *error);
-dbus_bool_t bus_config_parser_finished (BusConfigParser *parser,
- DBusError *error);
-
-/* Functions for extracting the parse results */
-const char* bus_config_parser_get_user (BusConfigParser *parser);
-const char* bus_config_parser_get_type (BusConfigParser *parser);
-DBusList** bus_config_parser_get_service_dirs (BusConfigParser *parser);
-
-/* Loader functions (backended off one of the XML parsers). Returns a
- * finished ConfigParser.
- */
-BusConfigParser* bus_config_load (const DBusString *file,
- dbus_bool_t is_toplevel,
- const BusConfigParser *parent,
- DBusError *error);
-
-#endif /* BUS_CONFIG_PARSER_TRIVIAL_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/config-parser.c b/src/3rd_party/dbus-1.7.8/bus/config-parser.c
deleted file mode 100644
index 12a2d2e7bf..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/config-parser.c
+++ /dev/null
@@ -1,3641 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* config-parser.c XML-library-agnostic configuration file parser
- *
- * Copyright (C) 2003, 2004 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "config-parser-common.h"
-#include "config-parser.h"
-#include "test.h"
-#include "utils.h"
-#include "policy.h"
-#include "selinux.h"
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-misc.h>
-#include <dbus/dbus-sysdeps.h>
-#include <string.h>
-
-typedef enum
-{
- /* we ignore policies for unknown groups/users */
- POLICY_IGNORED,
-
- /* non-ignored */
- POLICY_DEFAULT,
- POLICY_MANDATORY,
- POLICY_USER,
- POLICY_GROUP,
- POLICY_CONSOLE
-} PolicyType;
-
-typedef struct
-{
- ElementType type;
-
- unsigned int had_content : 1;
-
- union
- {
- struct
- {
- unsigned int ignore_missing : 1;
- unsigned int if_selinux_enabled : 1;
- unsigned int selinux_root_relative : 1;
- } include;
-
- struct
- {
- PolicyType type;
- unsigned long gid_uid_or_at_console;
- } policy;
-
- struct
- {
- char *name;
- long value;
- } limit;
-
- } d;
-
-} Element;
-
-/**
- * Parser for bus configuration file.
- */
-struct BusConfigParser
-{
- int refcount; /**< Reference count */
-
- DBusString basedir; /**< Directory we resolve paths relative to */
-
- DBusList *stack; /**< stack of Element */
-
- char *user; /**< user to run as */
-
- char *servicehelper; /**< location of the setuid helper */
-
- char *bus_type; /**< Message bus type */
-
- DBusList *listen_on; /**< List of addresses to listen to */
-
- DBusList *mechanisms; /**< Auth mechanisms */
-
- DBusList *service_dirs; /**< Directories to look for session services in */
-
- DBusList *conf_dirs; /**< Directories to look for policy configuration in */
-
- BusPolicy *policy; /**< Security policy */
-
- BusLimits limits; /**< Limits */
-
- char *pidfile; /**< PID file */
-
- DBusList *included_files; /**< Included files stack */
-
- DBusHashTable *service_context_table; /**< Map service names to SELinux contexts */
-
- unsigned int fork : 1; /**< TRUE to fork into daemon mode */
-
- unsigned int syslog : 1; /**< TRUE to enable syslog */
- unsigned int keep_umask : 1; /**< TRUE to keep original umask when forking */
-
- unsigned int is_toplevel : 1; /**< FALSE if we are a sub-config-file inside another one */
-
- unsigned int allow_anonymous : 1; /**< TRUE to allow anonymous connections */
-};
-
-static Element*
-push_element (BusConfigParser *parser,
- ElementType type)
-{
- Element *e;
-
- _dbus_assert (type != ELEMENT_NONE);
-
- e = dbus_new0 (Element, 1);
- if (e == NULL)
- return NULL;
-
- if (!_dbus_list_append (&parser->stack, e))
- {
- dbus_free (e);
- return NULL;
- }
-
- e->type = type;
-
- return e;
-}
-
-static void
-element_free (Element *e)
-{
- if (e->type == ELEMENT_LIMIT)
- dbus_free (e->d.limit.name);
-
- dbus_free (e);
-}
-
-static void
-pop_element (BusConfigParser *parser)
-{
- Element *e;
-
- e = _dbus_list_pop_last (&parser->stack);
-
- element_free (e);
-}
-
-static Element*
-peek_element (BusConfigParser *parser)
-{
- Element *e;
-
- e = _dbus_list_get_last (&parser->stack);
-
- return e;
-}
-
-static ElementType
-top_element_type (BusConfigParser *parser)
-{
- Element *e;
-
- e = _dbus_list_get_last (&parser->stack);
-
- if (e)
- return e->type;
- else
- return ELEMENT_NONE;
-}
-
-static dbus_bool_t
-merge_service_context_hash (DBusHashTable *dest,
- DBusHashTable *from)
-{
- DBusHashIter iter;
- char *service_copy;
- char *context_copy;
-
- service_copy = NULL;
- context_copy = NULL;
-
- _dbus_hash_iter_init (from, &iter);
- while (_dbus_hash_iter_next (&iter))
- {
- const char *service = _dbus_hash_iter_get_string_key (&iter);
- const char *context = _dbus_hash_iter_get_value (&iter);
-
- service_copy = _dbus_strdup (service);
- if (service_copy == NULL)
- goto fail;
- context_copy = _dbus_strdup (context);
- if (context_copy == NULL)
- goto fail;
-
- if (!_dbus_hash_table_insert_string (dest, service_copy, context_copy))
- goto fail;
-
- service_copy = NULL;
- context_copy = NULL;
- }
-
- return TRUE;
-
- fail:
- if (service_copy)
- dbus_free (service_copy);
-
- if (context_copy)
- dbus_free (context_copy);
-
- return FALSE;
-}
-
-static dbus_bool_t
-service_dirs_find_dir (DBusList **service_dirs,
- const char *dir)
-{
- DBusList *link;
-
- _dbus_assert (dir != NULL);
-
- for (link = *service_dirs; link; link = _dbus_list_get_next_link(service_dirs, link))
- {
- const char *link_dir;
-
- link_dir = (const char *)link->data;
- if (strcmp (dir, link_dir) == 0)
- return TRUE;
- }
-
- return FALSE;
-}
-
-static dbus_bool_t
-service_dirs_append_unique_or_free (DBusList **service_dirs,
- char *dir)
-{
- if (!service_dirs_find_dir (service_dirs, dir))
- return _dbus_list_append (service_dirs, dir);
-
- dbus_free (dir);
- return TRUE;
-}
-
-static void
-service_dirs_append_link_unique_or_free (DBusList **service_dirs,
- DBusList *dir_link)
-{
- if (!service_dirs_find_dir (service_dirs, dir_link->data))
- {
- _dbus_list_append_link (service_dirs, dir_link);
- }
- else
- {
- dbus_free (dir_link->data);
- _dbus_list_free_link (dir_link);
- }
-}
-
-static dbus_bool_t
-merge_included (BusConfigParser *parser,
- BusConfigParser *included,
- DBusError *error)
-{
- DBusList *link;
-
- if (!bus_policy_merge (parser->policy,
- included->policy))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!merge_service_context_hash (parser->service_context_table,
- included->service_context_table))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (included->user != NULL)
- {
- dbus_free (parser->user);
- parser->user = included->user;
- included->user = NULL;
- }
-
- if (included->bus_type != NULL)
- {
- dbus_free (parser->bus_type);
- parser->bus_type = included->bus_type;
- included->bus_type = NULL;
- }
-
- if (included->fork)
- parser->fork = TRUE;
-
- if (included->keep_umask)
- parser->keep_umask = TRUE;
-
- if (included->pidfile != NULL)
- {
- dbus_free (parser->pidfile);
- parser->pidfile = included->pidfile;
- included->pidfile = NULL;
- }
-
- if (included->servicehelper != NULL)
- {
- dbus_free (parser->servicehelper);
- parser->servicehelper = included->servicehelper;
- included->servicehelper = NULL;
- }
-
- while ((link = _dbus_list_pop_first_link (&included->listen_on)))
- _dbus_list_append_link (&parser->listen_on, link);
-
- while ((link = _dbus_list_pop_first_link (&included->mechanisms)))
- _dbus_list_append_link (&parser->mechanisms, link);
-
- while ((link = _dbus_list_pop_first_link (&included->service_dirs)))
- service_dirs_append_link_unique_or_free (&parser->service_dirs, link);
-
- while ((link = _dbus_list_pop_first_link (&included->conf_dirs)))
- _dbus_list_append_link (&parser->conf_dirs, link);
-
- return TRUE;
-}
-
-static dbus_bool_t
-seen_include (BusConfigParser *parser,
- const DBusString *file)
-{
- DBusList *iter;
-
- iter = parser->included_files;
- while (iter != NULL)
- {
- if (! strcmp (_dbus_string_get_const_data (file), iter->data))
- return TRUE;
-
- iter = _dbus_list_get_next_link (&parser->included_files, iter);
- }
-
- return FALSE;
-}
-
-BusConfigParser*
-bus_config_parser_new (const DBusString *basedir,
- dbus_bool_t is_toplevel,
- const BusConfigParser *parent)
-{
- BusConfigParser *parser;
-
- parser = dbus_new0 (BusConfigParser, 1);
- if (parser == NULL)
- return NULL;
-
- parser->is_toplevel = !!is_toplevel;
-
- if (!_dbus_string_init (&parser->basedir))
- {
- dbus_free (parser);
- return NULL;
- }
-
- if (((parser->policy = bus_policy_new ()) == NULL) ||
- !_dbus_string_copy (basedir, 0, &parser->basedir, 0) ||
- ((parser->service_context_table = _dbus_hash_table_new (DBUS_HASH_STRING,
- dbus_free,
- dbus_free)) == NULL))
- {
- if (parser->policy)
- bus_policy_unref (parser->policy);
-
- _dbus_string_free (&parser->basedir);
-
- dbus_free (parser);
- return NULL;
- }
-
- if (parent != NULL)
- {
- /* Initialize the parser's limits from the parent. */
- parser->limits = parent->limits;
-
- /* Use the parent's list of included_files to avoid
- circular inclusions. */
- parser->included_files = parent->included_files;
- }
- else
- {
-
- /* Make up some numbers! woot! */
- parser->limits.max_incoming_bytes = _DBUS_ONE_MEGABYTE * 127;
- parser->limits.max_outgoing_bytes = _DBUS_ONE_MEGABYTE * 127;
- parser->limits.max_message_size = _DBUS_ONE_MEGABYTE * 32;
-
- /* We set relatively conservative values here since due to the
- way SCM_RIGHTS works we need to preallocate an array for the
- maximum number of file descriptors we can receive. Picking a
- high value here thus translates directly to more memory
- allocation. */
- parser->limits.max_incoming_unix_fds = DBUS_DEFAULT_MESSAGE_UNIX_FDS*4;
- parser->limits.max_outgoing_unix_fds = DBUS_DEFAULT_MESSAGE_UNIX_FDS*4;
- parser->limits.max_message_unix_fds = DBUS_DEFAULT_MESSAGE_UNIX_FDS;
-
- /* Making this long means the user has to wait longer for an error
- * message if something screws up, but making it too short means
- * they might see a false failure.
- */
- parser->limits.activation_timeout = 25000; /* 25 seconds */
-
- /* Making this long risks making a DOS attack easier, but too short
- * and legitimate auth will fail. If interactive auth (ask user for
- * password) is allowed, then potentially it has to be quite long.
- */
- parser->limits.auth_timeout = 30000; /* 30 seconds */
-
- parser->limits.max_incomplete_connections = 64;
- parser->limits.max_connections_per_user = 256;
-
- /* Note that max_completed_connections / max_connections_per_user
- * is the number of users that would have to work together to
- * DOS all the other users.
- */
- parser->limits.max_completed_connections = 2048;
-
- parser->limits.max_pending_activations = 512;
- parser->limits.max_services_per_connection = 512;
-
- /* For this one, keep in mind that it isn't only the memory used
- * by the match rules, but slowdown from linearly walking a big
- * list of them. A client adding more than this is almost
- * certainly a bad idea for that reason, and should change to a
- * smaller number of wider-net match rules - getting every last
- * message to the bus is probably better than having a thousand
- * match rules.
- */
- parser->limits.max_match_rules_per_connection = 512;
-
- parser->limits.reply_timeout = -1; /* never */
-
- /* this is effectively a limit on message queue size for messages
- * that require a reply
- */
- parser->limits.max_replies_per_connection = 1024*8;
- }
-
- parser->refcount = 1;
-
- return parser;
-}
-
-BusConfigParser *
-bus_config_parser_ref (BusConfigParser *parser)
-{
- _dbus_assert (parser->refcount > 0);
-
- parser->refcount += 1;
-
- return parser;
-}
-
-void
-bus_config_parser_unref (BusConfigParser *parser)
-{
- _dbus_assert (parser->refcount > 0);
-
- parser->refcount -= 1;
-
- if (parser->refcount == 0)
- {
- while (parser->stack != NULL)
- pop_element (parser);
-
- dbus_free (parser->user);
- dbus_free (parser->servicehelper);
- dbus_free (parser->bus_type);
- dbus_free (parser->pidfile);
-
- _dbus_list_foreach (&parser->listen_on,
- (DBusForeachFunction) dbus_free,
- NULL);
-
- _dbus_list_clear (&parser->listen_on);
-
- _dbus_list_foreach (&parser->service_dirs,
- (DBusForeachFunction) dbus_free,
- NULL);
-
- _dbus_list_clear (&parser->service_dirs);
-
- _dbus_list_foreach (&parser->conf_dirs,
- (DBusForeachFunction) dbus_free,
- NULL);
-
- _dbus_list_clear (&parser->conf_dirs);
-
- _dbus_list_foreach (&parser->mechanisms,
- (DBusForeachFunction) dbus_free,
- NULL);
-
- _dbus_list_clear (&parser->mechanisms);
-
- _dbus_string_free (&parser->basedir);
-
- if (parser->policy)
- bus_policy_unref (parser->policy);
-
- if (parser->service_context_table)
- _dbus_hash_table_unref (parser->service_context_table);
-
- dbus_free (parser);
- }
-}
-
-dbus_bool_t
-bus_config_parser_check_doctype (BusConfigParser *parser,
- const char *doctype,
- DBusError *error)
-{
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (strcmp (doctype, "busconfig") != 0)
- {
- dbus_set_error (error,
- DBUS_ERROR_FAILED,
- "Configuration file has the wrong document type %s",
- doctype);
- return FALSE;
- }
- else
- return TRUE;
-}
-
-typedef struct
-{
- const char *name;
- const char **retloc;
-} LocateAttr;
-
-static dbus_bool_t
-locate_attributes (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- DBusError *error,
- const char *first_attribute_name,
- const char **first_attribute_retloc,
- ...)
-{
- va_list args;
- const char *name;
- const char **retloc;
- int n_attrs;
-#define MAX_ATTRS 24
- LocateAttr attrs[MAX_ATTRS];
- dbus_bool_t retval;
- int i;
-
- _dbus_assert (first_attribute_name != NULL);
- _dbus_assert (first_attribute_retloc != NULL);
-
- retval = TRUE;
-
- n_attrs = 1;
- attrs[0].name = first_attribute_name;
- attrs[0].retloc = first_attribute_retloc;
- *first_attribute_retloc = NULL;
-
- va_start (args, first_attribute_retloc);
-
- name = va_arg (args, const char*);
- retloc = va_arg (args, const char**);
-
- while (name != NULL)
- {
- _dbus_assert (retloc != NULL);
- _dbus_assert (n_attrs < MAX_ATTRS);
-
- attrs[n_attrs].name = name;
- attrs[n_attrs].retloc = retloc;
- n_attrs += 1;
- *retloc = NULL;
-
- name = va_arg (args, const char*);
- retloc = va_arg (args, const char**);
- }
-
- va_end (args);
-
- i = 0;
- while (attribute_names[i])
- {
- int j;
- dbus_bool_t found;
-
- found = FALSE;
- j = 0;
- while (j < n_attrs)
- {
- if (strcmp (attrs[j].name, attribute_names[i]) == 0)
- {
- retloc = attrs[j].retloc;
-
- if (*retloc != NULL)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Attribute \"%s\" repeated twice on the same <%s> element",
- attrs[j].name, element_name);
- retval = FALSE;
- goto out;
- }
-
- *retloc = attribute_values[i];
- found = TRUE;
- }
-
- ++j;
- }
-
- if (!found)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Attribute \"%s\" is invalid on <%s> element in this context",
- attribute_names[i], element_name);
- retval = FALSE;
- goto out;
- }
-
- ++i;
- }
-
- out:
- return retval;
-}
-
-static dbus_bool_t
-check_no_attributes (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- DBusError *error)
-{
- if (attribute_names[0] != NULL)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Attribute \"%s\" is invalid on <%s> element in this context",
- attribute_names[0], element_name);
- return FALSE;
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-start_busconfig_child (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- DBusError *error)
-{
- ElementType element_type;
-
- element_type = bus_config_parser_element_name_to_type (element_name);
-
- if (element_type == ELEMENT_USER)
- {
- if (!check_no_attributes (parser, "user", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_USER) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_CONFIGTYPE)
- {
- if (!check_no_attributes (parser, "type", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_CONFIGTYPE) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_FORK)
- {
- if (!check_no_attributes (parser, "fork", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_FORK) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- parser->fork = TRUE;
-
- return TRUE;
- }
- else if (element_type == ELEMENT_SYSLOG)
- {
- if (!check_no_attributes (parser, "syslog", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_SYSLOG) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- parser->syslog = TRUE;
-
- return TRUE;
- }
- else if (element_type == ELEMENT_KEEP_UMASK)
- {
- if (!check_no_attributes (parser, "keep_umask", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_KEEP_UMASK) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- parser->keep_umask = TRUE;
-
- return TRUE;
- }
- else if (element_type == ELEMENT_PIDFILE)
- {
- if (!check_no_attributes (parser, "pidfile", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_PIDFILE) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_LISTEN)
- {
- if (!check_no_attributes (parser, "listen", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_LISTEN) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_AUTH)
- {
- if (!check_no_attributes (parser, "auth", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_AUTH) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_SERVICEHELPER)
- {
- if (!check_no_attributes (parser, "servicehelper", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_SERVICEHELPER) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_INCLUDEDIR)
- {
- if (!check_no_attributes (parser, "includedir", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_INCLUDEDIR) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_STANDARD_SESSION_SERVICEDIRS)
- {
- DBusList *link;
- DBusList *dirs;
- dirs = NULL;
-
- if (!check_no_attributes (parser, "standard_session_servicedirs", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_STANDARD_SESSION_SERVICEDIRS) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_get_standard_session_servicedirs (&dirs))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- while ((link = _dbus_list_pop_first_link (&dirs)))
- service_dirs_append_link_unique_or_free (&parser->service_dirs, link);
-
- return TRUE;
- }
- else if (element_type == ELEMENT_STANDARD_SYSTEM_SERVICEDIRS)
- {
- DBusList *link;
- DBusList *dirs;
- dirs = NULL;
-
- if (!check_no_attributes (parser, "standard_system_servicedirs", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_STANDARD_SYSTEM_SERVICEDIRS) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_get_standard_system_servicedirs (&dirs))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- while ((link = _dbus_list_pop_first_link (&dirs)))
- service_dirs_append_link_unique_or_free (&parser->service_dirs, link);
-
- return TRUE;
- }
- else if (element_type == ELEMENT_ALLOW_ANONYMOUS)
- {
- if (!check_no_attributes (parser, "allow_anonymous", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_ALLOW_ANONYMOUS) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- parser->allow_anonymous = TRUE;
- return TRUE;
- }
- else if (element_type == ELEMENT_SERVICEDIR)
- {
- if (!check_no_attributes (parser, "servicedir", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_SERVICEDIR) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_INCLUDE)
- {
- Element *e;
- const char *if_selinux_enabled;
- const char *ignore_missing;
- const char *selinux_root_relative;
-
- if ((e = push_element (parser, ELEMENT_INCLUDE)) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- e->d.include.ignore_missing = FALSE;
- e->d.include.if_selinux_enabled = FALSE;
- e->d.include.selinux_root_relative = FALSE;
-
- if (!locate_attributes (parser, "include",
- attribute_names,
- attribute_values,
- error,
- "ignore_missing", &ignore_missing,
- "if_selinux_enabled", &if_selinux_enabled,
- "selinux_root_relative", &selinux_root_relative,
- NULL))
- return FALSE;
-
- if (ignore_missing != NULL)
- {
- if (strcmp (ignore_missing, "yes") == 0)
- e->d.include.ignore_missing = TRUE;
- else if (strcmp (ignore_missing, "no") == 0)
- e->d.include.ignore_missing = FALSE;
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "ignore_missing attribute must have value \"yes\" or \"no\"");
- return FALSE;
- }
- }
-
- if (if_selinux_enabled != NULL)
- {
- if (strcmp (if_selinux_enabled, "yes") == 0)
- e->d.include.if_selinux_enabled = TRUE;
- else if (strcmp (if_selinux_enabled, "no") == 0)
- e->d.include.if_selinux_enabled = FALSE;
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "if_selinux_enabled attribute must have value"
- " \"yes\" or \"no\"");
- return FALSE;
- }
- }
-
- if (selinux_root_relative != NULL)
- {
- if (strcmp (selinux_root_relative, "yes") == 0)
- e->d.include.selinux_root_relative = TRUE;
- else if (strcmp (selinux_root_relative, "no") == 0)
- e->d.include.selinux_root_relative = FALSE;
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "selinux_root_relative attribute must have value"
- " \"yes\" or \"no\"");
- return FALSE;
- }
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_POLICY)
- {
- Element *e;
- const char *context;
- const char *user;
- const char *group;
- const char *at_console;
-
- if ((e = push_element (parser, ELEMENT_POLICY)) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- e->d.policy.type = POLICY_IGNORED;
-
- if (!locate_attributes (parser, "policy",
- attribute_names,
- attribute_values,
- error,
- "context", &context,
- "user", &user,
- "group", &group,
- "at_console", &at_console,
- NULL))
- return FALSE;
-
- if (((context && user) ||
- (context && group) ||
- (context && at_console)) ||
- ((user && group) ||
- (user && at_console)) ||
- (group && at_console) ||
- !(context || user || group || at_console))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "<policy> element must have exactly one of (context|user|group|at_console) attributes");
- return FALSE;
- }
-
- if (context != NULL)
- {
- if (strcmp (context, "default") == 0)
- {
- e->d.policy.type = POLICY_DEFAULT;
- }
- else if (strcmp (context, "mandatory") == 0)
- {
- e->d.policy.type = POLICY_MANDATORY;
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "context attribute on <policy> must have the value \"default\" or \"mandatory\", not \"%s\"",
- context);
- return FALSE;
- }
- }
- else if (user != NULL)
- {
- DBusString username;
- _dbus_string_init_const (&username, user);
-
- if (_dbus_parse_unix_user_from_config (&username,
- &e->d.policy.gid_uid_or_at_console))
- e->d.policy.type = POLICY_USER;
- else
- _dbus_warn ("Unknown username \"%s\" in message bus configuration file\n",
- user);
- }
- else if (group != NULL)
- {
- DBusString group_name;
- _dbus_string_init_const (&group_name, group);
-
- if (_dbus_parse_unix_group_from_config (&group_name,
- &e->d.policy.gid_uid_or_at_console))
- e->d.policy.type = POLICY_GROUP;
- else
- _dbus_warn ("Unknown group \"%s\" in message bus configuration file\n",
- group);
- }
- else if (at_console != NULL)
- {
- dbus_bool_t t;
- t = (strcmp (at_console, "true") == 0);
- if (t || strcmp (at_console, "false") == 0)
- {
- e->d.policy.gid_uid_or_at_console = t;
- e->d.policy.type = POLICY_CONSOLE;
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Unknown value \"%s\" for at_console in message bus configuration file",
- at_console);
-
- return FALSE;
- }
- }
- else
- {
- _dbus_assert_not_reached ("all <policy> attributes null and we didn't set error");
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_LIMIT)
- {
- Element *e;
- const char *name;
-
- if ((e = push_element (parser, ELEMENT_LIMIT)) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!locate_attributes (parser, "limit",
- attribute_names,
- attribute_values,
- error,
- "name", &name,
- NULL))
- return FALSE;
-
- if (name == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "<limit> element must have a \"name\" attribute");
- return FALSE;
- }
-
- e->d.limit.name = _dbus_strdup (name);
- if (e->d.limit.name == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (element_type == ELEMENT_SELINUX)
- {
- if (!check_no_attributes (parser, "selinux", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_SELINUX) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Element <%s> not allowed inside <%s> in configuration file",
- element_name, "busconfig");
- return FALSE;
- }
-}
-
-static dbus_bool_t
-append_rule_from_element (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- dbus_bool_t allow,
- DBusError *error)
-{
- const char *log;
- const char *send_interface;
- const char *send_member;
- const char *send_error;
- const char *send_destination;
- const char *send_path;
- const char *send_type;
- const char *receive_interface;
- const char *receive_member;
- const char *receive_error;
- const char *receive_sender;
- const char *receive_path;
- const char *receive_type;
- const char *eavesdrop;
- const char *send_requested_reply;
- const char *receive_requested_reply;
- const char *own;
- const char *own_prefix;
- const char *user;
- const char *group;
-
- BusPolicyRule *rule;
-
- if (!locate_attributes (parser, element_name,
- attribute_names,
- attribute_values,
- error,
- "send_interface", &send_interface,
- "send_member", &send_member,
- "send_error", &send_error,
- "send_destination", &send_destination,
- "send_path", &send_path,
- "send_type", &send_type,
- "receive_interface", &receive_interface,
- "receive_member", &receive_member,
- "receive_error", &receive_error,
- "receive_sender", &receive_sender,
- "receive_path", &receive_path,
- "receive_type", &receive_type,
- "eavesdrop", &eavesdrop,
- "send_requested_reply", &send_requested_reply,
- "receive_requested_reply", &receive_requested_reply,
- "own", &own,
- "own_prefix", &own_prefix,
- "user", &user,
- "group", &group,
- "log", &log,
- NULL))
- return FALSE;
-
- if (!(send_interface || send_member || send_error || send_destination ||
- send_type || send_path ||
- receive_interface || receive_member || receive_error || receive_sender ||
- receive_type || receive_path || eavesdrop ||
- send_requested_reply || receive_requested_reply ||
- own || own_prefix || user || group))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Element <%s> must have one or more attributes",
- element_name);
- return FALSE;
- }
-
- if ((send_member && (send_interface == NULL && send_path == NULL)) ||
- (receive_member && (receive_interface == NULL && receive_path == NULL)))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "On element <%s>, if you specify a member you must specify an interface or a path. Keep in mind that not all messages have an interface field.",
- element_name);
- return FALSE;
- }
-
- /* Allowed combinations of elements are:
- *
- * base, must be all send or all receive:
- * nothing
- * interface
- * interface + member
- * error
- *
- * base send_ can combine with send_destination, send_path, send_type, send_requested_reply
- * base receive_ with receive_sender, receive_path, receive_type, receive_requested_reply, eavesdrop
- *
- * user, group, own, own_prefix must occur alone
- *
- * Pretty sure the below stuff is broken, FIXME think about it more.
- */
-
- if ((send_interface && (send_error ||
- receive_interface ||
- receive_member ||
- receive_error ||
- receive_sender ||
- receive_requested_reply ||
- own || own_prefix ||
- user ||
- group)) ||
-
- (send_member && (send_error ||
- receive_interface ||
- receive_member ||
- receive_error ||
- receive_sender ||
- receive_requested_reply ||
- own || own_prefix ||
- user ||
- group)) ||
-
- (send_error && (receive_interface ||
- receive_member ||
- receive_error ||
- receive_sender ||
- receive_requested_reply ||
- own || own_prefix ||
- user ||
- group)) ||
-
- (send_destination && (receive_interface ||
- receive_member ||
- receive_error ||
- receive_sender ||
- receive_requested_reply ||
- own || own_prefix ||
- user ||
- group)) ||
-
- (send_type && (receive_interface ||
- receive_member ||
- receive_error ||
- receive_sender ||
- receive_requested_reply ||
- own || own_prefix ||
- user ||
- group)) ||
-
- (send_path && (receive_interface ||
- receive_member ||
- receive_error ||
- receive_sender ||
- receive_requested_reply ||
- own || own_prefix ||
- user ||
- group)) ||
-
- (send_requested_reply && (receive_interface ||
- receive_member ||
- receive_error ||
- receive_sender ||
- receive_requested_reply ||
- own || own_prefix ||
- user ||
- group)) ||
-
- (receive_interface && (receive_error ||
- own || own_prefix ||
- user ||
- group)) ||
-
- (receive_member && (receive_error ||
- own || own_prefix ||
- user ||
- group)) ||
-
- (receive_error && (own || own_prefix ||
- user ||
- group)) ||
-
- (eavesdrop && (own || own_prefix ||
- user ||
- group)) ||
-
- (receive_requested_reply && (own || own_prefix ||
- user ||
- group)) ||
-
- (own && (own_prefix || user || group)) ||
-
- (own_prefix && (own || user || group)) ||
-
- (user && group))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Invalid combination of attributes on element <%s>",
- element_name);
- return FALSE;
- }
-
- rule = NULL;
-
- /* In BusPolicyRule, NULL represents wildcard.
- * In the config file, '*' represents it.
- */
-#define IS_WILDCARD(str) ((str) && ((str)[0]) == '*' && ((str)[1]) == '\0')
-
- if (send_interface || send_member || send_error || send_destination ||
- send_path || send_type || send_requested_reply)
- {
- int message_type;
-
- if (IS_WILDCARD (send_interface))
- send_interface = NULL;
- if (IS_WILDCARD (send_member))
- send_member = NULL;
- if (IS_WILDCARD (send_error))
- send_error = NULL;
- if (IS_WILDCARD (send_destination))
- send_destination = NULL;
- if (IS_WILDCARD (send_path))
- send_path = NULL;
- if (IS_WILDCARD (send_type))
- send_type = NULL;
-
- message_type = DBUS_MESSAGE_TYPE_INVALID;
- if (send_type != NULL)
- {
- message_type = dbus_message_type_from_string (send_type);
- if (message_type == DBUS_MESSAGE_TYPE_INVALID)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Bad message type \"%s\"",
- send_type);
- return FALSE;
- }
- }
-
- if (eavesdrop &&
- !(strcmp (eavesdrop, "true") == 0 ||
- strcmp (eavesdrop, "false") == 0))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Bad value \"%s\" for %s attribute, must be true or false",
- "eavesdrop", eavesdrop);
- return FALSE;
- }
-
- if (send_requested_reply &&
- !(strcmp (send_requested_reply, "true") == 0 ||
- strcmp (send_requested_reply, "false") == 0))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Bad value \"%s\" for %s attribute, must be true or false",
- "send_requested_reply", send_requested_reply);
- return FALSE;
- }
-
- rule = bus_policy_rule_new (BUS_POLICY_RULE_SEND, allow);
- if (rule == NULL)
- goto nomem;
-
- if (eavesdrop)
- rule->d.send.eavesdrop = (strcmp (eavesdrop, "true") == 0);
-
- if (log)
- rule->d.send.log = (strcmp (log, "true") == 0);
-
- if (send_requested_reply)
- rule->d.send.requested_reply = (strcmp (send_requested_reply, "true") == 0);
-
- rule->d.send.message_type = message_type;
- rule->d.send.path = _dbus_strdup (send_path);
- rule->d.send.interface = _dbus_strdup (send_interface);
- rule->d.send.member = _dbus_strdup (send_member);
- rule->d.send.error = _dbus_strdup (send_error);
- rule->d.send.destination = _dbus_strdup (send_destination);
- if (send_path && rule->d.send.path == NULL)
- goto nomem;
- if (send_interface && rule->d.send.interface == NULL)
- goto nomem;
- if (send_member && rule->d.send.member == NULL)
- goto nomem;
- if (send_error && rule->d.send.error == NULL)
- goto nomem;
- if (send_destination && rule->d.send.destination == NULL)
- goto nomem;
- }
- else if (receive_interface || receive_member || receive_error || receive_sender ||
- receive_path || receive_type || eavesdrop || receive_requested_reply)
- {
- int message_type;
-
- if (IS_WILDCARD (receive_interface))
- receive_interface = NULL;
- if (IS_WILDCARD (receive_member))
- receive_member = NULL;
- if (IS_WILDCARD (receive_error))
- receive_error = NULL;
- if (IS_WILDCARD (receive_sender))
- receive_sender = NULL;
- if (IS_WILDCARD (receive_path))
- receive_path = NULL;
- if (IS_WILDCARD (receive_type))
- receive_type = NULL;
-
- message_type = DBUS_MESSAGE_TYPE_INVALID;
- if (receive_type != NULL)
- {
- message_type = dbus_message_type_from_string (receive_type);
- if (message_type == DBUS_MESSAGE_TYPE_INVALID)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Bad message type \"%s\"",
- receive_type);
- return FALSE;
- }
- }
-
-
- if (eavesdrop &&
- !(strcmp (eavesdrop, "true") == 0 ||
- strcmp (eavesdrop, "false") == 0))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Bad value \"%s\" for %s attribute, must be true or false",
- "eavesdrop", eavesdrop);
- return FALSE;
- }
-
- if (receive_requested_reply &&
- !(strcmp (receive_requested_reply, "true") == 0 ||
- strcmp (receive_requested_reply, "false") == 0))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Bad value \"%s\" for %s attribute, must be true or false",
- "receive_requested_reply", receive_requested_reply);
- return FALSE;
- }
-
- rule = bus_policy_rule_new (BUS_POLICY_RULE_RECEIVE, allow);
- if (rule == NULL)
- goto nomem;
-
- if (eavesdrop)
- rule->d.receive.eavesdrop = (strcmp (eavesdrop, "true") == 0);
-
- if (receive_requested_reply)
- rule->d.receive.requested_reply = (strcmp (receive_requested_reply, "true") == 0);
-
- rule->d.receive.message_type = message_type;
- rule->d.receive.path = _dbus_strdup (receive_path);
- rule->d.receive.interface = _dbus_strdup (receive_interface);
- rule->d.receive.member = _dbus_strdup (receive_member);
- rule->d.receive.error = _dbus_strdup (receive_error);
- rule->d.receive.origin = _dbus_strdup (receive_sender);
-
- if (receive_path && rule->d.receive.path == NULL)
- goto nomem;
- if (receive_interface && rule->d.receive.interface == NULL)
- goto nomem;
- if (receive_member && rule->d.receive.member == NULL)
- goto nomem;
- if (receive_error && rule->d.receive.error == NULL)
- goto nomem;
- if (receive_sender && rule->d.receive.origin == NULL)
- goto nomem;
- }
- else if (own || own_prefix)
- {
- rule = bus_policy_rule_new (BUS_POLICY_RULE_OWN, allow);
- if (rule == NULL)
- goto nomem;
-
- if (own)
- {
- if (IS_WILDCARD (own))
- own = NULL;
-
- rule->d.own.prefix = 0;
- rule->d.own.service_name = _dbus_strdup (own);
- if (own && rule->d.own.service_name == NULL)
- goto nomem;
- }
- else
- {
- rule->d.own.prefix = 1;
- rule->d.own.service_name = _dbus_strdup (own_prefix);
- if (rule->d.own.service_name == NULL)
- goto nomem;
- }
- }
- else if (user)
- {
- if (IS_WILDCARD (user))
- {
- rule = bus_policy_rule_new (BUS_POLICY_RULE_USER, allow);
- if (rule == NULL)
- goto nomem;
-
- rule->d.user.uid = DBUS_UID_UNSET;
- }
- else
- {
- DBusString username;
- dbus_uid_t uid;
-
- _dbus_string_init_const (&username, user);
-
- if (_dbus_parse_unix_user_from_config (&username, &uid))
- {
- rule = bus_policy_rule_new (BUS_POLICY_RULE_USER, allow);
- if (rule == NULL)
- goto nomem;
-
- rule->d.user.uid = uid;
- }
- else
- {
- _dbus_warn ("Unknown username \"%s\" on element <%s>\n",
- user, element_name);
- }
- }
- }
- else if (group)
- {
- if (IS_WILDCARD (group))
- {
- rule = bus_policy_rule_new (BUS_POLICY_RULE_GROUP, allow);
- if (rule == NULL)
- goto nomem;
-
- rule->d.group.gid = DBUS_GID_UNSET;
- }
- else
- {
- DBusString groupname;
- dbus_gid_t gid;
-
- _dbus_string_init_const (&groupname, group);
-
- if (_dbus_parse_unix_group_from_config (&groupname, &gid))
- {
- rule = bus_policy_rule_new (BUS_POLICY_RULE_GROUP, allow);
- if (rule == NULL)
- goto nomem;
-
- rule->d.group.gid = gid;
- }
- else
- {
- _dbus_warn ("Unknown group \"%s\" on element <%s>\n",
- group, element_name);
- }
- }
- }
- else
- _dbus_assert_not_reached ("Did not handle some combination of attributes on <allow> or <deny>");
-
- if (rule != NULL)
- {
- Element *pe;
-
- pe = peek_element (parser);
- _dbus_assert (pe != NULL);
- _dbus_assert (pe->type == ELEMENT_POLICY);
-
- switch (pe->d.policy.type)
- {
- case POLICY_IGNORED:
- /* drop the rule on the floor */
- break;
-
- case POLICY_DEFAULT:
- if (!bus_policy_append_default_rule (parser->policy, rule))
- goto nomem;
- break;
- case POLICY_MANDATORY:
- if (!bus_policy_append_mandatory_rule (parser->policy, rule))
- goto nomem;
- break;
- case POLICY_USER:
- if (!BUS_POLICY_RULE_IS_PER_CLIENT (rule))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "<%s> rule cannot be per-user because it has bus-global semantics",
- element_name);
- goto failed;
- }
-
- if (!bus_policy_append_user_rule (parser->policy, pe->d.policy.gid_uid_or_at_console,
- rule))
- goto nomem;
- break;
- case POLICY_GROUP:
- if (!BUS_POLICY_RULE_IS_PER_CLIENT (rule))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "<%s> rule cannot be per-group because it has bus-global semantics",
- element_name);
- goto failed;
- }
-
- if (!bus_policy_append_group_rule (parser->policy, pe->d.policy.gid_uid_or_at_console,
- rule))
- goto nomem;
- break;
-
-
- case POLICY_CONSOLE:
- if (!bus_policy_append_console_rule (parser->policy, pe->d.policy.gid_uid_or_at_console,
- rule))
- goto nomem;
- break;
- }
-
- bus_policy_rule_unref (rule);
- rule = NULL;
- }
-
- return TRUE;
-
- nomem:
- BUS_SET_OOM (error);
- failed:
- if (rule)
- bus_policy_rule_unref (rule);
- return FALSE;
-}
-
-static dbus_bool_t
-start_policy_child (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- DBusError *error)
-{
- if (strcmp (element_name, "allow") == 0)
- {
- if (!append_rule_from_element (parser, element_name,
- attribute_names, attribute_values,
- TRUE, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_ALLOW) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else if (strcmp (element_name, "deny") == 0)
- {
- if (!append_rule_from_element (parser, element_name,
- attribute_names, attribute_values,
- FALSE, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_DENY) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Element <%s> not allowed inside <%s> in configuration file",
- element_name, "policy");
- return FALSE;
- }
-}
-
-static dbus_bool_t
-start_selinux_child (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- DBusError *error)
-{
- char *own_copy;
- char *context_copy;
-
- own_copy = NULL;
- context_copy = NULL;
-
- if (strcmp (element_name, "associate") == 0)
- {
- const char *own;
- const char *context;
-
- if (!locate_attributes (parser, "associate",
- attribute_names,
- attribute_values,
- error,
- "own", &own,
- "context", &context,
- NULL))
- return FALSE;
-
- if (push_element (parser, ELEMENT_ASSOCIATE) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (own == NULL || context == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Element <associate> must have attributes own=\"<servicename>\" and context=\"<selinux context>\"");
- return FALSE;
- }
-
- own_copy = _dbus_strdup (own);
- if (own_copy == NULL)
- goto oom;
- context_copy = _dbus_strdup (context);
- if (context_copy == NULL)
- goto oom;
-
- if (!_dbus_hash_table_insert_string (parser->service_context_table,
- own_copy, context_copy))
- goto oom;
-
- return TRUE;
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Element <%s> not allowed inside <%s> in configuration file",
- element_name, "selinux");
- return FALSE;
- }
-
- oom:
- if (own_copy)
- dbus_free (own_copy);
-
- if (context_copy)
- dbus_free (context_copy);
-
- BUS_SET_OOM (error);
- return FALSE;
-}
-
-dbus_bool_t
-bus_config_parser_start_element (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- DBusError *error)
-{
- ElementType t;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* printf ("START: %s\n", element_name); */
-
- t = top_element_type (parser);
-
- if (t == ELEMENT_NONE)
- {
- if (strcmp (element_name, "busconfig") == 0)
- {
- if (!check_no_attributes (parser, "busconfig", attribute_names, attribute_values, error))
- return FALSE;
-
- if (push_element (parser, ELEMENT_BUSCONFIG) == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Unknown element <%s> at root of configuration file",
- element_name);
- return FALSE;
- }
- }
- else if (t == ELEMENT_BUSCONFIG)
- {
- return start_busconfig_child (parser, element_name,
- attribute_names, attribute_values,
- error);
- }
- else if (t == ELEMENT_POLICY)
- {
- return start_policy_child (parser, element_name,
- attribute_names, attribute_values,
- error);
- }
- else if (t == ELEMENT_SELINUX)
- {
- return start_selinux_child (parser, element_name,
- attribute_names, attribute_values,
- error);
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Element <%s> is not allowed in this context",
- element_name);
- return FALSE;
- }
-}
-
-static dbus_bool_t
-set_limit (BusConfigParser *parser,
- const char *name,
- long value,
- DBusError *error)
-{
- dbus_bool_t must_be_positive;
- dbus_bool_t must_be_int;
-
- must_be_int = FALSE;
- must_be_positive = FALSE;
-
- if (strcmp (name, "max_incoming_bytes") == 0)
- {
- must_be_positive = TRUE;
- parser->limits.max_incoming_bytes = value;
- }
- else if (strcmp (name, "max_incoming_unix_fds") == 0)
- {
- must_be_positive = TRUE;
- parser->limits.max_incoming_unix_fds = value;
- }
- else if (strcmp (name, "max_outgoing_bytes") == 0)
- {
- must_be_positive = TRUE;
- parser->limits.max_outgoing_bytes = value;
- }
- else if (strcmp (name, "max_outgoing_unix_fds") == 0)
- {
- must_be_positive = TRUE;
- parser->limits.max_outgoing_unix_fds = value;
- }
- else if (strcmp (name, "max_message_size") == 0)
- {
- must_be_positive = TRUE;
- parser->limits.max_message_size = value;
- }
- else if (strcmp (name, "max_message_unix_fds") == 0)
- {
- must_be_positive = TRUE;
- parser->limits.max_message_unix_fds = value;
- }
- else if (strcmp (name, "service_start_timeout") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.activation_timeout = value;
- }
- else if (strcmp (name, "auth_timeout") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.auth_timeout = value;
- }
- else if (strcmp (name, "reply_timeout") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.reply_timeout = value;
- }
- else if (strcmp (name, "max_completed_connections") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.max_completed_connections = value;
- }
- else if (strcmp (name, "max_incomplete_connections") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.max_incomplete_connections = value;
- }
- else if (strcmp (name, "max_connections_per_user") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.max_connections_per_user = value;
- }
- else if (strcmp (name, "max_pending_service_starts") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.max_pending_activations = value;
- }
- else if (strcmp (name, "max_names_per_connection") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.max_services_per_connection = value;
- }
- else if (strcmp (name, "max_match_rules_per_connection") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.max_match_rules_per_connection = value;
- }
- else if (strcmp (name, "max_replies_per_connection") == 0)
- {
- must_be_positive = TRUE;
- must_be_int = TRUE;
- parser->limits.max_replies_per_connection = value;
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "There is no limit called \"%s\"\n",
- name);
- return FALSE;
- }
-
- if (must_be_positive && value < 0)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "<limit name=\"%s\"> must be a positive number\n",
- name);
- return FALSE;
- }
-
- if (must_be_int &&
- (value < _DBUS_INT_MIN || value > _DBUS_INT_MAX))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "<limit name=\"%s\"> value is too large\n",
- name);
- return FALSE;
- }
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_config_parser_end_element (BusConfigParser *parser,
- const char *element_name,
- DBusError *error)
-{
- ElementType t;
- const char *n;
- Element *e;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* printf ("END: %s\n", element_name); */
-
- t = top_element_type (parser);
-
- if (t == ELEMENT_NONE)
- {
- /* should probably be an assertion failure but
- * being paranoid about XML parsers
- */
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "XML parser ended element with no element on the stack");
- return FALSE;
- }
-
- n = bus_config_parser_element_type_to_name (t);
- _dbus_assert (n != NULL);
- if (strcmp (n, element_name) != 0)
- {
- /* should probably be an assertion failure but
- * being paranoid about XML parsers
- */
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "XML element <%s> ended but topmost element on the stack was <%s>",
- element_name, n);
- return FALSE;
- }
-
- e = peek_element (parser);
- _dbus_assert (e != NULL);
-
- switch (e->type)
- {
- case ELEMENT_NONE:
- _dbus_assert_not_reached ("element in stack has no type");
- break;
-
- case ELEMENT_INCLUDE:
- case ELEMENT_USER:
- case ELEMENT_CONFIGTYPE:
- case ELEMENT_LISTEN:
- case ELEMENT_PIDFILE:
- case ELEMENT_AUTH:
- case ELEMENT_SERVICEDIR:
- case ELEMENT_SERVICEHELPER:
- case ELEMENT_INCLUDEDIR:
- case ELEMENT_LIMIT:
- if (!e->had_content)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "XML element <%s> was expected to have content inside it",
- bus_config_parser_element_type_to_name (e->type));
- return FALSE;
- }
-
- if (e->type == ELEMENT_LIMIT)
- {
- if (!set_limit (parser, e->d.limit.name, e->d.limit.value,
- error))
- return FALSE;
- }
- break;
-
- case ELEMENT_BUSCONFIG:
- case ELEMENT_POLICY:
- case ELEMENT_ALLOW:
- case ELEMENT_DENY:
- case ELEMENT_FORK:
- case ELEMENT_SYSLOG:
- case ELEMENT_KEEP_UMASK:
- case ELEMENT_SELINUX:
- case ELEMENT_ASSOCIATE:
- case ELEMENT_STANDARD_SESSION_SERVICEDIRS:
- case ELEMENT_STANDARD_SYSTEM_SERVICEDIRS:
- case ELEMENT_ALLOW_ANONYMOUS:
- break;
- }
-
- pop_element (parser);
-
- return TRUE;
-}
-
-static dbus_bool_t
-all_whitespace (const DBusString *str)
-{
- int i;
-
- _dbus_string_skip_white (str, 0, &i);
-
- return i == _dbus_string_get_length (str);
-}
-
-static dbus_bool_t
-make_full_path (const DBusString *basedir,
- const DBusString *filename,
- DBusString *full_path)
-{
- if (_dbus_path_is_absolute (filename))
- {
- return _dbus_string_copy (filename, 0, full_path, 0);
- }
- else
- {
- if (!_dbus_string_copy (basedir, 0, full_path, 0))
- return FALSE;
-
- if (!_dbus_concat_dir_and_file (full_path, filename))
- return FALSE;
-
- return TRUE;
- }
-}
-
-static dbus_bool_t
-include_file (BusConfigParser *parser,
- const DBusString *filename,
- dbus_bool_t ignore_missing,
- DBusError *error)
-{
- /* FIXME good test case for this would load each config file in the
- * test suite both alone, and as an include, and check
- * that the result is the same
- */
- BusConfigParser *included;
- const char *filename_str;
- DBusError tmp_error;
-
- dbus_error_init (&tmp_error);
-
- filename_str = _dbus_string_get_const_data (filename);
-
- /* Check to make sure this file hasn't already been included. */
- if (seen_include (parser, filename))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Circular inclusion of file '%s'",
- filename_str);
- return FALSE;
- }
-
- if (! _dbus_list_append (&parser->included_files, (void *) filename_str))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- /* Since parser is passed in as the parent, included
- inherits parser's limits. */
- included = bus_config_load (filename, FALSE, parser, &tmp_error);
-
- _dbus_list_pop_last (&parser->included_files);
-
- if (included == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
-
- if (dbus_error_has_name (&tmp_error, DBUS_ERROR_FILE_NOT_FOUND) &&
- ignore_missing)
- {
- dbus_error_free (&tmp_error);
- return TRUE;
- }
- else
- {
- dbus_move_error (&tmp_error, error);
- return FALSE;
- }
- }
- else
- {
- _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
-
- if (!merge_included (parser, included, error))
- {
- bus_config_parser_unref (included);
- return FALSE;
- }
-
- /* Copy included's limits back to parser. */
- parser->limits = included->limits;
-
- bus_config_parser_unref (included);
- return TRUE;
- }
-}
-
-static dbus_bool_t
-servicehelper_path (BusConfigParser *parser,
- const DBusString *filename,
- DBusError *error)
-{
- const char *filename_str;
- char *servicehelper;
-
- filename_str = _dbus_string_get_const_data (filename);
-
- /* copy to avoid overwriting with NULL on OOM */
- servicehelper = _dbus_strdup (filename_str);
-
- /* check for OOM */
- if (servicehelper == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- /* save the latest servicehelper only if not OOM */
- dbus_free (parser->servicehelper);
- parser->servicehelper = servicehelper;
-
- /* We don't check whether the helper exists; instead we
- * would just fail to ever activate anything if it doesn't.
- * This allows an admin to fix the problem if it doesn't exist.
- * It also allows the parser test suite to successfully parse
- * test cases without installing the helper. ;-)
- */
-
- return TRUE;
-}
-
-static dbus_bool_t
-include_dir (BusConfigParser *parser,
- const DBusString *dirname,
- DBusError *error)
-{
- DBusString filename;
- dbus_bool_t retval;
- DBusError tmp_error;
- DBusDirIter *dir;
- char *s;
-
- if (!_dbus_string_init (&filename))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- retval = FALSE;
-
- dir = _dbus_directory_open (dirname, error);
-
- if (dir == NULL)
- goto failed;
-
- dbus_error_init (&tmp_error);
- while (_dbus_directory_get_next_file (dir, &filename, &tmp_error))
- {
- DBusString full_path;
-
- if (!_dbus_string_init (&full_path))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (!_dbus_string_copy (dirname, 0, &full_path, 0))
- {
- BUS_SET_OOM (error);
- _dbus_string_free (&full_path);
- goto failed;
- }
-
- if (!_dbus_concat_dir_and_file (&full_path, &filename))
- {
- BUS_SET_OOM (error);
- _dbus_string_free (&full_path);
- goto failed;
- }
-
- if (_dbus_string_ends_with_c_str (&full_path, ".conf"))
- {
- if (!include_file (parser, &full_path, TRUE, error))
- {
- if (dbus_error_is_set (error))
- {
- /* We log to syslog unconditionally here, because this is
- * the configuration parser, so we don't yet know whether
- * this bus is going to want to write to syslog! (There's
- * also some layer inversion going on, if we want to use
- * the bus context.) */
- _dbus_system_log (DBUS_SYSTEM_LOG_INFO,
- "Encountered error '%s' while parsing '%s'\n",
- error->message,
- _dbus_string_get_const_data (&full_path));
- dbus_error_free (error);
- }
- }
- }
-
- _dbus_string_free (&full_path);
- }
-
- if (dbus_error_is_set (&tmp_error))
- {
- dbus_move_error (&tmp_error, error);
- goto failed;
- }
-
-
- if (!_dbus_string_copy_data (dirname, &s))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (!_dbus_list_append (&parser->conf_dirs, s))
- {
- dbus_free (s);
- BUS_SET_OOM (error);
- goto failed;
- }
-
- retval = TRUE;
-
- failed:
- _dbus_string_free (&filename);
-
- if (dir)
- _dbus_directory_close (dir);
-
- return retval;
-}
-
-dbus_bool_t
-bus_config_parser_content (BusConfigParser *parser,
- const DBusString *content,
- DBusError *error)
-{
- Element *e;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
-#if 0
- {
- const char *c_str;
-
- _dbus_string_get_const_data (content, &c_str);
-
- printf ("CONTENT %d bytes: %s\n", _dbus_string_get_length (content), c_str);
- }
-#endif
-
- e = peek_element (parser);
- if (e == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Text content outside of any XML element in configuration file");
- return FALSE;
- }
- else if (e->had_content)
- {
- _dbus_assert_not_reached ("Element had multiple content blocks");
- return FALSE;
- }
-
- switch (top_element_type (parser))
- {
- case ELEMENT_NONE:
- _dbus_assert_not_reached ("element at top of stack has no type");
- return FALSE;
-
- case ELEMENT_BUSCONFIG:
- case ELEMENT_POLICY:
- case ELEMENT_ALLOW:
- case ELEMENT_DENY:
- case ELEMENT_FORK:
- case ELEMENT_SYSLOG:
- case ELEMENT_KEEP_UMASK:
- case ELEMENT_STANDARD_SESSION_SERVICEDIRS:
- case ELEMENT_STANDARD_SYSTEM_SERVICEDIRS:
- case ELEMENT_ALLOW_ANONYMOUS:
- case ELEMENT_SELINUX:
- case ELEMENT_ASSOCIATE:
- if (all_whitespace (content))
- return TRUE;
- else
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "No text content expected inside XML element %s in configuration file",
- bus_config_parser_element_type_to_name (top_element_type (parser)));
- return FALSE;
- }
-
- case ELEMENT_PIDFILE:
- {
- char *s;
-
- e->had_content = TRUE;
-
- if (!_dbus_string_copy_data (content, &s))
- goto nomem;
-
- dbus_free (parser->pidfile);
- parser->pidfile = s;
- }
- break;
-
- case ELEMENT_INCLUDE:
- {
- DBusString full_path, selinux_policy_root;
-
- e->had_content = TRUE;
-
- if (e->d.include.if_selinux_enabled
- && !bus_selinux_enabled ())
- break;
-
- if (!_dbus_string_init (&full_path))
- goto nomem;
-
- if (e->d.include.selinux_root_relative)
- {
- if (!bus_selinux_get_policy_root ())
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Could not determine SELinux policy root for relative inclusion");
- _dbus_string_free (&full_path);
- return FALSE;
- }
- _dbus_string_init_const (&selinux_policy_root,
- bus_selinux_get_policy_root ());
- if (!make_full_path (&selinux_policy_root, content, &full_path))
- {
- _dbus_string_free (&full_path);
- goto nomem;
- }
- }
- else if (!make_full_path (&parser->basedir, content, &full_path))
- {
- _dbus_string_free (&full_path);
- goto nomem;
- }
-
- if (!include_file (parser, &full_path,
- e->d.include.ignore_missing, error))
- {
- _dbus_string_free (&full_path);
- return FALSE;
- }
-
- _dbus_string_free (&full_path);
- }
- break;
-
- case ELEMENT_SERVICEHELPER:
- {
- DBusString full_path;
-
- e->had_content = TRUE;
-
- if (!_dbus_string_init (&full_path))
- goto nomem;
-
- if (!make_full_path (&parser->basedir, content, &full_path))
- {
- _dbus_string_free (&full_path);
- goto nomem;
- }
-
- if (!servicehelper_path (parser, &full_path, error))
- {
- _dbus_string_free (&full_path);
- return FALSE;
- }
-
- _dbus_string_free (&full_path);
- }
- break;
-
- case ELEMENT_INCLUDEDIR:
- {
- DBusString full_path;
-
- e->had_content = TRUE;
-
- if (!_dbus_string_init (&full_path))
- goto nomem;
-
- if (!make_full_path (&parser->basedir, content, &full_path))
- {
- _dbus_string_free (&full_path);
- goto nomem;
- }
-
- if (!include_dir (parser, &full_path, error))
- {
- _dbus_string_free (&full_path);
- return FALSE;
- }
-
- _dbus_string_free (&full_path);
- }
- break;
-
- case ELEMENT_USER:
- {
- char *s;
-
- e->had_content = TRUE;
-
- if (!_dbus_string_copy_data (content, &s))
- goto nomem;
-
- dbus_free (parser->user);
- parser->user = s;
- }
- break;
-
- case ELEMENT_CONFIGTYPE:
- {
- char *s;
-
- e->had_content = TRUE;
-
- if (!_dbus_string_copy_data (content, &s))
- goto nomem;
-
- dbus_free (parser->bus_type);
- parser->bus_type = s;
- }
- break;
-
- case ELEMENT_LISTEN:
- {
- char *s;
-
- e->had_content = TRUE;
-
- if (!_dbus_string_copy_data (content, &s))
- goto nomem;
-
- if (!_dbus_list_append (&parser->listen_on,
- s))
- {
- dbus_free (s);
- goto nomem;
- }
- }
- break;
-
- case ELEMENT_AUTH:
- {
- char *s;
-
- e->had_content = TRUE;
-
- if (!_dbus_string_copy_data (content, &s))
- goto nomem;
-
- if (!_dbus_list_append (&parser->mechanisms,
- s))
- {
- dbus_free (s);
- goto nomem;
- }
- }
- break;
-
- case ELEMENT_SERVICEDIR:
- {
- char *s;
- DBusString full_path;
-
- e->had_content = TRUE;
-
- if (!_dbus_string_init (&full_path))
- goto nomem;
-
- if (!make_full_path (&parser->basedir, content, &full_path))
- {
- _dbus_string_free (&full_path);
- goto nomem;
- }
-
- if (!_dbus_string_copy_data (&full_path, &s))
- {
- _dbus_string_free (&full_path);
- goto nomem;
- }
-
- /* _only_ extra session directories can be specified */
- if (!service_dirs_append_unique_or_free (&parser->service_dirs, s))
- {
- _dbus_string_free (&full_path);
- dbus_free (s);
- goto nomem;
- }
-
- _dbus_string_free (&full_path);
- }
- break;
-
- case ELEMENT_LIMIT:
- {
- long val;
-
- e->had_content = TRUE;
-
- val = 0;
- if (!_dbus_string_parse_int (content, 0, &val, NULL))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "<limit name=\"%s\"> element has invalid value (could not parse as integer)",
- e->d.limit.name);
- return FALSE;
- }
-
- e->d.limit.value = val;
-
- _dbus_verbose ("Loaded value %ld for limit %s\n",
- e->d.limit.value,
- e->d.limit.name);
- }
- break;
- }
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- return TRUE;
-
- nomem:
- BUS_SET_OOM (error);
- return FALSE;
-}
-
-dbus_bool_t
-bus_config_parser_finished (BusConfigParser *parser,
- DBusError *error)
-{
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (parser->stack != NULL)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Element <%s> was not closed in configuration file",
- bus_config_parser_element_type_to_name (top_element_type (parser)));
-
- return FALSE;
- }
-
- if (parser->is_toplevel && parser->listen_on == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Configuration file needs one or more <listen> elements giving addresses");
- return FALSE;
- }
-
- return TRUE;
-}
-
-const char*
-bus_config_parser_get_user (BusConfigParser *parser)
-{
- return parser->user;
-}
-
-const char*
-bus_config_parser_get_type (BusConfigParser *parser)
-{
- return parser->bus_type;
-}
-
-DBusList**
-bus_config_parser_get_addresses (BusConfigParser *parser)
-{
- return &parser->listen_on;
-}
-
-DBusList**
-bus_config_parser_get_mechanisms (BusConfigParser *parser)
-{
- return &parser->mechanisms;
-}
-
-DBusList**
-bus_config_parser_get_service_dirs (BusConfigParser *parser)
-{
- return &parser->service_dirs;
-}
-
-DBusList**
-bus_config_parser_get_conf_dirs (BusConfigParser *parser)
-{
- return &parser->conf_dirs;
-}
-
-dbus_bool_t
-bus_config_parser_get_fork (BusConfigParser *parser)
-{
- return parser->fork;
-}
-
-dbus_bool_t
-bus_config_parser_get_syslog (BusConfigParser *parser)
-{
- return parser->syslog;
-}
-
-dbus_bool_t
-bus_config_parser_get_keep_umask (BusConfigParser *parser)
-{
- return parser->keep_umask;
-}
-
-dbus_bool_t
-bus_config_parser_get_allow_anonymous (BusConfigParser *parser)
-{
- return parser->allow_anonymous;
-}
-
-const char *
-bus_config_parser_get_pidfile (BusConfigParser *parser)
-{
- return parser->pidfile;
-}
-
-const char *
-bus_config_parser_get_servicehelper (BusConfigParser *parser)
-{
- return parser->servicehelper;
-}
-
-BusPolicy*
-bus_config_parser_steal_policy (BusConfigParser *parser)
-{
- BusPolicy *policy;
-
- _dbus_assert (parser->policy != NULL); /* can only steal the policy 1 time */
-
- policy = parser->policy;
-
- parser->policy = NULL;
-
- return policy;
-}
-
-/* Overwrite any limits that were set in the configuration file */
-void
-bus_config_parser_get_limits (BusConfigParser *parser,
- BusLimits *limits)
-{
- *limits = parser->limits;
-}
-
-DBusHashTable*
-bus_config_parser_steal_service_context_table (BusConfigParser *parser)
-{
- DBusHashTable *table;
-
- _dbus_assert (parser->service_context_table != NULL); /* can only steal once */
-
- table = parser->service_context_table;
-
- parser->service_context_table = NULL;
-
- return table;
-}
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-#include <stdio.h>
-
-typedef enum
-{
- VALID,
- INVALID,
- UNKNOWN
-} Validity;
-
-static dbus_bool_t
-do_check_own_rules (BusPolicy *policy)
-{
- const struct {
- char *name;
- dbus_bool_t allowed;
- } checks[] = {
- {"org.freedesktop", FALSE},
- {"org.freedesktop.ManySystem", FALSE},
- {"org.freedesktop.ManySystems", TRUE},
- {"org.freedesktop.ManySystems.foo", TRUE},
- {"org.freedesktop.ManySystems.foo.bar", TRUE},
- {"org.freedesktop.ManySystems2", FALSE},
- {"org.freedesktop.ManySystems2.foo", FALSE},
- {"org.freedesktop.ManySystems2.foo.bar", FALSE},
- {NULL, FALSE}
- };
- int i = 0;
-
- while (checks[i].name)
- {
- DBusString service_name;
- dbus_bool_t ret;
-
- if (!_dbus_string_init (&service_name))
- _dbus_assert_not_reached ("couldn't init string");
- if (!_dbus_string_append (&service_name, checks[i].name))
- _dbus_assert_not_reached ("couldn't append string");
-
- ret = bus_policy_check_can_own (policy, &service_name);
- printf (" Check name %s: %s\n", checks[i].name,
- ret ? "allowed" : "not allowed");
- if (checks[i].allowed && !ret)
- {
- _dbus_warn ("Cannot own %s\n", checks[i].name);
- return FALSE;
- }
- if (!checks[i].allowed && ret)
- {
- _dbus_warn ("Can own %s\n", checks[i].name);
- return FALSE;
- }
- _dbus_string_free (&service_name);
-
- i++;
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-do_load (const DBusString *full_path,
- Validity validity,
- dbus_bool_t oom_possible,
- dbus_bool_t check_own_rules)
-{
- BusConfigParser *parser;
- DBusError error;
-
- dbus_error_init (&error);
-
- parser = bus_config_load (full_path, TRUE, NULL, &error);
- if (parser == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (&error);
-
- if (oom_possible &&
- dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- _dbus_verbose ("Failed to load valid file due to OOM\n");
- dbus_error_free (&error);
- return TRUE;
- }
- else if (validity == VALID)
- {
- _dbus_warn ("Failed to load valid file but still had memory: %s\n",
- error.message);
-
- dbus_error_free (&error);
- return FALSE;
- }
- else
- {
- dbus_error_free (&error);
- return TRUE;
- }
- }
- else
- {
- _DBUS_ASSERT_ERROR_IS_CLEAR (&error);
-
- if (check_own_rules && do_check_own_rules (parser->policy) == FALSE)
- {
- return FALSE;
- }
-
- bus_config_parser_unref (parser);
-
- if (validity == INVALID)
- {
- _dbus_warn ("Accepted invalid file\n");
- return FALSE;
- }
-
- return TRUE;
- }
-}
-
-typedef struct
-{
- const DBusString *full_path;
- Validity validity;
- dbus_bool_t check_own_rules;
-} LoaderOomData;
-
-static dbus_bool_t
-check_loader_oom_func (void *data)
-{
- LoaderOomData *d = data;
-
- return do_load (d->full_path, d->validity, TRUE, d->check_own_rules);
-}
-
-static dbus_bool_t
-process_test_valid_subdir (const DBusString *test_base_dir,
- const char *subdir,
- Validity validity)
-{
- DBusString test_directory;
- DBusString filename;
- DBusDirIter *dir;
- dbus_bool_t retval;
- DBusError error;
-
- retval = FALSE;
- dir = NULL;
-
- if (!_dbus_string_init (&test_directory))
- _dbus_assert_not_reached ("didn't allocate test_directory\n");
-
- _dbus_string_init_const (&filename, subdir);
-
- if (!_dbus_string_copy (test_base_dir, 0,
- &test_directory, 0))
- _dbus_assert_not_reached ("couldn't copy test_base_dir to test_directory");
-
- if (!_dbus_concat_dir_and_file (&test_directory, &filename))
- _dbus_assert_not_reached ("couldn't allocate full path");
-
- _dbus_string_free (&filename);
- if (!_dbus_string_init (&filename))
- _dbus_assert_not_reached ("didn't allocate filename string\n");
-
- dbus_error_init (&error);
- dir = _dbus_directory_open (&test_directory, &error);
- if (dir == NULL)
- {
- _dbus_warn ("Could not open %s: %s\n",
- _dbus_string_get_const_data (&test_directory),
- error.message);
- dbus_error_free (&error);
- goto failed;
- }
-
- if (validity == VALID)
- printf ("Testing valid files:\n");
- else if (validity == INVALID)
- printf ("Testing invalid files:\n");
- else
- printf ("Testing unknown files:\n");
-
- next:
- while (_dbus_directory_get_next_file (dir, &filename, &error))
- {
- DBusString full_path;
- LoaderOomData d;
-
- if (!_dbus_string_init (&full_path))
- _dbus_assert_not_reached ("couldn't init string");
-
- if (!_dbus_string_copy (&test_directory, 0, &full_path, 0))
- _dbus_assert_not_reached ("couldn't copy dir to full_path");
-
- if (!_dbus_concat_dir_and_file (&full_path, &filename))
- _dbus_assert_not_reached ("couldn't concat file to dir");
-
- if (!_dbus_string_ends_with_c_str (&full_path, ".conf"))
- {
- _dbus_verbose ("Skipping non-.conf file %s\n",
- _dbus_string_get_const_data (&filename));
- _dbus_string_free (&full_path);
- goto next;
- }
-
- printf (" %s\n", _dbus_string_get_const_data (&filename));
-
- _dbus_verbose (" expecting %s\n",
- validity == VALID ? "valid" :
- (validity == INVALID ? "invalid" :
- (validity == UNKNOWN ? "unknown" : "???")));
-
- d.full_path = &full_path;
- d.validity = validity;
- d.check_own_rules = _dbus_string_ends_with_c_str (&full_path,
- "check-own-rules.conf");
-
- /* FIXME hackaround for an expat problem, see
- * https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=124747
- * http://freedesktop.org/pipermail/dbus/2004-May/001153.html
- */
- /* if (!_dbus_test_oom_handling ("config-loader", check_loader_oom_func, &d)) */
- if (!check_loader_oom_func (&d))
- _dbus_assert_not_reached ("test failed");
-
- _dbus_string_free (&full_path);
- }
-
- if (dbus_error_is_set (&error))
- {
- _dbus_warn ("Could not get next file in %s: %s\n",
- _dbus_string_get_const_data (&test_directory),
- error.message);
- dbus_error_free (&error);
- goto failed;
- }
-
- retval = TRUE;
-
- failed:
-
- if (dir)
- _dbus_directory_close (dir);
- _dbus_string_free (&test_directory);
- _dbus_string_free (&filename);
-
- return retval;
-}
-
-static dbus_bool_t
-bools_equal (dbus_bool_t a,
- dbus_bool_t b)
-{
- return a ? b : !b;
-}
-
-static dbus_bool_t
-strings_equal_or_both_null (const char *a,
- const char *b)
-{
- if (a == NULL || b == NULL)
- return a == b;
- else
- return !strcmp (a, b);
-}
-
-static dbus_bool_t
-elements_equal (const Element *a,
- const Element *b)
-{
- if (a->type != b->type)
- return FALSE;
-
- if (!bools_equal (a->had_content, b->had_content))
- return FALSE;
-
- switch (a->type)
- {
-
- case ELEMENT_INCLUDE:
- if (!bools_equal (a->d.include.ignore_missing,
- b->d.include.ignore_missing))
- return FALSE;
- break;
-
- case ELEMENT_POLICY:
- if (a->d.policy.type != b->d.policy.type)
- return FALSE;
- if (a->d.policy.gid_uid_or_at_console != b->d.policy.gid_uid_or_at_console)
- return FALSE;
- break;
-
- case ELEMENT_LIMIT:
- if (strcmp (a->d.limit.name, b->d.limit.name))
- return FALSE;
- if (a->d.limit.value != b->d.limit.value)
- return FALSE;
- break;
-
- default:
- /* do nothing */
- break;
- }
-
- return TRUE;
-
-}
-
-static dbus_bool_t
-lists_of_elements_equal (DBusList *a,
- DBusList *b)
-{
- DBusList *ia;
- DBusList *ib;
-
- ia = a;
- ib = b;
-
- while (ia != NULL && ib != NULL)
- {
- if (elements_equal (ia->data, ib->data))
- return FALSE;
- ia = _dbus_list_get_next_link (&a, ia);
- ib = _dbus_list_get_next_link (&b, ib);
- }
-
- return ia == NULL && ib == NULL;
-}
-
-static dbus_bool_t
-lists_of_c_strings_equal (DBusList *a,
- DBusList *b)
-{
- DBusList *ia;
- DBusList *ib;
-
- ia = a;
- ib = b;
-
- while (ia != NULL && ib != NULL)
- {
- if (strcmp (ia->data, ib->data))
- return FALSE;
- ia = _dbus_list_get_next_link (&a, ia);
- ib = _dbus_list_get_next_link (&b, ib);
- }
-
- return ia == NULL && ib == NULL;
-}
-
-static dbus_bool_t
-limits_equal (const BusLimits *a,
- const BusLimits *b)
-{
- return
- (a->max_incoming_bytes == b->max_incoming_bytes
- || a->max_incoming_unix_fds == b->max_incoming_unix_fds
- || a->max_outgoing_bytes == b->max_outgoing_bytes
- || a->max_outgoing_unix_fds == b->max_outgoing_unix_fds
- || a->max_message_size == b->max_message_size
- || a->max_message_unix_fds == b->max_message_unix_fds
- || a->activation_timeout == b->activation_timeout
- || a->auth_timeout == b->auth_timeout
- || a->max_completed_connections == b->max_completed_connections
- || a->max_incomplete_connections == b->max_incomplete_connections
- || a->max_connections_per_user == b->max_connections_per_user
- || a->max_pending_activations == b->max_pending_activations
- || a->max_services_per_connection == b->max_services_per_connection
- || a->max_match_rules_per_connection == b->max_match_rules_per_connection
- || a->max_replies_per_connection == b->max_replies_per_connection
- || a->reply_timeout == b->reply_timeout);
-}
-
-static dbus_bool_t
-config_parsers_equal (const BusConfigParser *a,
- const BusConfigParser *b)
-{
- if (!_dbus_string_equal (&a->basedir, &b->basedir))
- return FALSE;
-
- if (!lists_of_elements_equal (a->stack, b->stack))
- return FALSE;
-
- if (!strings_equal_or_both_null (a->user, b->user))
- return FALSE;
-
- if (!lists_of_c_strings_equal (a->listen_on, b->listen_on))
- return FALSE;
-
- if (!lists_of_c_strings_equal (a->mechanisms, b->mechanisms))
- return FALSE;
-
- if (!lists_of_c_strings_equal (a->service_dirs, b->service_dirs))
- return FALSE;
-
- /* FIXME: compare policy */
-
- /* FIXME: compare service selinux ID table */
-
- if (! limits_equal (&a->limits, &b->limits))
- return FALSE;
-
- if (!strings_equal_or_both_null (a->pidfile, b->pidfile))
- return FALSE;
-
- if (! bools_equal (a->fork, b->fork))
- return FALSE;
-
- if (! bools_equal (a->keep_umask, b->keep_umask))
- return FALSE;
-
- if (! bools_equal (a->is_toplevel, b->is_toplevel))
- return FALSE;
-
- return TRUE;
-}
-
-static dbus_bool_t
-all_are_equiv (const DBusString *target_directory)
-{
- DBusString filename;
- DBusDirIter *dir;
- BusConfigParser *first_parser;
- BusConfigParser *parser;
- DBusError error;
- dbus_bool_t equal;
- dbus_bool_t retval;
-
- dir = NULL;
- first_parser = NULL;
- parser = NULL;
- retval = FALSE;
-
- if (!_dbus_string_init (&filename))
- _dbus_assert_not_reached ("didn't allocate filename string");
-
- dbus_error_init (&error);
- dir = _dbus_directory_open (target_directory, &error);
- if (dir == NULL)
- {
- _dbus_warn ("Could not open %s: %s\n",
- _dbus_string_get_const_data (target_directory),
- error.message);
- dbus_error_free (&error);
- goto finished;
- }
-
- printf ("Comparing equivalent files:\n");
-
- next:
- while (_dbus_directory_get_next_file (dir, &filename, &error))
- {
- DBusString full_path;
-
- if (!_dbus_string_init (&full_path))
- _dbus_assert_not_reached ("couldn't init string");
-
- if (!_dbus_string_copy (target_directory, 0, &full_path, 0))
- _dbus_assert_not_reached ("couldn't copy dir to full_path");
-
- if (!_dbus_concat_dir_and_file (&full_path, &filename))
- _dbus_assert_not_reached ("couldn't concat file to dir");
-
- if (!_dbus_string_ends_with_c_str (&full_path, ".conf"))
- {
- _dbus_verbose ("Skipping non-.conf file %s\n",
- _dbus_string_get_const_data (&filename));
- _dbus_string_free (&full_path);
- goto next;
- }
-
- printf (" %s\n", _dbus_string_get_const_data (&filename));
-
- parser = bus_config_load (&full_path, TRUE, NULL, &error);
-
- if (parser == NULL)
- {
- _dbus_warn ("Could not load file %s: %s\n",
- _dbus_string_get_const_data (&full_path),
- error.message);
- _dbus_string_free (&full_path);
- dbus_error_free (&error);
- goto finished;
- }
- else if (first_parser == NULL)
- {
- _dbus_string_free (&full_path);
- first_parser = parser;
- }
- else
- {
- _dbus_string_free (&full_path);
- equal = config_parsers_equal (first_parser, parser);
- bus_config_parser_unref (parser);
- if (! equal)
- goto finished;
- }
- }
-
- retval = TRUE;
-
- finished:
- _dbus_string_free (&filename);
- if (first_parser)
- bus_config_parser_unref (first_parser);
- if (dir)
- _dbus_directory_close (dir);
-
- return retval;
-
-}
-
-static dbus_bool_t
-process_test_equiv_subdir (const DBusString *test_base_dir,
- const char *subdir)
-{
- DBusString test_directory;
- DBusString filename;
- DBusDirIter *dir;
- DBusError error;
- dbus_bool_t equal;
- dbus_bool_t retval;
-
- dir = NULL;
- retval = FALSE;
-
- if (!_dbus_string_init (&test_directory))
- _dbus_assert_not_reached ("didn't allocate test_directory");
-
- _dbus_string_init_const (&filename, subdir);
-
- if (!_dbus_string_copy (test_base_dir, 0,
- &test_directory, 0))
- _dbus_assert_not_reached ("couldn't copy test_base_dir to test_directory");
-
- if (!_dbus_concat_dir_and_file (&test_directory, &filename))
- _dbus_assert_not_reached ("couldn't allocate full path");
-
- _dbus_string_free (&filename);
- if (!_dbus_string_init (&filename))
- _dbus_assert_not_reached ("didn't allocate filename string");
-
- dbus_error_init (&error);
- dir = _dbus_directory_open (&test_directory, &error);
- if (dir == NULL)
- {
- _dbus_warn ("Could not open %s: %s\n",
- _dbus_string_get_const_data (&test_directory),
- error.message);
- dbus_error_free (&error);
- goto finished;
- }
-
- while (_dbus_directory_get_next_file (dir, &filename, &error))
- {
- DBusString full_path;
-
- /* Skip CVS's magic directories! */
- if (_dbus_string_equal_c_str (&filename, "CVS"))
- continue;
-
- if (!_dbus_string_init (&full_path))
- _dbus_assert_not_reached ("couldn't init string");
-
- if (!_dbus_string_copy (&test_directory, 0, &full_path, 0))
- _dbus_assert_not_reached ("couldn't copy dir to full_path");
-
- if (!_dbus_concat_dir_and_file (&full_path, &filename))
- _dbus_assert_not_reached ("couldn't concat file to dir");
-
- equal = all_are_equiv (&full_path);
- _dbus_string_free (&full_path);
-
- if (!equal)
- goto finished;
- }
-
- retval = TRUE;
-
- finished:
- _dbus_string_free (&test_directory);
- _dbus_string_free (&filename);
- if (dir)
- _dbus_directory_close (dir);
-
- return retval;
-
-}
-
-static const char *test_session_service_dir_matches[] =
- {
-#ifdef DBUS_UNIX
- "/testhome/foo/.testlocal/testshare/dbus-1/services",
- "/testusr/testlocal/testshare/dbus-1/services",
- "/testusr/testshare/dbus-1/services",
- DBUS_DATADIR"/dbus-1/services",
-#endif
-/* will be filled in test_default_session_servicedirs() */
-#ifdef DBUS_WIN
- NULL,
- NULL,
-#endif
- NULL
- };
-
-static dbus_bool_t
-test_default_session_servicedirs (void)
-{
- DBusList *dirs;
- DBusList *link;
- DBusString progs;
- int i;
-
-#ifdef DBUS_WIN
- const char *common_progs;
- char buffer[1024];
-
- if (_dbus_get_install_root(buffer, sizeof(buffer)))
- {
- strcat(buffer,DBUS_DATADIR);
- strcat(buffer,"/dbus-1/services");
- test_session_service_dir_matches[0] = buffer;
- }
-#endif
-
- /* On Unix we don't actually use this variable, but it's easier to handle the
- * deallocation if we always allocate it, whether needed or not */
- if (!_dbus_string_init (&progs))
- _dbus_assert_not_reached ("OOM allocating progs");
-
-#ifndef DBUS_UNIX
- common_progs = _dbus_getenv ("CommonProgramFiles");
-
- if (common_progs)
- {
- if (!_dbus_string_append (&progs, common_progs))
- {
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- if (!_dbus_string_append (&progs, "/dbus-1/services"))
- {
- _dbus_string_free (&progs);
- return FALSE;
- }
- test_session_service_dir_matches[1] = _dbus_string_get_const_data(&progs);
- }
-#endif
- dirs = NULL;
-
- printf ("Testing retrieving the default session service directories\n");
- if (!_dbus_get_standard_session_servicedirs (&dirs))
- _dbus_assert_not_reached ("couldn't get stardard dirs");
-
- /* make sure our defaults end with share/dbus-1/service */
- while ((link = _dbus_list_pop_first_link (&dirs)))
- {
- DBusString path;
-
- printf (" default service dir: %s\n", (char *)link->data);
- _dbus_string_init_const (&path, (char *)link->data);
- if (!_dbus_string_ends_with_c_str (&path, "dbus-1/services"))
- {
- printf ("error with default session service directories\n");
- dbus_free (link->data);
- _dbus_list_free_link (link);
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- dbus_free (link->data);
- _dbus_list_free_link (link);
- }
-
-#ifdef DBUS_UNIX
- if (!dbus_setenv ("XDG_DATA_HOME", "/testhome/foo/.testlocal/testshare"))
- _dbus_assert_not_reached ("couldn't setenv XDG_DATA_HOME");
-
- if (!dbus_setenv ("XDG_DATA_DIRS", ":/testusr/testlocal/testshare: :/testusr/testshare:"))
- _dbus_assert_not_reached ("couldn't setenv XDG_DATA_DIRS");
-#endif
- if (!_dbus_get_standard_session_servicedirs (&dirs))
- _dbus_assert_not_reached ("couldn't get stardard dirs");
-
- /* make sure we read and parse the env variable correctly */
- i = 0;
- while ((link = _dbus_list_pop_first_link (&dirs)))
- {
- printf (" test service dir: %s\n", (char *)link->data);
- if (test_session_service_dir_matches[i] == NULL)
- {
- printf ("more directories parsed than in match set\n");
- dbus_free (link->data);
- _dbus_list_free_link (link);
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- if (strcmp (test_session_service_dir_matches[i],
- (char *)link->data) != 0)
- {
- printf ("%s directory does not match %s in the match set\n",
- (char *)link->data,
- test_session_service_dir_matches[i]);
- dbus_free (link->data);
- _dbus_list_free_link (link);
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- ++i;
-
- dbus_free (link->data);
- _dbus_list_free_link (link);
- }
-
- if (test_session_service_dir_matches[i] != NULL)
- {
- printf ("extra data %s in the match set was not matched\n",
- test_session_service_dir_matches[i]);
-
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- _dbus_string_free (&progs);
- return TRUE;
-}
-
-static const char *test_system_service_dir_matches[] =
- {
-#ifdef DBUS_UNIX
- "/usr/local/share/dbus-1/system-services",
- "/usr/share/dbus-1/system-services",
-#endif
- DBUS_DATADIR"/dbus-1/system-services",
-#ifdef DBUS_UNIX
- "/lib/dbus-1/system-services",
-#endif
-
-#ifdef DBUS_WIN
- NULL,
-#endif
- NULL
- };
-
-static dbus_bool_t
-test_default_system_servicedirs (void)
-{
- DBusList *dirs;
- DBusList *link;
- DBusString progs;
-#ifndef DBUS_UNIX
- const char *common_progs;
-#endif
- int i;
-
- /* On Unix we don't actually use this variable, but it's easier to handle the
- * deallocation if we always allocate it, whether needed or not */
- if (!_dbus_string_init (&progs))
- _dbus_assert_not_reached ("OOM allocating progs");
-
-#ifndef DBUS_UNIX
- common_progs = _dbus_getenv ("CommonProgramFiles");
-
- if (common_progs)
- {
- if (!_dbus_string_append (&progs, common_progs))
- {
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- if (!_dbus_string_append (&progs, "/dbus-1/system-services"))
- {
- _dbus_string_free (&progs);
- return FALSE;
- }
- test_system_service_dir_matches[1] = _dbus_string_get_const_data(&progs);
- }
-#endif
- dirs = NULL;
-
- printf ("Testing retrieving the default system service directories\n");
- if (!_dbus_get_standard_system_servicedirs (&dirs))
- _dbus_assert_not_reached ("couldn't get stardard dirs");
-
- /* make sure our defaults end with share/dbus-1/system-service */
- while ((link = _dbus_list_pop_first_link (&dirs)))
- {
- DBusString path;
-
- printf (" default service dir: %s\n", (char *)link->data);
- _dbus_string_init_const (&path, (char *)link->data);
- if (!_dbus_string_ends_with_c_str (&path, "dbus-1/system-services"))
- {
- printf ("error with default system service directories\n");
- dbus_free (link->data);
- _dbus_list_free_link (link);
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- dbus_free (link->data);
- _dbus_list_free_link (link);
- }
-
-#ifdef DBUS_UNIX
- if (!dbus_setenv ("XDG_DATA_HOME", "/testhome/foo/.testlocal/testshare"))
- _dbus_assert_not_reached ("couldn't setenv XDG_DATA_HOME");
-
- if (!dbus_setenv ("XDG_DATA_DIRS", ":/testusr/testlocal/testshare: :/testusr/testshare:"))
- _dbus_assert_not_reached ("couldn't setenv XDG_DATA_DIRS");
-#endif
- if (!_dbus_get_standard_system_servicedirs (&dirs))
- _dbus_assert_not_reached ("couldn't get stardard dirs");
-
- /* make sure we read and parse the env variable correctly */
- i = 0;
- while ((link = _dbus_list_pop_first_link (&dirs)))
- {
- printf (" test service dir: %s\n", (char *)link->data);
- if (test_system_service_dir_matches[i] == NULL)
- {
- printf ("more directories parsed than in match set\n");
- dbus_free (link->data);
- _dbus_list_free_link (link);
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- if (strcmp (test_system_service_dir_matches[i],
- (char *)link->data) != 0)
- {
- printf ("%s directory does not match %s in the match set\n",
- (char *)link->data,
- test_system_service_dir_matches[i]);
- dbus_free (link->data);
- _dbus_list_free_link (link);
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- ++i;
-
- dbus_free (link->data);
- _dbus_list_free_link (link);
- }
-
- if (test_system_service_dir_matches[i] != NULL)
- {
- printf ("extra data %s in the match set was not matched\n",
- test_system_service_dir_matches[i]);
-
- _dbus_string_free (&progs);
- return FALSE;
- }
-
- _dbus_string_free (&progs);
- return TRUE;
-}
-
-dbus_bool_t
-bus_config_parser_test (const DBusString *test_data_dir)
-{
- if (test_data_dir == NULL ||
- _dbus_string_get_length (test_data_dir) == 0)
- {
- printf ("No test data\n");
- return TRUE;
- }
-
- if (!test_default_session_servicedirs())
- return FALSE;
-
-#ifdef DBUS_WIN
- printf("default system service dir skipped\n");
-#else
- if (!test_default_system_servicedirs())
- return FALSE;
-#endif
-
- if (!process_test_valid_subdir (test_data_dir, "valid-config-files", VALID))
- return FALSE;
-
- if (!process_test_valid_subdir (test_data_dir, "invalid-config-files", INVALID))
- return FALSE;
-
- if (!process_test_equiv_subdir (test_data_dir, "equiv-config-files"))
- return FALSE;
-
- return TRUE;
-}
-
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
-
diff --git a/src/3rd_party/dbus-1.7.8/bus/config-parser.h b/src/3rd_party/dbus-1.7.8/bus/config-parser.h
deleted file mode 100644
index ba5bf74906..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/config-parser.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* config-parser.h XML-library-agnostic configuration file parser
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_CONFIG_PARSER_H
-#define BUS_CONFIG_PARSER_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-hash.h>
-#include "bus.h"
-
-/* Whatever XML library we're using just pushes data into this API */
-
-typedef struct BusConfigParser BusConfigParser;
-
-BusConfigParser* bus_config_parser_new (const DBusString *basedir,
- dbus_bool_t is_toplevel,
- const BusConfigParser *parent);
-
-BusConfigParser* bus_config_parser_ref (BusConfigParser *parser);
-void bus_config_parser_unref (BusConfigParser *parser);
-dbus_bool_t bus_config_parser_check_doctype (BusConfigParser *parser,
- const char *doctype,
- DBusError *error);
-dbus_bool_t bus_config_parser_start_element (BusConfigParser *parser,
- const char *element_name,
- const char **attribute_names,
- const char **attribute_values,
- DBusError *error);
-dbus_bool_t bus_config_parser_end_element (BusConfigParser *parser,
- const char *element_name,
- DBusError *error);
-dbus_bool_t bus_config_parser_content (BusConfigParser *parser,
- const DBusString *content,
- DBusError *error);
-dbus_bool_t bus_config_parser_finished (BusConfigParser *parser,
- DBusError *error);
-
-/* Functions for extracting the parse results */
-const char* bus_config_parser_get_user (BusConfigParser *parser);
-const char* bus_config_parser_get_type (BusConfigParser *parser);
-DBusList** bus_config_parser_get_addresses (BusConfigParser *parser);
-DBusList** bus_config_parser_get_mechanisms (BusConfigParser *parser);
-dbus_bool_t bus_config_parser_get_fork (BusConfigParser *parser);
-dbus_bool_t bus_config_parser_get_allow_anonymous (BusConfigParser *parser);
-dbus_bool_t bus_config_parser_get_syslog (BusConfigParser *parser);
-dbus_bool_t bus_config_parser_get_keep_umask (BusConfigParser *parser);
-const char* bus_config_parser_get_pidfile (BusConfigParser *parser);
-const char* bus_config_parser_get_servicehelper (BusConfigParser *parser);
-DBusList** bus_config_parser_get_service_dirs (BusConfigParser *parser);
-DBusList** bus_config_parser_get_conf_dirs (BusConfigParser *parser);
-BusPolicy* bus_config_parser_steal_policy (BusConfigParser *parser);
-void bus_config_parser_get_limits (BusConfigParser *parser,
- BusLimits *limits);
-
-DBusHashTable* bus_config_parser_steal_service_context_table (BusConfigParser *parser);
-
-/* Loader functions (backended off one of the XML parsers). Returns a
- * finished ConfigParser.
- */
-BusConfigParser* bus_config_load (const DBusString *file,
- dbus_bool_t is_toplevel,
- const BusConfigParser *parent,
- DBusError *error);
-
-#endif /* BUS_CONFIG_PARSER_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/connection.c b/src/3rd_party/dbus-1.7.8/bus/connection.c
deleted file mode 100644
index fddbc78a5d..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/connection.c
+++ /dev/null
@@ -1,2387 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* connection.c Client connections
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "connection.h"
-#include "dispatch.h"
-#include "policy.h"
-#include "services.h"
-#include "utils.h"
-#include "signals.h"
-#include "expirelist.h"
-#include "selinux.h"
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-hash.h>
-#include <dbus/dbus-timeout.h>
-
-/* Trim executed commands to this length; we want to keep logs readable */
-#define MAX_LOG_COMMAND_LEN 50
-
-static void bus_connection_remove_transactions (DBusConnection *connection);
-
-typedef struct
-{
- BusExpireItem expire_item;
-
- DBusConnection *will_get_reply;
- DBusConnection *will_send_reply;
-
- dbus_uint32_t reply_serial;
-
-} BusPendingReply;
-
-struct BusConnections
-{
- int refcount;
- DBusList *completed; /**< List of all completed connections */
- int n_completed; /**< Length of completed list */
- DBusList *incomplete; /**< List of all not-yet-active connections */
- int n_incomplete; /**< Length of incomplete list */
- BusContext *context;
- DBusHashTable *completed_by_user; /**< Number of completed connections for each UID */
- DBusTimeout *expire_timeout; /**< Timeout for expiring incomplete connections. */
- int stamp; /**< Incrementing number */
- BusExpireList *pending_replies; /**< List of pending replies */
-
-#ifdef DBUS_ENABLE_STATS
- int total_match_rules;
- int peak_match_rules;
- int peak_match_rules_per_conn;
-
- int total_bus_names;
- int peak_bus_names;
- int peak_bus_names_per_conn;
-#endif
-};
-
-static dbus_int32_t connection_data_slot = -1;
-
-typedef struct
-{
- BusConnections *connections;
- DBusList *link_in_connection_list;
- DBusConnection *connection;
- DBusList *services_owned;
- int n_services_owned;
- DBusList *match_rules;
- int n_match_rules;
- char *name;
- DBusList *transaction_messages; /**< Stuff we need to send as part of a transaction */
- DBusMessage *oom_message;
- DBusPreallocatedSend *oom_preallocated;
- BusClientPolicy *policy;
-
- char *cached_loginfo_string;
- BusSELinuxID *selinux_id;
-
- long connection_tv_sec; /**< Time when we connected (seconds component) */
- long connection_tv_usec; /**< Time when we connected (microsec component) */
- int stamp; /**< connections->stamp last time we were traversed */
-
-#ifdef DBUS_ENABLE_STATS
- int peak_match_rules;
- int peak_bus_names;
-#endif
-} BusConnectionData;
-
-static dbus_bool_t bus_pending_reply_expired (BusExpireList *list,
- DBusList *link,
- void *data);
-
-static void bus_connection_drop_pending_replies (BusConnections *connections,
- DBusConnection *connection);
-
-static dbus_bool_t expire_incomplete_timeout (void *data);
-
-#define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot))
-
-static DBusLoop*
-connection_get_loop (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- return bus_context_get_loop (d->connections->context);
-}
-
-
-static int
-get_connections_for_uid (BusConnections *connections,
- dbus_uid_t uid)
-{
- void *val;
- int current_count;
-
- /* val is NULL is 0 when it isn't in the hash yet */
-
- val = _dbus_hash_table_lookup_uintptr (connections->completed_by_user,
- uid);
-
- current_count = _DBUS_POINTER_TO_INT (val);
-
- return current_count;
-}
-
-static dbus_bool_t
-adjust_connections_for_uid (BusConnections *connections,
- dbus_uid_t uid,
- int adjustment)
-{
- int current_count;
-
- current_count = get_connections_for_uid (connections, uid);
-
- _dbus_verbose ("Adjusting connection count for UID " DBUS_UID_FORMAT
- ": was %d adjustment %d making %d\n",
- uid, current_count, adjustment, current_count + adjustment);
-
- _dbus_assert (current_count >= 0);
-
- current_count += adjustment;
-
- _dbus_assert (current_count >= 0);
-
- if (current_count == 0)
- {
- _dbus_hash_table_remove_uintptr (connections->completed_by_user, uid);
- return TRUE;
- }
- else
- {
- dbus_bool_t retval;
-
- retval = _dbus_hash_table_insert_uintptr (connections->completed_by_user,
- uid, _DBUS_INT_TO_POINTER (current_count));
-
- /* only positive adjustment can fail as otherwise
- * a hash entry should already exist
- */
- _dbus_assert (adjustment > 0 ||
- (adjustment <= 0 && retval));
-
- return retval;
- }
-}
-
-void
-bus_connection_disconnected (DBusConnection *connection)
-{
- BusConnectionData *d;
- BusService *service;
- BusMatchmaker *matchmaker;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n",
- d->name ? d->name : "(inactive)");
-
- /* Delete our match rules */
- if (d->n_match_rules > 0)
- {
- matchmaker = bus_context_get_matchmaker (d->connections->context);
- bus_matchmaker_disconnected (matchmaker, connection);
- }
-
- /* Drop any service ownership. Unfortunately, this requires
- * memory allocation and there doesn't seem to be a good way to
- * handle it other than sleeping; we can't "fail" the operation of
- * disconnecting a client, and preallocating a broadcast "service is
- * now gone" message for every client-service pair seems kind of
- * involved.
- */
- while ((service = _dbus_list_get_last (&d->services_owned)))
- {
- BusTransaction *transaction;
- DBusError error;
-
- retry:
-
- dbus_error_init (&error);
-
- while ((transaction = bus_transaction_new (d->connections->context)) == NULL)
- _dbus_wait_for_memory ();
-
- if (!bus_service_remove_owner (service, connection,
- transaction, &error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (&error);
-
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_error_free (&error);
- bus_transaction_cancel_and_free (transaction);
- _dbus_wait_for_memory ();
- goto retry;
- }
- else
- {
- _dbus_verbose ("Failed to remove service owner: %s %s\n",
- error.name, error.message);
- _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason");
- }
- }
-
- bus_transaction_execute_and_free (transaction);
- }
-
- bus_dispatch_remove_connection (connection);
-
- /* no more watching */
- if (!dbus_connection_set_watch_functions (connection,
- NULL, NULL, NULL,
- connection,
- NULL))
- _dbus_assert_not_reached ("setting watch functions to NULL failed");
-
- if (!dbus_connection_set_timeout_functions (connection,
- NULL, NULL, NULL,
- connection,
- NULL))
- _dbus_assert_not_reached ("setting timeout functions to NULL failed");
-
- dbus_connection_set_unix_user_function (connection,
- NULL, NULL, NULL);
- dbus_connection_set_windows_user_function (connection,
- NULL, NULL, NULL);
-
- dbus_connection_set_dispatch_status_function (connection,
- NULL, NULL, NULL);
-
- bus_connection_remove_transactions (connection);
-
- if (d->link_in_connection_list != NULL)
- {
- if (d->name != NULL)
- {
- unsigned long uid;
-
- _dbus_list_remove_link (&d->connections->completed, d->link_in_connection_list);
- d->link_in_connection_list = NULL;
- d->connections->n_completed -= 1;
-
- if (dbus_connection_get_unix_user (connection, &uid))
- {
- if (!adjust_connections_for_uid (d->connections,
- uid, -1))
- _dbus_assert_not_reached ("adjusting downward should never fail");
- }
- }
- else
- {
- _dbus_list_remove_link (&d->connections->incomplete, d->link_in_connection_list);
- d->link_in_connection_list = NULL;
- d->connections->n_incomplete -= 1;
- }
-
- _dbus_assert (d->connections->n_incomplete >= 0);
- _dbus_assert (d->connections->n_completed >= 0);
- }
-
- bus_connection_drop_pending_replies (d->connections, connection);
-
- /* frees "d" as side effect */
- dbus_connection_set_data (connection,
- connection_data_slot,
- NULL, NULL);
-
- dbus_connection_unref (connection);
-}
-
-static dbus_bool_t
-add_connection_watch (DBusWatch *watch,
- void *data)
-{
- DBusConnection *connection = data;
-
- return _dbus_loop_add_watch (connection_get_loop (connection), watch);
-}
-
-static void
-remove_connection_watch (DBusWatch *watch,
- void *data)
-{
- DBusConnection *connection = data;
-
- _dbus_loop_remove_watch (connection_get_loop (connection), watch);
-}
-
-static void
-toggle_connection_watch (DBusWatch *watch,
- void *data)
-{
- DBusConnection *connection = data;
-
- _dbus_loop_toggle_watch (connection_get_loop (connection), watch);
-}
-
-static dbus_bool_t
-add_connection_timeout (DBusTimeout *timeout,
- void *data)
-{
- DBusConnection *connection = data;
-
- return _dbus_loop_add_timeout (connection_get_loop (connection), timeout);
-}
-
-static void
-remove_connection_timeout (DBusTimeout *timeout,
- void *data)
-{
- DBusConnection *connection = data;
-
- _dbus_loop_remove_timeout (connection_get_loop (connection), timeout);
-}
-
-static void
-dispatch_status_function (DBusConnection *connection,
- DBusDispatchStatus new_status,
- void *data)
-{
- DBusLoop *loop = data;
-
- if (new_status != DBUS_DISPATCH_COMPLETE)
- {
- while (!_dbus_loop_queue_dispatch (loop, connection))
- _dbus_wait_for_memory ();
- }
-}
-
-static dbus_bool_t
-allow_unix_user_function (DBusConnection *connection,
- unsigned long uid,
- void *data)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- return bus_context_allow_unix_user (d->connections->context, uid);
-}
-
-static void
-free_connection_data (void *data)
-{
- BusConnectionData *d = data;
-
- /* services_owned should be NULL since we should be disconnected */
- _dbus_assert (d->services_owned == NULL);
- _dbus_assert (d->n_services_owned == 0);
- /* similarly */
- _dbus_assert (d->transaction_messages == NULL);
-
- if (d->oom_preallocated)
- dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated);
-
- if (d->oom_message)
- dbus_message_unref (d->oom_message);
-
- if (d->policy)
- bus_client_policy_unref (d->policy);
-
- if (d->selinux_id)
- bus_selinux_id_unref (d->selinux_id);
-
- dbus_free (d->cached_loginfo_string);
-
- dbus_free (d->name);
-
- dbus_free (d);
-}
-
-BusConnections*
-bus_connections_new (BusContext *context)
-{
- BusConnections *connections;
-
- if (!dbus_connection_allocate_data_slot (&connection_data_slot))
- goto failed_0;
-
- connections = dbus_new0 (BusConnections, 1);
- if (connections == NULL)
- goto failed_1;
-
- connections->completed_by_user = _dbus_hash_table_new (DBUS_HASH_UINTPTR,
- NULL, NULL);
- if (connections->completed_by_user == NULL)
- goto failed_2;
-
- connections->expire_timeout = _dbus_timeout_new (100, /* irrelevant */
- expire_incomplete_timeout,
- connections, NULL);
- if (connections->expire_timeout == NULL)
- goto failed_3;
-
- _dbus_timeout_set_enabled (connections->expire_timeout, FALSE);
-
- connections->pending_replies = bus_expire_list_new (bus_context_get_loop (context),
- bus_context_get_reply_timeout (context),
- bus_pending_reply_expired,
- connections);
- if (connections->pending_replies == NULL)
- goto failed_4;
-
- if (!_dbus_loop_add_timeout (bus_context_get_loop (context),
- connections->expire_timeout))
- goto failed_5;
-
- connections->refcount = 1;
- connections->context = context;
-
- return connections;
-
- failed_5:
- bus_expire_list_free (connections->pending_replies);
- failed_4:
- _dbus_timeout_unref (connections->expire_timeout);
- failed_3:
- _dbus_hash_table_unref (connections->completed_by_user);
- failed_2:
- dbus_free (connections);
- failed_1:
- dbus_connection_free_data_slot (&connection_data_slot);
- failed_0:
- return NULL;
-}
-
-BusConnections *
-bus_connections_ref (BusConnections *connections)
-{
- _dbus_assert (connections->refcount > 0);
- connections->refcount += 1;
-
- return connections;
-}
-
-void
-bus_connections_unref (BusConnections *connections)
-{
- _dbus_assert (connections->refcount > 0);
- connections->refcount -= 1;
- if (connections->refcount == 0)
- {
- /* drop all incomplete */
- while (connections->incomplete != NULL)
- {
- DBusConnection *connection;
-
- connection = connections->incomplete->data;
-
- dbus_connection_ref (connection);
- dbus_connection_close (connection);
- bus_connection_disconnected (connection);
- dbus_connection_unref (connection);
- }
-
- _dbus_assert (connections->n_incomplete == 0);
-
- /* drop all real connections */
- while (connections->completed != NULL)
- {
- DBusConnection *connection;
-
- connection = connections->completed->data;
-
- dbus_connection_ref (connection);
- dbus_connection_close (connection);
- bus_connection_disconnected (connection);
- dbus_connection_unref (connection);
- }
-
- _dbus_assert (connections->n_completed == 0);
-
- bus_expire_list_free (connections->pending_replies);
-
- _dbus_loop_remove_timeout (bus_context_get_loop (connections->context),
- connections->expire_timeout);
-
- _dbus_timeout_unref (connections->expire_timeout);
-
- _dbus_hash_table_unref (connections->completed_by_user);
-
- dbus_free (connections);
-
- dbus_connection_free_data_slot (&connection_data_slot);
- }
-}
-
-/* Used for logging */
-static dbus_bool_t
-cache_peer_loginfo_string (BusConnectionData *d,
- DBusConnection *connection)
-{
- DBusString loginfo_buf;
- unsigned long uid;
- unsigned long pid;
- char *windows_sid;
- dbus_bool_t prev_added;
-
- if (!_dbus_string_init (&loginfo_buf))
- return FALSE;
-
- prev_added = FALSE;
- if (dbus_connection_get_unix_user (connection, &uid))
- {
- if (!_dbus_string_append_printf (&loginfo_buf, "uid=%ld", uid))
- goto oom;
- else
- prev_added = TRUE;
- }
-
- if (dbus_connection_get_unix_process_id (connection, &pid))
- {
- if (prev_added)
- {
- if (!_dbus_string_append_byte (&loginfo_buf, ' '))
- goto oom;
- }
- if (!_dbus_string_append_printf (&loginfo_buf, "pid=%ld comm=\"", pid))
- goto oom;
- /* Ignore errors here; we may not have permissions to read the
- * proc file. */
- _dbus_command_for_pid (pid, &loginfo_buf, MAX_LOG_COMMAND_LEN, NULL);
- if (!_dbus_string_append_byte (&loginfo_buf, '"'))
- goto oom;
- }
-
- if (dbus_connection_get_windows_user (connection, &windows_sid))
- {
- dbus_bool_t did_append;
- did_append = _dbus_string_append_printf (&loginfo_buf,
- "sid=\"%s\" ", windows_sid);
- dbus_free (windows_sid);
- if (!did_append)
- goto oom;
- }
-
- if (!_dbus_string_steal_data (&loginfo_buf, &(d->cached_loginfo_string)))
- goto oom;
-
- _dbus_string_free (&loginfo_buf);
-
- return TRUE;
-oom:
- _dbus_string_free (&loginfo_buf);
- return FALSE;
-}
-
-dbus_bool_t
-bus_connections_setup_connection (BusConnections *connections,
- DBusConnection *connection)
-{
-
- BusConnectionData *d;
- dbus_bool_t retval;
- DBusError error;
-
-
- d = dbus_new0 (BusConnectionData, 1);
-
- if (d == NULL)
- return FALSE;
-
- d->connections = connections;
- d->connection = connection;
-
- _dbus_get_monotonic_time (&d->connection_tv_sec,
- &d->connection_tv_usec);
-
- _dbus_assert (connection_data_slot >= 0);
-
- if (!dbus_connection_set_data (connection,
- connection_data_slot,
- d, free_connection_data))
- {
- dbus_free (d);
- return FALSE;
- }
-
- dbus_connection_set_route_peer_messages (connection, TRUE);
-
- retval = FALSE;
-
- dbus_error_init (&error);
- d->selinux_id = bus_selinux_init_connection_id (connection,
- &error);
- if (dbus_error_is_set (&error))
- {
- /* This is a bit bogus because we pretend all errors
- * are OOM; this is done because we know that in bus.c
- * an OOM error disconnects the connection, which is
- * the same thing we want on any other error.
- */
- dbus_error_free (&error);
- goto out;
- }
-
- if (!dbus_connection_set_watch_functions (connection,
- add_connection_watch,
- remove_connection_watch,
- toggle_connection_watch,
- connection,
- NULL))
- goto out;
-
- if (!dbus_connection_set_timeout_functions (connection,
- add_connection_timeout,
- remove_connection_timeout,
- NULL,
- connection, NULL))
- goto out;
-
- /* For now we don't need to set a Windows user function because
- * there are no policies in the config file controlling what
- * Windows users can connect. The default 'same user that owns the
- * bus can connect' behavior of DBusConnection is fine on Windows.
- */
- dbus_connection_set_unix_user_function (connection,
- allow_unix_user_function,
- NULL, NULL);
-
- dbus_connection_set_dispatch_status_function (connection,
- dispatch_status_function,
- bus_context_get_loop (connections->context),
- NULL);
-
- d->link_in_connection_list = _dbus_list_alloc_link (connection);
- if (d->link_in_connection_list == NULL)
- goto out;
-
- /* Setup the connection with the dispatcher */
- if (!bus_dispatch_add_connection (connection))
- goto out;
-
- if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE)
- {
- if (!_dbus_loop_queue_dispatch (bus_context_get_loop (connections->context), connection))
- {
- bus_dispatch_remove_connection (connection);
- goto out;
- }
- }
-
- _dbus_list_append_link (&connections->incomplete, d->link_in_connection_list);
- connections->n_incomplete += 1;
-
- dbus_connection_ref (connection);
-
- /* Note that we might disconnect ourselves here, but it only takes
- * effect on return to the main loop. We call this to free up
- * expired connections if possible, and to queue the timeout for our
- * own expiration.
- */
- bus_connections_expire_incomplete (connections);
-
- /* And we might also disconnect ourselves here, but again it
- * only takes effect on return to main loop.
- */
- if (connections->n_incomplete >
- bus_context_get_max_incomplete_connections (connections->context))
- {
- _dbus_verbose ("Number of incomplete connections exceeds max, dropping oldest one\n");
-
- _dbus_assert (connections->incomplete != NULL);
- /* Disconnect the oldest unauthenticated connection. FIXME
- * would it be more secure to drop a *random* connection? This
- * algorithm seems to mean that if someone can create new
- * connections quickly enough, they can keep anyone else from
- * completing authentication. But random may or may not really
- * help with that, a more elaborate solution might be required.
- */
- dbus_connection_close (connections->incomplete->data);
- }
-
- retval = TRUE;
-
- out:
- if (!retval)
- {
- if (d->selinux_id)
- bus_selinux_id_unref (d->selinux_id);
- d->selinux_id = NULL;
-
- if (!dbus_connection_set_watch_functions (connection,
- NULL, NULL, NULL,
- connection,
- NULL))
- _dbus_assert_not_reached ("setting watch functions to NULL failed");
-
- if (!dbus_connection_set_timeout_functions (connection,
- NULL, NULL, NULL,
- connection,
- NULL))
- _dbus_assert_not_reached ("setting timeout functions to NULL failed");
-
- dbus_connection_set_unix_user_function (connection,
- NULL, NULL, NULL);
-
- dbus_connection_set_windows_user_function (connection,
- NULL, NULL, NULL);
-
- dbus_connection_set_dispatch_status_function (connection,
- NULL, NULL, NULL);
-
- if (d->link_in_connection_list != NULL)
- {
- _dbus_assert (d->link_in_connection_list->next == NULL);
- _dbus_assert (d->link_in_connection_list->prev == NULL);
- _dbus_list_free_link (d->link_in_connection_list);
- d->link_in_connection_list = NULL;
- }
-
- if (!dbus_connection_set_data (connection,
- connection_data_slot,
- NULL, NULL))
- _dbus_assert_not_reached ("failed to set connection data to null");
-
- /* "d" has now been freed */
- }
-
- return retval;
-}
-
-void
-bus_connections_expire_incomplete (BusConnections *connections)
-{
- int next_interval;
-
- next_interval = -1;
-
- if (connections->incomplete != NULL)
- {
- long tv_sec, tv_usec;
- DBusList *link;
- int auth_timeout;
-
- _dbus_get_monotonic_time (&tv_sec, &tv_usec);
- auth_timeout = bus_context_get_auth_timeout (connections->context);
-
- link = _dbus_list_get_first_link (&connections->incomplete);
- while (link != NULL)
- {
- DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link);
- DBusConnection *connection;
- BusConnectionData *d;
- double elapsed;
-
- connection = link->data;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- elapsed = ELAPSED_MILLISECONDS_SINCE (d->connection_tv_sec,
- d->connection_tv_usec,
- tv_sec, tv_usec);
-
- if (elapsed >= (double) auth_timeout)
- {
- _dbus_verbose ("Timing out authentication for connection %p\n", connection);
- dbus_connection_close (connection);
- }
- else
- {
- /* We can end the loop, since the connections are in oldest-first order */
- next_interval = ((double)auth_timeout) - elapsed;
- _dbus_verbose ("Connection %p authentication expires in %d milliseconds\n",
- connection, next_interval);
-
- break;
- }
-
- link = next;
- }
- }
-
- bus_expire_timeout_set_interval (connections->expire_timeout,
- next_interval);
-}
-
-static dbus_bool_t
-expire_incomplete_timeout (void *data)
-{
- BusConnections *connections = data;
-
- _dbus_verbose ("Running\n");
-
- /* note that this may remove the timeout */
- bus_connections_expire_incomplete (connections);
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_connection_get_unix_groups (DBusConnection *connection,
- unsigned long **groups,
- int *n_groups,
- DBusError *error)
-{
- unsigned long uid;
-
- *groups = NULL;
- *n_groups = 0;
-
- if (dbus_connection_get_unix_user (connection, &uid))
- {
- if (!_dbus_unix_groups_from_uid (uid, groups, n_groups))
- {
- _dbus_verbose ("Did not get any groups for UID %lu\n",
- uid);
- return FALSE;
- }
- else
- {
- _dbus_verbose ("Got %d groups for UID %lu\n",
- *n_groups, uid);
- return TRUE;
- }
- }
- else
- return TRUE; /* successfully got 0 groups */
-}
-
-dbus_bool_t
-bus_connection_is_in_unix_group (DBusConnection *connection,
- unsigned long gid)
-{
- int i;
- unsigned long *group_ids;
- int n_group_ids;
-
- if (!bus_connection_get_unix_groups (connection, &group_ids, &n_group_ids,
- NULL))
- return FALSE;
-
- i = 0;
- while (i < n_group_ids)
- {
- if (group_ids[i] == gid)
- {
- dbus_free (group_ids);
- return TRUE;
- }
- ++i;
- }
-
- dbus_free (group_ids);
- return FALSE;
-}
-
-const char *
-bus_connection_get_loginfo (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- if (!bus_connection_is_active (connection))
- return "inactive";
- return d->cached_loginfo_string;
-}
-
-BusClientPolicy*
-bus_connection_get_policy (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
- _dbus_assert (d->policy != NULL);
-
- return d->policy;
-}
-
-static dbus_bool_t
-foreach_active (BusConnections *connections,
- BusConnectionForeachFunction function,
- void *data)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (&connections->completed);
- while (link != NULL)
- {
- DBusConnection *connection = link->data;
- DBusList *next = _dbus_list_get_next_link (&connections->completed, link);
-
- if (!(* function) (connection, data))
- return FALSE;
-
- link = next;
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-foreach_inactive (BusConnections *connections,
- BusConnectionForeachFunction function,
- void *data)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (&connections->incomplete);
- while (link != NULL)
- {
- DBusConnection *connection = link->data;
- DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link);
-
- if (!(* function) (connection, data))
- return FALSE;
-
- link = next;
- }
-
- return TRUE;
-}
-
-/**
- * Calls function on each active connection; if the function returns
- * #FALSE, stops iterating. Active connections are authenticated
- * and have sent a Hello message.
- *
- * @param connections the connections object
- * @param function the function
- * @param data data to pass to it as a second arg
- */
-void
-bus_connections_foreach_active (BusConnections *connections,
- BusConnectionForeachFunction function,
- void *data)
-{
- foreach_active (connections, function, data);
-}
-
-/**
- * Calls function on each connection; if the function returns
- * #FALSE, stops iterating.
- *
- * @param connections the connections object
- * @param function the function
- * @param data data to pass to it as a second arg
- */
-void
-bus_connections_foreach (BusConnections *connections,
- BusConnectionForeachFunction function,
- void *data)
-{
- if (!foreach_active (connections, function, data))
- return;
-
- foreach_inactive (connections, function, data);
-}
-
-BusContext*
-bus_connections_get_context (BusConnections *connections)
-{
- return connections->context;
-}
-
-/*
- * This is used to avoid covering the same connection twice when
- * traversing connections. Note that it assumes we will
- * bus_connection_mark_stamp() each connection at least once per
- * INT_MAX increments of the global stamp, or wraparound would break
- * things.
- */
-void
-bus_connections_increment_stamp (BusConnections *connections)
-{
- connections->stamp += 1;
-}
-
-/* Mark connection with current stamp, return TRUE if it
- * didn't already have that stamp
- */
-dbus_bool_t
-bus_connection_mark_stamp (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- if (d->stamp == d->connections->stamp)
- return FALSE;
- else
- {
- d->stamp = d->connections->stamp;
- return TRUE;
- }
-}
-
-BusContext*
-bus_connection_get_context (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- return d->connections->context;
-}
-
-BusConnections*
-bus_connection_get_connections (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- return d->connections;
-}
-
-BusRegistry*
-bus_connection_get_registry (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- return bus_context_get_registry (d->connections->context);
-}
-
-BusActivation*
-bus_connection_get_activation (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- return bus_context_get_activation (d->connections->context);
-}
-
-BusMatchmaker*
-bus_connection_get_matchmaker (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- return bus_context_get_matchmaker (d->connections->context);
-}
-
-BusSELinuxID*
-bus_connection_get_selinux_id (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- return d->selinux_id;
-}
-
-/**
- * Checks whether the connection is registered with the message bus.
- *
- * @param connection the connection
- * @returns #TRUE if we're an active message bus participant
- */
-dbus_bool_t
-bus_connection_is_active (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- return d != NULL && d->name != NULL;
-}
-
-dbus_bool_t
-bus_connection_preallocate_oom_error (DBusConnection *connection)
-{
- DBusMessage *message;
- DBusPreallocatedSend *preallocated;
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
-
- if (d->oom_preallocated != NULL)
- return TRUE;
-
- preallocated = dbus_connection_preallocate_send (connection);
- if (preallocated == NULL)
- return FALSE;
-
- message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR);
-
- if (message == NULL)
- {
- dbus_connection_free_preallocated_send (connection, preallocated);
- return FALSE;
- }
-
- /* d->name may be NULL, but that is OK */
- if (!dbus_message_set_error_name (message, DBUS_ERROR_NO_MEMORY) ||
- !dbus_message_set_destination (message, d->name) ||
- !dbus_message_set_sender (message,
- DBUS_SERVICE_DBUS))
- {
- dbus_connection_free_preallocated_send (connection, preallocated);
- dbus_message_unref (message);
- return FALSE;
- }
-
- /* set reply serial to placeholder value just so space is already allocated
- * for it.
- */
- if (!dbus_message_set_reply_serial (message, 14))
- {
- dbus_connection_free_preallocated_send (connection, preallocated);
- dbus_message_unref (message);
- return FALSE;
- }
-
- d->oom_message = message;
- d->oom_preallocated = preallocated;
-
- return TRUE;
-}
-
-void
-bus_connection_send_oom_error (DBusConnection *connection,
- DBusMessage *in_reply_to)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
-
- _dbus_assert (d != NULL);
- _dbus_assert (d->oom_message != NULL);
-
- /* should always succeed since we set it to a placeholder earlier */
- if (!dbus_message_set_reply_serial (d->oom_message,
- dbus_message_get_serial (in_reply_to)))
- _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message");
-
- _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL);
-
- dbus_connection_send_preallocated (connection, d->oom_preallocated,
- d->oom_message, NULL);
-
- dbus_message_unref (d->oom_message);
- d->oom_message = NULL;
- d->oom_preallocated = NULL;
-}
-
-#ifdef DBUS_ENABLE_STATS
-static void
-update_peak (int *peak,
- int n)
-{
- if (*peak < n)
- *peak = n;
-}
-#endif
-
-void
-bus_connection_add_match_rule_link (DBusConnection *connection,
- DBusList *link)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- _dbus_list_append_link (&d->match_rules, link);
-
- d->n_match_rules += 1;
-
-#ifdef DBUS_ENABLE_STATS
- update_peak (&d->peak_match_rules, d->n_match_rules);
- update_peak (&d->connections->peak_match_rules_per_conn, d->n_match_rules);
-
- d->connections->total_match_rules += 1;
- update_peak (&d->connections->peak_match_rules,
- d->connections->total_match_rules);
-#endif
-}
-
-dbus_bool_t
-bus_connection_add_match_rule (DBusConnection *connection,
- BusMatchRule *rule)
-{
- DBusList *link;
-
- link = _dbus_list_alloc_link (rule);
-
- if (link == NULL)
- return FALSE;
-
- bus_connection_add_match_rule_link (connection, link);
-
- return TRUE;
-}
-
-void
-bus_connection_remove_match_rule (DBusConnection *connection,
- BusMatchRule *rule)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- _dbus_list_remove_last (&d->match_rules, rule);
-
- d->n_match_rules -= 1;
- _dbus_assert (d->n_match_rules >= 0);
-
-#ifdef DBUS_ENABLE_STATS
- d->connections->total_match_rules -= 1;
-#endif
-}
-
-int
-bus_connection_get_n_match_rules (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- return d->n_match_rules;
-}
-
-void
-bus_connection_add_owned_service_link (DBusConnection *connection,
- DBusList *link)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- _dbus_list_append_link (&d->services_owned, link);
-
- d->n_services_owned += 1;
-
-#ifdef DBUS_ENABLE_STATS
- update_peak (&d->peak_bus_names, d->n_services_owned);
- update_peak (&d->connections->peak_bus_names_per_conn,
- d->n_services_owned);
-
- d->connections->total_bus_names += 1;
- update_peak (&d->connections->peak_bus_names,
- d->connections->total_bus_names);
-#endif
-}
-
-dbus_bool_t
-bus_connection_add_owned_service (DBusConnection *connection,
- BusService *service)
-{
- DBusList *link;
-
- link = _dbus_list_alloc_link (service);
-
- if (link == NULL)
- return FALSE;
-
- bus_connection_add_owned_service_link (connection, link);
-
- return TRUE;
-}
-
-void
-bus_connection_remove_owned_service (DBusConnection *connection,
- BusService *service)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- _dbus_list_remove_last (&d->services_owned, service);
-
- d->n_services_owned -= 1;
- _dbus_assert (d->n_services_owned >= 0);
-
-#ifdef DBUS_ENABLE_STATS
- d->connections->total_bus_names -= 1;
-#endif
-}
-
-int
-bus_connection_get_n_services_owned (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- return d->n_services_owned;
-}
-
-dbus_bool_t
-bus_connection_complete (DBusConnection *connection,
- const DBusString *name,
- DBusError *error)
-{
- BusConnectionData *d;
- unsigned long uid;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
- _dbus_assert (d->name == NULL);
- _dbus_assert (d->policy == NULL);
-
- _dbus_assert (!bus_connection_is_active (connection));
-
- if (!_dbus_string_copy_data (name, &d->name))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- _dbus_assert (d->name != NULL);
-
- _dbus_verbose ("Name %s assigned to %p\n", d->name, connection);
-
- d->policy = bus_context_create_client_policy (d->connections->context,
- connection,
- error);
-
- /* we may have a NULL policy on OOM or error getting list of
- * groups for a user. In the latter case we don't handle it so
- * well currently, as it will just keep failing over and over.
- */
-
- if (d->policy == NULL)
- {
- _dbus_verbose ("Failed to create security policy for connection %p\n",
- connection);
- _DBUS_ASSERT_ERROR_IS_SET (error);
- dbus_free (d->name);
- d->name = NULL;
- return FALSE;
- }
-
- if (dbus_connection_get_unix_user (connection, &uid))
- {
- if (!adjust_connections_for_uid (d->connections,
- uid, 1))
- goto fail;
- }
-
- /* Create and cache a string which holds information about the
- * peer process; used for logging purposes.
- */
- if (!cache_peer_loginfo_string (d, connection))
- goto fail;
-
- /* Now the connection is active, move it between lists */
- _dbus_list_unlink (&d->connections->incomplete,
- d->link_in_connection_list);
- d->connections->n_incomplete -= 1;
- _dbus_list_append_link (&d->connections->completed,
- d->link_in_connection_list);
- d->connections->n_completed += 1;
-
- _dbus_assert (d->connections->n_incomplete >= 0);
- _dbus_assert (d->connections->n_completed > 0);
-
- /* See if we can remove the timeout */
- bus_connections_expire_incomplete (d->connections);
-
- _dbus_assert (bus_connection_is_active (connection));
-
- return TRUE;
-fail:
- BUS_SET_OOM (error);
- dbus_free (d->name);
- d->name = NULL;
- if (d->policy)
- bus_client_policy_unref (d->policy);
- d->policy = NULL;
- return FALSE;
-}
-
-const char *
-bus_connection_get_name (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- return d->name;
-}
-
-/**
- * Check whether completing the passed-in connection would
- * exceed limits, and if so set error and return #FALSE
- */
-dbus_bool_t
-bus_connections_check_limits (BusConnections *connections,
- DBusConnection *requesting_completion,
- DBusError *error)
-{
- unsigned long uid;
-
- if (connections->n_completed >=
- bus_context_get_max_completed_connections (connections->context))
- {
- dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
- "The maximum number of active connections has been reached");
- return FALSE;
- }
-
- if (dbus_connection_get_unix_user (requesting_completion, &uid))
- {
- if (get_connections_for_uid (connections, uid) >=
- bus_context_get_max_connections_per_user (connections->context))
- {
- dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
- "The maximum number of active connections for UID %lu has been reached",
- uid);
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-static void
-bus_pending_reply_free (BusPendingReply *pending)
-{
- _dbus_verbose ("Freeing pending reply %p, replier %p receiver %p serial %u\n",
- pending,
- pending->will_send_reply,
- pending->will_get_reply,
- pending->reply_serial);
-
- dbus_free (pending);
-}
-
-static dbus_bool_t
-bus_pending_reply_send_no_reply (BusConnections *connections,
- BusTransaction *transaction,
- BusPendingReply *pending)
-{
- DBusMessage *message;
- DBusMessageIter iter;
- dbus_bool_t retval;
- const char *errmsg;
-
- retval = FALSE;
-
- message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR);
- if (message == NULL)
- return FALSE;
-
- dbus_message_set_no_reply (message, TRUE);
-
- if (!dbus_message_set_reply_serial (message,
- pending->reply_serial))
- goto out;
-
- if (!dbus_message_set_error_name (message,
- DBUS_ERROR_NO_REPLY))
- goto out;
-
- errmsg = "Message did not receive a reply (timeout by message bus)";
- dbus_message_iter_init_append (message, &iter);
- if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &errmsg))
- goto out;
-
- if (!bus_transaction_send_from_driver (transaction, pending->will_get_reply,
- message))
- goto out;
-
- retval = TRUE;
-
- out:
- dbus_message_unref (message);
- return retval;
-}
-
-static dbus_bool_t
-bus_pending_reply_expired (BusExpireList *list,
- DBusList *link,
- void *data)
-{
- BusPendingReply *pending = link->data;
- BusConnections *connections = data;
- BusTransaction *transaction;
-
- /* No reply is forthcoming. So nuke it if we can. If not,
- * leave it in the list to try expiring again later when we
- * get more memory.
- */
-
- _dbus_verbose ("Expiring pending reply %p, replier %p receiver %p serial %u\n",
- pending,
- pending->will_send_reply,
- pending->will_get_reply,
- pending->reply_serial);
-
- transaction = bus_transaction_new (connections->context);
- if (transaction == NULL)
- return FALSE;
-
- if (!bus_pending_reply_send_no_reply (connections,
- transaction,
- pending))
- {
- bus_transaction_cancel_and_free (transaction);
- return FALSE;
- }
-
- bus_expire_list_remove_link (connections->pending_replies, link);
-
- bus_pending_reply_free (pending);
- bus_transaction_execute_and_free (transaction);
-
- return TRUE;
-}
-
-static void
-bus_connection_drop_pending_replies (BusConnections *connections,
- DBusConnection *connection)
-{
- /* The DBusConnection is almost 100% finalized here, so you can't
- * do anything with it except check for pointer equality
- */
- DBusList *link;
-
- _dbus_verbose ("Dropping pending replies that involve connection %p\n",
- connection);
-
- link = bus_expire_list_get_first_link (connections->pending_replies);
- while (link != NULL)
- {
- DBusList *next;
- BusPendingReply *pending;
-
- next = bus_expire_list_get_next_link (connections->pending_replies,
- link);
- pending = link->data;
-
- if (pending->will_get_reply == connection)
- {
- /* We don't need to track this pending reply anymore */
-
- _dbus_verbose ("Dropping pending reply %p, replier %p receiver %p serial %u\n",
- pending,
- pending->will_send_reply,
- pending->will_get_reply,
- pending->reply_serial);
-
- bus_expire_list_remove_link (connections->pending_replies,
- link);
- bus_pending_reply_free (pending);
- }
- else if (pending->will_send_reply == connection)
- {
- /* The reply isn't going to be sent, so set things
- * up so it will be expired right away
- */
- _dbus_verbose ("Will expire pending reply %p, replier %p receiver %p serial %u\n",
- pending,
- pending->will_send_reply,
- pending->will_get_reply,
- pending->reply_serial);
-
- pending->will_send_reply = NULL;
- pending->expire_item.added_tv_sec = 0;
- pending->expire_item.added_tv_usec = 0;
-
- bus_expire_list_recheck_immediately (connections->pending_replies);
- }
-
- link = next;
- }
-}
-
-
-typedef struct
-{
- BusPendingReply *pending;
- BusConnections *connections;
-} CancelPendingReplyData;
-
-static void
-cancel_pending_reply (void *data)
-{
- CancelPendingReplyData *d = data;
-
- _dbus_verbose ("d = %p\n", d);
-
- if (!bus_expire_list_remove (d->connections->pending_replies,
- &d->pending->expire_item))
- _dbus_assert_not_reached ("pending reply did not exist to be cancelled");
-
- bus_pending_reply_free (d->pending); /* since it's been cancelled */
-}
-
-static void
-cancel_pending_reply_data_free (void *data)
-{
- CancelPendingReplyData *d = data;
-
- _dbus_verbose ("d = %p\n", d);
-
- /* d->pending should be either freed or still
- * in the list of pending replies (owned by someone
- * else)
- */
-
- dbus_free (d);
-}
-
-/*
- * Record that a reply is allowed; return TRUE on success.
- */
-dbus_bool_t
-bus_connections_expect_reply (BusConnections *connections,
- BusTransaction *transaction,
- DBusConnection *will_get_reply,
- DBusConnection *will_send_reply,
- DBusMessage *reply_to_this,
- DBusError *error)
-{
- BusPendingReply *pending;
- dbus_uint32_t reply_serial;
- DBusList *link;
- CancelPendingReplyData *cprd;
- int count;
-
- _dbus_assert (will_get_reply != NULL);
- _dbus_assert (will_send_reply != NULL);
- _dbus_assert (reply_to_this != NULL);
-
- if (dbus_message_get_no_reply (reply_to_this))
- return TRUE; /* we won't allow a reply, since client doesn't care for one. */
-
- reply_serial = dbus_message_get_serial (reply_to_this);
-
- link = bus_expire_list_get_first_link (connections->pending_replies);
- count = 0;
- while (link != NULL)
- {
- pending = link->data;
-
- if (pending->reply_serial == reply_serial &&
- pending->will_get_reply == will_get_reply &&
- pending->will_send_reply == will_send_reply)
- {
- dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
- "Message has the same reply serial as a currently-outstanding existing method call");
- return FALSE;
- }
-
- link = bus_expire_list_get_next_link (connections->pending_replies,
- link);
- if (pending->will_get_reply == will_get_reply)
- ++count;
- }
-
- if (count >=
- bus_context_get_max_replies_per_connection (connections->context))
- {
- dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
- "The maximum number of pending replies per connection has been reached");
- return FALSE;
- }
-
- pending = dbus_new0 (BusPendingReply, 1);
- if (pending == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
-#ifdef DBUS_ENABLE_VERBOSE_MODE
- /* so we can see a not-yet-added pending reply */
- pending->expire_item.added_tv_sec = 1;
- pending->expire_item.added_tv_usec = 1;
-#endif
-
- pending->will_get_reply = will_get_reply;
- pending->will_send_reply = will_send_reply;
- pending->reply_serial = reply_serial;
-
- cprd = dbus_new0 (CancelPendingReplyData, 1);
- if (cprd == NULL)
- {
- BUS_SET_OOM (error);
- bus_pending_reply_free (pending);
- return FALSE;
- }
-
- if (!bus_expire_list_add (connections->pending_replies,
- &pending->expire_item))
- {
- BUS_SET_OOM (error);
- dbus_free (cprd);
- bus_pending_reply_free (pending);
- return FALSE;
- }
-
- if (!bus_transaction_add_cancel_hook (transaction,
- cancel_pending_reply,
- cprd,
- cancel_pending_reply_data_free))
- {
- BUS_SET_OOM (error);
- bus_expire_list_remove (connections->pending_replies, &pending->expire_item);
- dbus_free (cprd);
- bus_pending_reply_free (pending);
- return FALSE;
- }
-
- cprd->pending = pending;
- cprd->connections = connections;
-
- _dbus_get_monotonic_time (&pending->expire_item.added_tv_sec,
- &pending->expire_item.added_tv_usec);
-
- _dbus_verbose ("Added pending reply %p, replier %p receiver %p serial %u\n",
- pending,
- pending->will_send_reply,
- pending->will_get_reply,
- pending->reply_serial);
-
- return TRUE;
-}
-
-typedef struct
-{
- DBusList *link;
- BusConnections *connections;
-} CheckPendingReplyData;
-
-static void
-cancel_check_pending_reply (void *data)
-{
- CheckPendingReplyData *d = data;
-
- _dbus_verbose ("d = %p\n",d);
-
- bus_expire_list_add_link (d->connections->pending_replies,
- d->link);
- d->link = NULL;
-}
-
-static void
-check_pending_reply_data_free (void *data)
-{
- CheckPendingReplyData *d = data;
-
- _dbus_verbose ("d = %p\n",d);
-
- if (d->link != NULL)
- {
- BusPendingReply *pending = d->link->data;
-
- _dbus_assert (!bus_expire_list_contains_item (d->connections->pending_replies,
- &pending->expire_item));
-
- bus_pending_reply_free (pending);
- _dbus_list_free_link (d->link);
- }
-
- dbus_free (d);
-}
-
-/*
- * Check whether a reply is allowed, remove BusPendingReply
- * if so, return TRUE if so.
- */
-dbus_bool_t
-bus_connections_check_reply (BusConnections *connections,
- BusTransaction *transaction,
- DBusConnection *sending_reply,
- DBusConnection *receiving_reply,
- DBusMessage *reply,
- DBusError *error)
-{
- CheckPendingReplyData *cprd;
- DBusList *link;
- dbus_uint32_t reply_serial;
-
- _dbus_assert (sending_reply != NULL);
- _dbus_assert (receiving_reply != NULL);
-
- reply_serial = dbus_message_get_reply_serial (reply);
-
- link = bus_expire_list_get_first_link (connections->pending_replies);
- while (link != NULL)
- {
- BusPendingReply *pending = link->data;
-
- if (pending->reply_serial == reply_serial &&
- pending->will_get_reply == receiving_reply &&
- pending->will_send_reply == sending_reply)
- {
- _dbus_verbose ("Found pending reply with serial %u\n", reply_serial);
- break;
- }
-
- link = bus_expire_list_get_next_link (connections->pending_replies,
- link);
- }
-
- if (link == NULL)
- {
- _dbus_verbose ("No pending reply expected\n");
-
- return FALSE;
- }
-
- cprd = dbus_new0 (CheckPendingReplyData, 1);
- if (cprd == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!bus_transaction_add_cancel_hook (transaction,
- cancel_check_pending_reply,
- cprd,
- check_pending_reply_data_free))
- {
- BUS_SET_OOM (error);
- dbus_free (cprd);
- return FALSE;
- }
-
- cprd->link = link;
- cprd->connections = connections;
-
- bus_expire_list_unlink (connections->pending_replies,
- link);
-
- _dbus_assert (!bus_expire_list_contains_item (connections->pending_replies, link->data));
-
- return TRUE;
-}
-
-/*
- * Transactions
- *
- * Note that this is fairly fragile; in particular, don't try to use
- * one transaction across any main loop iterations.
- */
-
-typedef struct
-{
- BusTransaction *transaction;
- DBusMessage *message;
- DBusPreallocatedSend *preallocated;
-} MessageToSend;
-
-typedef struct
-{
- BusTransactionCancelFunction cancel_function;
- DBusFreeFunction free_data_function;
- void *data;
-} CancelHook;
-
-struct BusTransaction
-{
- DBusList *connections;
- BusContext *context;
- DBusList *cancel_hooks;
-};
-
-static void
-message_to_send_free (DBusConnection *connection,
- MessageToSend *to_send)
-{
- if (to_send->message)
- dbus_message_unref (to_send->message);
-
- if (to_send->preallocated)
- dbus_connection_free_preallocated_send (connection, to_send->preallocated);
-
- dbus_free (to_send);
-}
-
-static void
-cancel_hook_cancel (void *element,
- void *data)
-{
- CancelHook *ch = element;
-
- _dbus_verbose ("Running transaction cancel hook\n");
-
- if (ch->cancel_function)
- (* ch->cancel_function) (ch->data);
-}
-
-static void
-cancel_hook_free (void *element,
- void *data)
-{
- CancelHook *ch = element;
-
- if (ch->free_data_function)
- (* ch->free_data_function) (ch->data);
-
- dbus_free (ch);
-}
-
-static void
-free_cancel_hooks (BusTransaction *transaction)
-{
- _dbus_list_foreach (&transaction->cancel_hooks,
- cancel_hook_free, NULL);
-
- _dbus_list_clear (&transaction->cancel_hooks);
-}
-
-BusTransaction*
-bus_transaction_new (BusContext *context)
-{
- BusTransaction *transaction;
-
- transaction = dbus_new0 (BusTransaction, 1);
- if (transaction == NULL)
- return NULL;
-
- transaction->context = context;
-
- return transaction;
-}
-
-BusContext*
-bus_transaction_get_context (BusTransaction *transaction)
-{
- return transaction->context;
-}
-
-BusConnections*
-bus_transaction_get_connections (BusTransaction *transaction)
-{
- return bus_context_get_connections (transaction->context);
-}
-
-dbus_bool_t
-bus_transaction_send_from_driver (BusTransaction *transaction,
- DBusConnection *connection,
- DBusMessage *message)
-{
- /* We have to set the sender to the driver, and have
- * to check security policy since it was not done in
- * dispatch.c
- */
- _dbus_verbose ("Sending %s %s %s from driver\n",
- dbus_message_get_interface (message) ?
- dbus_message_get_interface (message) : "(no interface)",
- dbus_message_get_member (message) ?
- dbus_message_get_member (message) : "(no member)",
- dbus_message_get_error_name (message) ?
- dbus_message_get_error_name (message) : "(no error name)");
-
- if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
- return FALSE;
-
- if (bus_connection_is_active (connection))
- {
- if (!dbus_message_set_destination (message,
- bus_connection_get_name (connection)))
- return FALSE;
- }
-
- /* bus driver never wants a reply */
- dbus_message_set_no_reply (message, TRUE);
-
- /* If security policy doesn't allow the message, we silently
- * eat it; the driver doesn't care about getting a reply.
- */
- if (!bus_context_check_security_policy (bus_transaction_get_context (transaction),
- transaction,
- NULL, connection, connection, message, NULL))
- return TRUE;
-
- return bus_transaction_send (transaction, connection, message);
-}
-
-dbus_bool_t
-bus_transaction_send (BusTransaction *transaction,
- DBusConnection *connection,
- DBusMessage *message)
-{
- MessageToSend *to_send;
- BusConnectionData *d;
- DBusList *link;
-
- _dbus_verbose (" trying to add %s interface=%s member=%s error=%s to transaction%s\n",
- dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR ? "error" :
- dbus_message_get_reply_serial (message) != 0 ? "reply" :
- "message",
- dbus_message_get_interface (message) ?
- dbus_message_get_interface (message) : "(unset)",
- dbus_message_get_member (message) ?
- dbus_message_get_member (message) : "(unset)",
- dbus_message_get_error_name (message) ?
- dbus_message_get_error_name (message) : "(unset)",
- dbus_connection_get_is_connected (connection) ?
- "" : " (disconnected)");
-
- _dbus_assert (dbus_message_get_sender (message) != NULL);
-
- if (!dbus_connection_get_is_connected (connection))
- return TRUE; /* silently ignore disconnected connections */
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- to_send = dbus_new (MessageToSend, 1);
- if (to_send == NULL)
- {
- return FALSE;
- }
-
- to_send->preallocated = dbus_connection_preallocate_send (connection);
- if (to_send->preallocated == NULL)
- {
- dbus_free (to_send);
- return FALSE;
- }
-
- dbus_message_ref (message);
- to_send->message = message;
- to_send->transaction = transaction;
-
- _dbus_verbose ("about to prepend message\n");
-
- if (!_dbus_list_prepend (&d->transaction_messages, to_send))
- {
- message_to_send_free (connection, to_send);
- return FALSE;
- }
-
- _dbus_verbose ("prepended message\n");
-
- /* See if we already had this connection in the list
- * for this transaction. If we have a pending message,
- * then we should already be in transaction->connections
- */
- link = _dbus_list_get_first_link (&d->transaction_messages);
- _dbus_assert (link->data == to_send);
- link = _dbus_list_get_next_link (&d->transaction_messages, link);
- while (link != NULL)
- {
- MessageToSend *m = link->data;
- DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
-
- if (m->transaction == transaction)
- break;
-
- link = next;
- }
-
- if (link == NULL)
- {
- if (!_dbus_list_prepend (&transaction->connections, connection))
- {
- _dbus_list_remove (&d->transaction_messages, to_send);
- message_to_send_free (connection, to_send);
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-static void
-transaction_free (BusTransaction *transaction)
-{
- _dbus_assert (transaction->connections == NULL);
-
- free_cancel_hooks (transaction);
-
- dbus_free (transaction);
-}
-
-static void
-connection_cancel_transaction (DBusConnection *connection,
- BusTransaction *transaction)
-{
- DBusList *link;
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- link = _dbus_list_get_first_link (&d->transaction_messages);
- while (link != NULL)
- {
- MessageToSend *m = link->data;
- DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
-
- if (m->transaction == transaction)
- {
- _dbus_list_remove_link (&d->transaction_messages,
- link);
-
- message_to_send_free (connection, m);
- }
-
- link = next;
- }
-}
-
-void
-bus_transaction_cancel_and_free (BusTransaction *transaction)
-{
- DBusConnection *connection;
-
- _dbus_verbose ("TRANSACTION: cancelled\n");
-
- while ((connection = _dbus_list_pop_first (&transaction->connections)))
- connection_cancel_transaction (connection, transaction);
-
- _dbus_list_foreach (&transaction->cancel_hooks,
- cancel_hook_cancel, NULL);
-
- transaction_free (transaction);
-}
-
-static void
-connection_execute_transaction (DBusConnection *connection,
- BusTransaction *transaction)
-{
- DBusList *link;
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- /* Send the queue in order (FIFO) */
- link = _dbus_list_get_last_link (&d->transaction_messages);
- while (link != NULL)
- {
- MessageToSend *m = link->data;
- DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link);
-
- if (m->transaction == transaction)
- {
- _dbus_list_remove_link (&d->transaction_messages,
- link);
-
- _dbus_assert (dbus_message_get_sender (m->message) != NULL);
-
- dbus_connection_send_preallocated (connection,
- m->preallocated,
- m->message,
- NULL);
-
- m->preallocated = NULL; /* so we don't double-free it */
-
- message_to_send_free (connection, m);
- }
-
- link = prev;
- }
-}
-
-void
-bus_transaction_execute_and_free (BusTransaction *transaction)
-{
- /* For each connection in transaction->connections
- * send the messages
- */
- DBusConnection *connection;
-
- _dbus_verbose ("TRANSACTION: executing\n");
-
- while ((connection = _dbus_list_pop_first (&transaction->connections)))
- connection_execute_transaction (connection, transaction);
-
- transaction_free (transaction);
-}
-
-static void
-bus_connection_remove_transactions (DBusConnection *connection)
-{
- MessageToSend *to_send;
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- _dbus_assert (d != NULL);
-
- while ((to_send = _dbus_list_get_first (&d->transaction_messages)))
- {
- /* only has an effect for the first MessageToSend listing this transaction */
- _dbus_list_remove (&to_send->transaction->connections,
- connection);
-
- _dbus_list_remove (&d->transaction_messages, to_send);
- message_to_send_free (connection, to_send);
- }
-}
-
-/**
- * Converts the DBusError to a message reply
- */
-dbus_bool_t
-bus_transaction_send_error_reply (BusTransaction *transaction,
- DBusConnection *connection,
- const DBusError *error,
- DBusMessage *in_reply_to)
-{
- DBusMessage *reply;
-
- _dbus_assert (error != NULL);
- _DBUS_ASSERT_ERROR_IS_SET (error);
-
- _dbus_verbose ("Sending error reply %s \"%s\"\n",
- error->name, error->message);
-
- reply = dbus_message_new_error (in_reply_to,
- error->name,
- error->message);
- if (reply == NULL)
- return FALSE;
-
- if (!bus_transaction_send_from_driver (transaction, connection, reply))
- {
- dbus_message_unref (reply);
- return FALSE;
- }
-
- dbus_message_unref (reply);
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_transaction_add_cancel_hook (BusTransaction *transaction,
- BusTransactionCancelFunction cancel_function,
- void *data,
- DBusFreeFunction free_data_function)
-{
- CancelHook *ch;
-
- ch = dbus_new (CancelHook, 1);
- if (ch == NULL)
- return FALSE;
-
- _dbus_verbose (" adding cancel hook function = %p data = %p\n",
- cancel_function, data);
-
- ch->cancel_function = cancel_function;
- ch->data = data;
- ch->free_data_function = free_data_function;
-
- /* It's important that the hooks get run in reverse order that they
- * were added
- */
- if (!_dbus_list_prepend (&transaction->cancel_hooks, ch))
- {
- dbus_free (ch);
- return FALSE;
- }
-
- return TRUE;
-}
-
-#ifdef DBUS_ENABLE_STATS
-int
-bus_connections_get_n_active (BusConnections *connections)
-{
- return connections->n_completed;
-}
-
-int
-bus_connections_get_n_incomplete (BusConnections *connections)
-{
- return connections->n_incomplete;
-}
-
-int
-bus_connections_get_total_match_rules (BusConnections *connections)
-{
- return connections->total_match_rules;
-}
-
-int
-bus_connections_get_peak_match_rules (BusConnections *connections)
-{
- return connections->peak_match_rules;
-}
-
-int
-bus_connections_get_peak_match_rules_per_conn (BusConnections *connections)
-{
- return connections->peak_match_rules_per_conn;
-}
-
-int
-bus_connections_get_total_bus_names (BusConnections *connections)
-{
- return connections->total_bus_names;
-}
-
-int
-bus_connections_get_peak_bus_names (BusConnections *connections)
-{
- return connections->peak_bus_names;
-}
-
-int
-bus_connections_get_peak_bus_names_per_conn (BusConnections *connections)
-{
- return connections->peak_bus_names_per_conn;
-}
-
-int
-bus_connection_get_peak_match_rules (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- return d->peak_match_rules;
-}
-
-int
-bus_connection_get_peak_bus_names (DBusConnection *connection)
-{
- BusConnectionData *d;
-
- d = BUS_CONNECTION_DATA (connection);
- return d->peak_bus_names;
-}
-#endif /* DBUS_ENABLE_STATS */
diff --git a/src/3rd_party/dbus-1.7.8/bus/connection.h b/src/3rd_party/dbus-1.7.8/bus/connection.h
deleted file mode 100644
index c9360212d1..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/connection.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* connection.h Client connections
- *
- * Copyright (C) 2003, 2004 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_CONNECTION_H
-#define BUS_CONNECTION_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-list.h>
-#include "bus.h"
-
-typedef dbus_bool_t (* BusConnectionForeachFunction) (DBusConnection *connection,
- void *data);
-
-
-BusConnections* bus_connections_new (BusContext *context);
-BusConnections* bus_connections_ref (BusConnections *connections);
-void bus_connections_unref (BusConnections *connections);
-dbus_bool_t bus_connections_setup_connection (BusConnections *connections,
- DBusConnection *connection);
-void bus_connections_foreach (BusConnections *connections,
- BusConnectionForeachFunction function,
- void *data);
-void bus_connections_foreach_active (BusConnections *connections,
- BusConnectionForeachFunction function,
- void *data);
-BusContext* bus_connections_get_context (BusConnections *connections);
-void bus_connections_increment_stamp (BusConnections *connections);
-BusContext* bus_connection_get_context (DBusConnection *connection);
-BusConnections* bus_connection_get_connections (DBusConnection *connection);
-BusRegistry* bus_connection_get_registry (DBusConnection *connection);
-BusActivation* bus_connection_get_activation (DBusConnection *connection);
-BusMatchmaker* bus_connection_get_matchmaker (DBusConnection *connection);
-const char * bus_connection_get_loginfo (DBusConnection *connection);
-BusSELinuxID* bus_connection_get_selinux_id (DBusConnection *connection);
-dbus_bool_t bus_connections_check_limits (BusConnections *connections,
- DBusConnection *requesting_completion,
- DBusError *error);
-void bus_connections_expire_incomplete (BusConnections *connections);
-
-dbus_bool_t bus_connections_expect_reply (BusConnections *connections,
- BusTransaction *transaction,
- DBusConnection *will_get_reply,
- DBusConnection *will_send_reply,
- DBusMessage *reply_to_this,
- DBusError *error);
-dbus_bool_t bus_connections_check_reply (BusConnections *connections,
- BusTransaction *transaction,
- DBusConnection *sending_reply,
- DBusConnection *receiving_reply,
- DBusMessage *reply,
- DBusError *error);
-
-dbus_bool_t bus_connection_mark_stamp (DBusConnection *connection);
-
-dbus_bool_t bus_connection_is_active (DBusConnection *connection);
-const char *bus_connection_get_name (DBusConnection *connection);
-
-dbus_bool_t bus_connection_preallocate_oom_error (DBusConnection *connection);
-void bus_connection_send_oom_error (DBusConnection *connection,
- DBusMessage *in_reply_to);
-
-/* called by signals.c */
-dbus_bool_t bus_connection_add_match_rule (DBusConnection *connection,
- BusMatchRule *rule);
-void bus_connection_add_match_rule_link (DBusConnection *connection,
- DBusList *link);
-void bus_connection_remove_match_rule (DBusConnection *connection,
- BusMatchRule *rule);
-int bus_connection_get_n_match_rules (DBusConnection *connection);
-
-
-/* called by services.c */
-dbus_bool_t bus_connection_add_owned_service (DBusConnection *connection,
- BusService *service);
-void bus_connection_remove_owned_service (DBusConnection *connection,
- BusService *service);
-void bus_connection_add_owned_service_link (DBusConnection *connection,
- DBusList *link);
-int bus_connection_get_n_services_owned (DBusConnection *connection);
-
-/* called by driver.c */
-dbus_bool_t bus_connection_complete (DBusConnection *connection,
- const DBusString *name,
- DBusError *error);
-
-/* called by dispatch.c when the connection is dropped */
-void bus_connection_disconnected (DBusConnection *connection);
-
-dbus_bool_t bus_connection_is_in_unix_group (DBusConnection *connection,
- unsigned long gid);
-dbus_bool_t bus_connection_get_unix_groups (DBusConnection *connection,
- unsigned long **groups,
- int *n_groups,
- DBusError *error);
-BusClientPolicy* bus_connection_get_policy (DBusConnection *connection);
-
-/* transaction API so we can send or not send a block of messages as a whole */
-
-typedef void (* BusTransactionCancelFunction) (void *data);
-
-BusTransaction* bus_transaction_new (BusContext *context);
-BusContext* bus_transaction_get_context (BusTransaction *transaction);
-BusConnections* bus_transaction_get_connections (BusTransaction *transaction);
-dbus_bool_t bus_transaction_send (BusTransaction *transaction,
- DBusConnection *connection,
- DBusMessage *message);
-dbus_bool_t bus_transaction_send_from_driver (BusTransaction *transaction,
- DBusConnection *connection,
- DBusMessage *message);
-dbus_bool_t bus_transaction_send_error_reply (BusTransaction *transaction,
- DBusConnection *connection,
- const DBusError *error,
- DBusMessage *in_reply_to);
-void bus_transaction_cancel_and_free (BusTransaction *transaction);
-void bus_transaction_execute_and_free (BusTransaction *transaction);
-dbus_bool_t bus_transaction_add_cancel_hook (BusTransaction *transaction,
- BusTransactionCancelFunction cancel_function,
- void *data,
- DBusFreeFunction free_data_function);
-
-/* called by stats.c, only present if DBUS_ENABLE_STATS */
-int bus_connections_get_n_active (BusConnections *connections);
-int bus_connections_get_n_incomplete (BusConnections *connections);
-int bus_connections_get_total_match_rules (BusConnections *connections);
-int bus_connections_get_peak_match_rules (BusConnections *connections);
-int bus_connections_get_peak_match_rules_per_conn (BusConnections *connections);
-int bus_connections_get_total_bus_names (BusConnections *connections);
-int bus_connections_get_peak_bus_names (BusConnections *connections);
-int bus_connections_get_peak_bus_names_per_conn (BusConnections *connections);
-
-int bus_connection_get_peak_match_rules (DBusConnection *connection);
-int bus_connection_get_peak_bus_names (DBusConnection *connection);
-
-#endif /* BUS_CONNECTION_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/dbus.service.in b/src/3rd_party/dbus-1.7.8/bus/dbus.service.in
deleted file mode 100644
index 1b0bbb29d2..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/dbus.service.in
+++ /dev/null
@@ -1,8 +0,0 @@
-[Unit]
-Description=D-Bus System Message Bus
-Requires=dbus.socket
-
-[Service]
-ExecStart=@EXPANDED_BINDIR@/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
-ExecReload=@EXPANDED_BINDIR@/dbus-send --print-reply --system --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig
-OOMScoreAdjust=-900
diff --git a/src/3rd_party/dbus-1.7.8/bus/dbus.socket.in b/src/3rd_party/dbus-1.7.8/bus/dbus.socket.in
deleted file mode 100644
index 74cbe582b3..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/dbus.socket.in
+++ /dev/null
@@ -1,5 +0,0 @@
-[Unit]
-Description=D-Bus System Message Bus Socket
-
-[Socket]
-ListenStream=@DBUS_SYSTEM_SOCKET@
diff --git a/src/3rd_party/dbus-1.7.8/bus/desktop-file.c b/src/3rd_party/dbus-1.7.8/bus/desktop-file.c
deleted file mode 100644
index bfeb72e241..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/desktop-file.c
+++ /dev/null
@@ -1,808 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* desktop-file.c .desktop file parser
- *
- * Copyright (C) 2003 CodeFactory AB
- * Copyright (C) 2003 Red Hat Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include <dbus/dbus-sysdeps.h>
-#include <dbus/dbus-internals.h>
-#include "desktop-file.h"
-#include "utils.h"
-
-typedef struct
-{
- char *key;
- char *value;
-} BusDesktopFileLine;
-
-typedef struct
-{
- char *section_name;
-
- int n_lines;
- BusDesktopFileLine *lines;
- int n_allocated_lines;
-} BusDesktopFileSection;
-
-struct BusDesktopFile
-{
- int n_sections;
- BusDesktopFileSection *sections;
- int n_allocated_sections;
-};
-
-/**
- * Parser for service files.
- */
-typedef struct
-{
- DBusString data; /**< The data from the file */
-
- BusDesktopFile *desktop_file; /**< The resulting object */
- int current_section; /**< The current section being parsed */
-
- int pos; /**< Current position */
- int len; /**< Length */
- int line_num; /**< Current line number */
-
-} BusDesktopFileParser;
-
-#define VALID_KEY_CHAR 1
-#define VALID_LOCALE_CHAR 2
-static unsigned char valid[256] = {
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x3 , 0x2 , 0x0 ,
- 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 ,
- 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x0 , 0x0 , 0x0 , 0x0 , 0x2 ,
- 0x0 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 ,
- 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
- 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ,
-};
-
-static void report_error (BusDesktopFileParser *parser,
- char *message,
- const char *error_name,
- DBusError *error);
-
-static void
-parser_free (BusDesktopFileParser *parser)
-{
- bus_desktop_file_free (parser->desktop_file);
-
- _dbus_string_free (&parser->data);
-}
-
-static void
-bus_desktop_file_line_free (BusDesktopFileLine *line)
-{
- dbus_free (line->key);
- dbus_free (line->value);
-}
-
-static void
-bus_desktop_file_section_free (BusDesktopFileSection *section)
-{
- int i;
-
- for (i = 0; i < section->n_lines; i++)
- bus_desktop_file_line_free (&section->lines[i]);
-
- dbus_free (section->lines);
- dbus_free (section->section_name);
-}
-
-void
-bus_desktop_file_free (BusDesktopFile *desktop_file)
-{
- int i;
-
- for (i = 0; i < desktop_file->n_sections; i++)
- bus_desktop_file_section_free (&desktop_file->sections[i]);
- dbus_free (desktop_file->sections);
-
- dbus_free (desktop_file);
-}
-
-static dbus_bool_t
-grow_lines_in_section (BusDesktopFileSection *section)
-{
- BusDesktopFileLine *lines;
-
- int new_n_lines;
-
- if (section->n_allocated_lines == 0)
- new_n_lines = 1;
- else
- new_n_lines = section->n_allocated_lines*2;
-
- lines = dbus_realloc (section->lines,
- sizeof (BusDesktopFileLine) * new_n_lines);
-
- if (lines == NULL)
- return FALSE;
-
- section->lines = lines;
- section->n_allocated_lines = new_n_lines;
-
- return TRUE;
-}
-
-static dbus_bool_t
-grow_sections (BusDesktopFile *desktop_file)
-{
- int new_n_sections;
- BusDesktopFileSection *sections;
-
- if (desktop_file->n_allocated_sections == 0)
- new_n_sections = 1;
- else
- new_n_sections = desktop_file->n_allocated_sections*2;
-
- sections = dbus_realloc (desktop_file->sections,
- sizeof (BusDesktopFileSection) * new_n_sections);
- if (sections == NULL)
- return FALSE;
-
- desktop_file->sections = sections;
-
- desktop_file->n_allocated_sections = new_n_sections;
-
- return TRUE;
-}
-
-static char *
-unescape_string (BusDesktopFileParser *parser,
- const DBusString *str,
- int pos,
- int end_pos,
- DBusError *error)
-{
- char *retval, *q;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* len + 1 is enough, because unescaping never makes the
- * string longer
- */
- retval = dbus_malloc (end_pos - pos + 1);
- if (retval == NULL)
- {
- BUS_SET_OOM (error);
- return NULL;
- }
-
- q = retval;
-
- while (pos < end_pos)
- {
- if (_dbus_string_get_byte (str, pos) == 0)
- {
- /* Found an embedded null */
- dbus_free (retval);
- report_error (parser, "Text to be unescaped contains embedded nul",
- BUS_DESKTOP_PARSE_ERROR_INVALID_ESCAPES, error);
- return NULL;
- }
-
- if (_dbus_string_get_byte (str, pos) == '\\')
- {
- pos ++;
-
- if (pos >= end_pos)
- {
- /* Escape at end of string */
- dbus_free (retval);
- report_error (parser, "Text to be unescaped ended in \\",
- BUS_DESKTOP_PARSE_ERROR_INVALID_ESCAPES, error);
- return NULL;
- }
-
- switch (_dbus_string_get_byte (str, pos))
- {
- case 's':
- *q++ = ' ';
- break;
- case 't':
- *q++ = '\t';
- break;
- case 'n':
- *q++ = '\n';
- break;
- case 'r':
- *q++ = '\r';
- break;
- case '\\':
- *q++ = '\\';
- break;
- default:
- /* Invalid escape code */
- dbus_free (retval);
- report_error (parser, "Text to be unescaped had invalid escape sequence",
- BUS_DESKTOP_PARSE_ERROR_INVALID_ESCAPES, error);
- return NULL;
- }
- pos++;
- }
- else
- {
- *q++ =_dbus_string_get_byte (str, pos);
-
- pos++;
- }
- }
-
- *q = 0;
-
- return retval;
-}
-
-static BusDesktopFileSection*
-new_section (BusDesktopFile *desktop_file,
- const char *name)
-{
- int n;
- char *name_copy;
-
- if (desktop_file->n_allocated_sections == desktop_file->n_sections)
- {
- if (!grow_sections (desktop_file))
- return NULL;
- }
-
- name_copy = _dbus_strdup (name);
- if (name_copy == NULL)
- return NULL;
-
- n = desktop_file->n_sections;
- desktop_file->sections[n].section_name = name_copy;
-
- desktop_file->sections[n].n_lines = 0;
- desktop_file->sections[n].lines = NULL;
- desktop_file->sections[n].n_allocated_lines = 0;
-
- if (!grow_lines_in_section (&desktop_file->sections[n]))
- {
- dbus_free (desktop_file->sections[n].section_name);
- desktop_file->sections[n].section_name = NULL;
- return NULL;
- }
-
- desktop_file->n_sections += 1;
-
- return &desktop_file->sections[n];
-}
-
-static BusDesktopFileSection*
-open_section (BusDesktopFileParser *parser,
- char *name)
-{
- BusDesktopFileSection *section;
-
- section = new_section (parser->desktop_file, name);
- if (section == NULL)
- return NULL;
-
- parser->current_section = parser->desktop_file->n_sections - 1;
- _dbus_assert (&parser->desktop_file->sections[parser->current_section] == section);
-
- return section;
-}
-
-static BusDesktopFileLine *
-new_line (BusDesktopFileParser *parser)
-{
- BusDesktopFileSection *section;
- BusDesktopFileLine *line;
-
- section = &parser->desktop_file->sections[parser->current_section];
-
- if (section->n_allocated_lines == section->n_lines)
- {
- if (!grow_lines_in_section (section))
- return NULL;
- }
-
- line = &section->lines[section->n_lines++];
-
- _DBUS_ZERO(*line);
-
- return line;
-}
-
-static dbus_bool_t
-is_blank_line (BusDesktopFileParser *parser)
-{
- int p;
- char c;
-
- p = parser->pos;
-
- c = _dbus_string_get_byte (&parser->data, p);
-
- while (c && c != '\n')
- {
- if (!(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f'))
- return FALSE;
-
- p++;
- c = _dbus_string_get_byte (&parser->data, p);
- }
-
- return TRUE;
-}
-
-static void
-parse_comment_or_blank (BusDesktopFileParser *parser)
-{
- int line_end, eol_len;
-
- if (!_dbus_string_find_eol (&parser->data, parser->pos, &line_end, &eol_len))
- line_end = parser->len;
-
- if (line_end == parser->len)
- parser->pos = parser->len;
- else
- parser->pos = line_end + eol_len;
-
- parser->line_num += 1;
-}
-
-static dbus_bool_t
-is_valid_section_name (const char *name)
-{
- /* 5. Group names may contain all ASCII characters except for control characters and '[' and ']'. */
-
- while (*name)
- {
- if (!((*name >= 'A' && *name <= 'Z') || (*name >= 'a' || *name <= 'z') ||
- *name == '\n' || *name == '\t'))
- return FALSE;
-
- name++;
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-parse_section_start (BusDesktopFileParser *parser, DBusError *error)
-{
- int line_end, eol_len;
- char *section_name;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (!_dbus_string_find_eol (&parser->data, parser->pos, &line_end, &eol_len))
- line_end = parser->len;
-
- if (line_end - parser->pos <= 2 ||
- _dbus_string_get_byte (&parser->data, line_end - 1) != ']')
- {
- report_error (parser, "Invalid syntax for section header", BUS_DESKTOP_PARSE_ERROR_INVALID_SYNTAX, error);
- parser_free (parser);
- return FALSE;
- }
-
- section_name = unescape_string (parser,
- &parser->data, parser->pos + 1, line_end - 1,
- error);
-
- if (section_name == NULL)
- {
- parser_free (parser);
- return FALSE;
- }
-
- if (!is_valid_section_name (section_name))
- {
- report_error (parser, "Invalid characters in section name", BUS_DESKTOP_PARSE_ERROR_INVALID_CHARS, error);
- parser_free (parser);
- dbus_free (section_name);
- return FALSE;
- }
-
- if (open_section (parser, section_name) == NULL)
- {
- dbus_free (section_name);
- parser_free (parser);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (line_end == parser->len)
- parser->pos = parser->len;
- else
- parser->pos = line_end + eol_len;
-
- parser->line_num += 1;
-
- dbus_free (section_name);
-
- return TRUE;
-}
-
-static dbus_bool_t
-parse_key_value (BusDesktopFileParser *parser, DBusError *error)
-{
- int line_end, eol_len;
- int key_start, key_end;
- int value_start;
- int p;
- char *value, *tmp;
- DBusString key;
- BusDesktopFileLine *line;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (!_dbus_string_find_eol (&parser->data, parser->pos, &line_end, &eol_len))
- line_end = parser->len;
-
- p = parser->pos;
- key_start = p;
- while (p < line_end &&
- (valid[_dbus_string_get_byte (&parser->data, p)] & VALID_KEY_CHAR))
- p++;
- key_end = p;
-
- if (key_start == key_end)
- {
- report_error (parser, "Empty key name", BUS_DESKTOP_PARSE_ERROR_INVALID_SYNTAX, error);
- parser_free (parser);
- return FALSE;
- }
-
- /* We ignore locales for now */
- if (p < line_end && _dbus_string_get_byte (&parser->data, p) == '[')
- {
- if (line_end == parser->len)
- parser->pos = parser->len;
- else
- parser->pos = line_end + eol_len;
-
- parser->line_num += 1;
-
- return TRUE;
- }
-
- /* Skip space before '=' */
- while (p < line_end && _dbus_string_get_byte (&parser->data, p) == ' ')
- p++;
-
- if (p < line_end && _dbus_string_get_byte (&parser->data, p) != '=')
- {
- report_error (parser, "Invalid characters in key name", BUS_DESKTOP_PARSE_ERROR_INVALID_CHARS, error);
- parser_free (parser);
- return FALSE;
- }
-
- if (p == line_end)
- {
- report_error (parser, "No '=' in key/value pair", BUS_DESKTOP_PARSE_ERROR_INVALID_SYNTAX, error);
- parser_free (parser);
- return FALSE;
- }
-
- /* Skip the '=' */
- p++;
-
- /* Skip space after '=' */
- while (p < line_end && _dbus_string_get_byte (&parser->data, p) == ' ')
- p++;
-
- value_start = p;
-
- value = unescape_string (parser, &parser->data, value_start, line_end, error);
- if (value == NULL)
- {
- parser_free (parser);
- return FALSE;
- }
-
- line = new_line (parser);
- if (line == NULL)
- {
- dbus_free (value);
- parser_free (parser);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_string_init (&key))
- {
- dbus_free (value);
- parser_free (parser);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_string_copy_len (&parser->data, key_start, key_end - key_start,
- &key, 0))
- {
- _dbus_string_free (&key);
- dbus_free (value);
- parser_free (parser);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_string_steal_data (&key, &tmp))
- {
- _dbus_string_free (&key);
- dbus_free (value);
- parser_free (parser);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- _dbus_string_free (&key);
-
- line->key = tmp;
- line->value = value;
-
- if (line_end == parser->len)
- parser->pos = parser->len;
- else
- parser->pos = line_end + eol_len;
-
- parser->line_num += 1;
-
- return TRUE;
-}
-
-static void
-report_error (BusDesktopFileParser *parser,
- char *message,
- const char *error_name,
- DBusError *error)
-{
- const char *section_name = NULL;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (parser->current_section != -1)
- section_name = parser->desktop_file->sections[parser->current_section].section_name;
-
- if (section_name)
- dbus_set_error (error, error_name,
- "Error in section %s at line %d: %s\n", section_name, parser->line_num, message);
- else
- dbus_set_error (error, error_name,
- "Error at line %d: %s\n", parser->line_num, message);
-}
-
-#if 0
-static void
-dump_desktop_file (BusDesktopFile *file)
-{
- int i;
-
- for (i = 0; i < file->n_sections; i++)
- {
- int j;
-
- printf ("[%s]\n", file->sections[i].section_name);
-
- for (j = 0; j < file->sections[i].n_lines; j++)
- {
- printf ("%s=%s\n", file->sections[i].lines[j].key,
- file->sections[i].lines[j].value);
- }
- }
-}
-#endif
-
-BusDesktopFile*
-bus_desktop_file_load (DBusString *filename,
- DBusError *error)
-{
- DBusString str;
- BusDesktopFileParser parser;
- DBusStat sb;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* Clearly there's a race here, but it's just to make it unlikely
- * that we do something silly, we still handle doing it below.
- */
- if (!_dbus_stat (filename, &sb, error))
- return NULL;
-
- if (sb.size > _DBUS_ONE_KILOBYTE * 128)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Desktop file size (%ld bytes) is too large", (long) sb.size);
- return NULL;
- }
-
- if (!_dbus_string_init (&str))
- {
- BUS_SET_OOM (error);
- return NULL;
- }
-
- if (!_dbus_file_get_contents (&str, filename, error))
- {
- _dbus_string_free (&str);
- return NULL;
- }
-
- if (!_dbus_string_validate_utf8 (&str, 0, _dbus_string_get_length (&str)))
- {
- _dbus_string_free (&str);
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "invalid UTF-8");
- return NULL;
- }
-
- parser.desktop_file = dbus_new0 (BusDesktopFile, 1);
- if (parser.desktop_file == NULL)
- {
- _dbus_string_free (&str);
- BUS_SET_OOM (error);
- return NULL;
- }
-
- parser.data = str;
- parser.line_num = 1;
- parser.pos = 0;
- parser.len = _dbus_string_get_length (&parser.data);
- parser.current_section = -1;
-
- while (parser.pos < parser.len)
- {
- if (_dbus_string_get_byte (&parser.data, parser.pos) == '[')
- {
- if (!parse_section_start (&parser, error))
- {
- return NULL;
- }
- }
- else if (is_blank_line (&parser) ||
- _dbus_string_get_byte (&parser.data, parser.pos) == '#')
- parse_comment_or_blank (&parser);
- else if (parser.current_section < 0)
- {
- dbus_set_error(error, DBUS_ERROR_FAILED,
- "invalid service file: key=value before [Section]");
- return NULL;
- }
- else
- {
- if (!parse_key_value (&parser, error))
- {
- return NULL;
- }
- }
- }
-
- _dbus_string_free (&parser.data);
-
- return parser.desktop_file;
-}
-
-static BusDesktopFileSection *
-lookup_section (BusDesktopFile *desktop_file,
- const char *section_name)
-{
- BusDesktopFileSection *section;
- int i;
-
- if (section_name == NULL)
- return NULL;
-
- for (i = 0; i < desktop_file->n_sections; i ++)
- {
- section = &desktop_file->sections[i];
-
- if (strcmp (section->section_name, section_name) == 0)
- return section;
- }
-
- return NULL;
-}
-
-static BusDesktopFileLine *
-lookup_line (BusDesktopFile *desktop_file,
- BusDesktopFileSection *section,
- const char *keyname)
-{
- BusDesktopFileLine *line;
- int i;
-
- for (i = 0; i < section->n_lines; i++)
- {
- line = &section->lines[i];
-
- if (strcmp (line->key, keyname) == 0)
- return line;
- }
-
- return NULL;
-}
-
-dbus_bool_t
-bus_desktop_file_get_raw (BusDesktopFile *desktop_file,
- const char *section_name,
- const char *keyname,
- const char **val)
-{
- BusDesktopFileSection *section;
- BusDesktopFileLine *line;
-
- *val = NULL;
-
- section = lookup_section (desktop_file, section_name);
-
- if (!section)
- return FALSE;
-
- line = lookup_line (desktop_file,
- section,
- keyname);
-
- if (!line)
- return FALSE;
-
- *val = line->value;
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_desktop_file_get_string (BusDesktopFile *desktop_file,
- const char *section,
- const char *keyname,
- char **val,
- DBusError *error)
-{
- const char *raw;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- *val = NULL;
-
- if (!bus_desktop_file_get_raw (desktop_file, section, keyname, &raw))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "No \"%s\" key in .service file\n", keyname);
- return FALSE;
- }
-
- *val = _dbus_strdup (raw);
-
- if (*val == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/desktop-file.h b/src/3rd_party/dbus-1.7.8/bus/desktop-file.h
deleted file mode 100644
index e405625c6b..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/desktop-file.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* desktop-file.h .desktop file parser
- *
- * Copyright (C) 2003 CodeFactory AB
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-#ifndef BUS_DESKTOP_FILE_H
-#define BUS_DESKTOP_FILE_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-string.h>
-
-#define BUS_DESKTOP_PARSE_ERROR_INVALID_SYNTAX "org.freedesktop.DBus.DesktopParseError.InvalidSyntax"
-#define BUS_DESKTOP_PARSE_ERROR_INVALID_ESCAPES "org.freedesktop.DBus.DesktopParseError.InvalidEscapes"
-#define BUS_DESKTOP_PARSE_ERROR_INVALID_CHARS "org.freedesktop.DBus.DesktopParseError.InvalidChars"
-
-#define DBUS_SERVICE_SECTION "D-BUS Service"
-#define DBUS_SERVICE_NAME "Name"
-#define DBUS_SERVICE_EXEC "Exec"
-#define DBUS_SERVICE_USER "User"
-#define DBUS_SERVICE_SYSTEMD_SERVICE "SystemdService"
-
-typedef struct BusDesktopFile BusDesktopFile;
-
-BusDesktopFile *bus_desktop_file_load (DBusString *filename,
- DBusError *error);
-void bus_desktop_file_free (BusDesktopFile *file);
-
-dbus_bool_t bus_desktop_file_get_raw (BusDesktopFile *desktop_file,
- const char *section_name,
- const char *keyname,
- const char **val);
-dbus_bool_t bus_desktop_file_get_string (BusDesktopFile *desktop_file,
- const char *section,
- const char *keyname,
- char **val,
- DBusError *error);
-
-
-#endif /* BUS_DESKTOP_FILE_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/dir-watch-default.c b/src/3rd_party/dbus-1.7.8/bus/dir-watch-default.c
deleted file mode 100644
index 69361b1fb9..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/dir-watch-default.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* dir-watch-default.c OS specific directory change notification for message bus
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-
-#include <dbus/dbus-internals.h>
-#include "dir-watch.h"
-
-
-/* NoOp */
-
-void
-bus_set_watched_dirs (BusContext *context, DBusList **directories)
-{
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/dir-watch-inotify.c b/src/3rd_party/dbus-1.7.8/bus/dir-watch-inotify.c
deleted file mode 100644
index 49ebc721b0..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/dir-watch-inotify.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu" -*- */
-/* dir-watch-inotify.c OS specific directory change notification for message bus
- *
- * Copyright (C) 2003 Red Hat, Inc.
- * (c) 2006 Mandriva
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-/* Be careful, this file is not Linux-only: QNX also uses it */
-
-#include <config.h>
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-/* QNX's inotify is broken, and requires stdint.h to be manually included first */
-#include <stdint.h>
-#include <sys/inotify.h>
-#include <sys/types.h>
-#include <signal.h>
-#include <errno.h>
-
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-watch.h>
-#include "dir-watch.h"
-
-#define MAX_DIRS_TO_WATCH 128
-#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event))
-#define INOTIFY_BUF_LEN (1024 * (INOTIFY_EVENT_SIZE + 16))
-
-/* use a static array to avoid handling OOM */
-static int wds[MAX_DIRS_TO_WATCH];
-static char *dirs[MAX_DIRS_TO_WATCH];
-static int num_wds = 0;
-static int inotify_fd = -1;
-static DBusWatch *watch = NULL;
-static DBusLoop *loop = NULL;
-
-static dbus_bool_t
-_handle_inotify_watch (DBusWatch *passed_watch, unsigned int flags, void *data)
-{
- char buffer[INOTIFY_BUF_LEN];
- ssize_t ret = 0;
- int i = 0;
-
- ret = read (inotify_fd, buffer, INOTIFY_BUF_LEN);
- if (ret < 0)
- _dbus_verbose ("Error reading inotify event: '%s'\n", _dbus_strerror(errno));
- else if (!ret)
- _dbus_verbose ("Error reading inotify event: buffer too small\n");
- else
- {
- _dbus_verbose ("Sending SIGHUP signal on reception of %ld inotify event(s)\n", (long) ret);
- (void) kill (_dbus_getpid (), SIGHUP);
- }
-
-#ifdef DBUS_ENABLE_VERBOSE_MODE
- while (i < ret)
- {
- struct inotify_event *ev;
-
- ev = (struct inotify_event *) &buffer[i];
- i += INOTIFY_EVENT_SIZE + ev->len;
- if (ev->len)
- _dbus_verbose ("event name: '%s'\n", ev->name);
- _dbus_verbose ("inotify event: wd=%d mask=%u cookie=%u len=%u\n", ev->wd, ev->mask, ev->cookie, ev->len);
- }
-#endif
-
- return TRUE;
-}
-
-#include <stdio.h>
-
-static void
-_set_watched_dirs_internal (DBusList **directories)
-{
- int new_wds[MAX_DIRS_TO_WATCH];
- char *new_dirs[MAX_DIRS_TO_WATCH];
- DBusList *link;
- int i, j, wd;
-
- for (i = 0; i < MAX_DIRS_TO_WATCH; i++)
- {
- new_wds[i] = -1;
- new_dirs[i] = NULL;
- }
-
- i = 0;
- link = _dbus_list_get_first_link (directories);
- while (link != NULL)
- {
- new_dirs[i++] = (char *)link->data;
- link = _dbus_list_get_next_link (directories, link);
- }
-
- /* Look for directories in both the old and new sets, if
- * we find one, move its data into the new set.
- */
- for (i = 0; new_dirs[i]; i++)
- {
- for (j = 0; j < num_wds; j++)
- {
- if (dirs[j] && strcmp (new_dirs[i], dirs[j]) == 0)
- {
- new_wds[i] = wds[j];
- new_dirs[i] = dirs[j];
- wds[j] = -1;
- dirs[j] = NULL;
- break;
- }
- }
- }
-
- /* Any directories we find in "wds" with a nonzero fd must
- * not be in the new set, so perform cleanup now.
- */
- for (j = 0; j < num_wds; j++)
- {
- if (wds[j] != -1)
- {
- inotify_rm_watch (inotify_fd, wds[j]);
- dbus_free (dirs[j]);
- wds[j] = -1;
- dirs[j] = NULL;
- }
- }
-
- for (i = 0; new_dirs[i]; i++)
- {
- if (new_wds[i] == -1)
- {
- /* FIXME - less lame error handling for failing to add a watch; we may need to sleep. */
- wd = inotify_add_watch (inotify_fd, new_dirs[i], IN_CLOSE_WRITE | IN_DELETE | IN_MOVED_TO | IN_MOVED_FROM);
- if (wd < 0)
- {
- /* Not all service directories need to exist. */
- if (errno != ENOENT)
- {
- _dbus_warn ("Cannot setup inotify for '%s'; error '%s'\n", new_dirs[i], _dbus_strerror (errno));
- goto out;
- }
- else
- {
- new_wds[i] = -1;
- new_dirs[i] = NULL;
- continue;
- }
- }
- new_wds[i] = wd;
- new_dirs[i] = _dbus_strdup (new_dirs[i]);
- if (!new_dirs[i])
- {
- /* FIXME have less lame handling for OOM, we just silently fail to
- * watch. (In reality though, the whole OOM handling in dbus is stupid
- * but we won't go into that in this comment =) )
- */
- inotify_rm_watch (inotify_fd, wd);
- new_wds[i] = -1;
- }
- }
- }
-
- num_wds = i;
-
- for (i = 0; i < MAX_DIRS_TO_WATCH; i++)
- {
- wds[i] = new_wds[i];
- dirs[i] = new_dirs[i];
- }
-
- out:;
-}
-
-#include <stdio.h>
-static void
-_shutdown_inotify (void *data)
-{
- DBusList *empty = NULL;
-
- if (inotify_fd == -1)
- return;
-
- _set_watched_dirs_internal (&empty);
-
- if (watch != NULL)
- {
- _dbus_loop_remove_watch (loop, watch);
- _dbus_watch_invalidate (watch);
- _dbus_watch_unref (watch);
- _dbus_loop_unref (loop);
- }
- watch = NULL;
- loop = NULL;
-
- close (inotify_fd);
- inotify_fd = -1;
-}
-
-static int
-_init_inotify (BusContext *context)
-{
- int ret = 0;
-
- if (inotify_fd == -1)
- {
-#ifdef HAVE_INOTIFY_INIT1
- inotify_fd = inotify_init1 (IN_CLOEXEC);
- /* This ensures we still run on older Linux kernels.
- * https://bugs.freedesktop.org/show_bug.cgi?id=23957
- */
- if (inotify_fd < 0)
- inotify_fd = inotify_init ();
-#else
- inotify_fd = inotify_init ();
-#endif
- if (inotify_fd <= 0)
- {
- _dbus_warn ("Cannot initialize inotify\n");
- goto out;
- }
- loop = bus_context_get_loop (context);
- _dbus_loop_ref (loop);
-
- watch = _dbus_watch_new (inotify_fd, DBUS_WATCH_READABLE, TRUE,
- _handle_inotify_watch, NULL, NULL);
-
- if (watch == NULL)
- {
- _dbus_warn ("Unable to create inotify watch\n");
- goto out;
- }
-
- if (!_dbus_loop_add_watch (loop, watch))
- {
- _dbus_warn ("Unable to add reload watch to main loop");
- _dbus_watch_unref (watch);
- watch = NULL;
- goto out;
- }
-
- if (!_dbus_register_shutdown_func (_shutdown_inotify, NULL))
- {
- _dbus_warn ("Unable to register shutdown func");
- _dbus_watch_unref (watch);
- watch = NULL;
- goto out;
- }
- }
-
- ret = 1;
-
-out:
- return ret;
-}
-
-void
-bus_set_watched_dirs (BusContext *context, DBusList **directories)
-{
- if (!_init_inotify (context))
- return;
-
- _set_watched_dirs_internal (directories);
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/dir-watch-kqueue.c b/src/3rd_party/dbus-1.7.8/bus/dir-watch-kqueue.c
deleted file mode 100644
index c60560f00f..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/dir-watch-kqueue.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* dir-watch-kqueue.c OS specific directory change notification for message bus
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/event.h>
-#include <sys/time.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <unistd.h>
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-
-#include "bus.h"
-#include <dbus/dbus-watch.h>
-
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-list.h>
-#include "dir-watch.h"
-
-#define MAX_DIRS_TO_WATCH 128
-
-static int kq = -1;
-static int fds[MAX_DIRS_TO_WATCH];
-static char *dirs[MAX_DIRS_TO_WATCH];
-static int num_fds = 0;
-static DBusWatch *watch = NULL;
-static DBusLoop *loop = NULL;
-
-static dbus_bool_t
-_handle_kqueue_watch (DBusWatch *watch, unsigned int flags, void *data)
-{
- struct kevent ev;
- struct timespec nullts = { 0, 0 };
- int res;
- pid_t pid;
-
- res = kevent (kq, NULL, 0, &ev, 1, &nullts);
-
- /* Sleep for half a second to avoid a race when files are install(1)'d
- * to system.d. */
- usleep(500000);
-
- if (res > 0)
- {
- pid = getpid ();
- _dbus_verbose ("Sending SIGHUP signal on reception of a kevent\n");
- (void) kill (pid, SIGHUP);
- }
- else if (res < 0 && errno == EBADF)
- {
- kq = -1;
- if (watch != NULL)
- {
- _dbus_loop_remove_watch (loop, watch);
- _dbus_watch_invalidate (watch);
- _dbus_watch_unref (watch);
- watch = NULL;
- }
- pid = getpid ();
- _dbus_verbose ("Sending SIGHUP signal since kqueue has been closed\n");
- (void) kill (pid, SIGHUP);
- }
-
- return TRUE;
-}
-
-static int
-_init_kqueue (BusContext *context)
-{
- int ret = 0;
-
- if (kq < 0)
- {
-
- kq = kqueue ();
- if (kq < 0)
- {
- _dbus_warn ("Cannot create kqueue; error '%s'\n", _dbus_strerror (errno));
- goto out;
- }
-
- loop = bus_context_get_loop (context);
-
- watch = _dbus_watch_new (kq, DBUS_WATCH_READABLE, TRUE,
- _handle_kqueue_watch, NULL, NULL);
-
- if (watch == NULL)
- {
- _dbus_warn ("Unable to create kqueue watch\n");
- close (kq);
- kq = -1;
- goto out;
- }
-
- if (!_dbus_loop_add_watch (loop, watch))
- {
- _dbus_warn ("Unable to add reload watch to main loop");
- _dbus_watch_invalidate (watch);
- _dbus_watch_unref (watch);
- watch = NULL;
- close (kq);
- kq = -1;
- goto out;
- }
- }
-
- ret = 1;
-
-out:
- return ret;
-}
-
-void
-bus_set_watched_dirs (BusContext *context, DBusList **directories)
-{
- int new_fds[MAX_DIRS_TO_WATCH];
- char *new_dirs[MAX_DIRS_TO_WATCH];
- DBusList *link;
- int i, j, fd;
- struct kevent ev;
-
- if (!_init_kqueue (context))
- goto out;
-
- for (i = 0; i < MAX_DIRS_TO_WATCH; i++)
- {
- new_fds[i] = -1;
- new_dirs[i] = NULL;
- }
-
- i = 0;
- link = _dbus_list_get_first_link (directories);
- while (link != NULL)
- {
- new_dirs[i++] = (char *)link->data;
- link = _dbus_list_get_next_link (directories, link);
- }
-
- /* Look for directories in both the old and new sets, if
- * we find one, move its data into the new set.
- */
- for (i = 0; new_dirs[i]; i++)
- {
- for (j = 0; j < num_fds; j++)
- {
- if (dirs[j] && strcmp (new_dirs[i], dirs[j]) == 0)
- {
- new_fds[i] = fds[j];
- new_dirs[i] = dirs[j];
- fds[j] = -1;
- dirs[j] = NULL;
- break;
- }
- }
- }
-
- /* Any directory we find in "fds" with a nonzero fd must
- * not be in the new set, so perform cleanup now.
- */
- for (j = 0; j < num_fds; j++)
- {
- if (fds[j] != -1)
- {
- close (fds[j]);
- dbus_free (dirs[j]);
- fds[j] = -1;
- dirs[j] = NULL;
- }
- }
-
- for (i = 0; new_dirs[i]; i++)
- {
- if (new_fds[i] == -1)
- {
- /* FIXME - less lame error handling for failing to add a watch;
- * we may need to sleep.
- */
- fd = open (new_dirs[i], O_RDONLY);
- if (fd < 0)
- {
- if (errno != ENOENT)
- {
- _dbus_warn ("Cannot open directory '%s'; error '%s'\n", new_dirs[i], _dbus_strerror (errno));
- goto out;
- }
- else
- {
- new_fds[i] = -1;
- new_dirs[i] = NULL;
- continue;
- }
- }
-
- EV_SET (&ev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
- NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_RENAME, 0, 0);
- if (kevent (kq, &ev, 1, NULL, 0, NULL) == -1)
- {
- _dbus_warn ("Cannot setup a kevent for '%s'; error '%s'\n", new_dirs[i], _dbus_strerror (errno));
- close (fd);
- goto out;
- }
-
- new_fds[i] = fd;
- new_dirs[i] = _dbus_strdup (new_dirs[i]);
- if (!new_dirs[i])
- {
- /* FIXME have less lame handling for OOM, we just silently fail to
- * watch. (In reality though, the whole OOM handling in dbus is
- * stupid but we won't go into that in this comment =) )
- */
- close (fd);
- new_fds[i] = -1;
- }
- }
- }
-
- num_fds = i;
-
- for (i = 0; i < MAX_DIRS_TO_WATCH; i++)
- {
- fds[i] = new_fds[i];
- dirs[i] = new_dirs[i];
- }
-
- out:
- ;
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/dir-watch.h b/src/3rd_party/dbus-1.7.8/bus/dir-watch.h
deleted file mode 100644
index b44529e5c2..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/dir-watch.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* dir-watch.h Watch directories
- *
- * Copyright (C) 2005 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include "bus.h"
-
-#ifndef DIR_WATCH_H
-#define DIR_WATCH_H
-
-/**
- * Update the set of directories to monitor for changes. The
- * operating-system-specific implementation of this function should
- * avoid creating a window where a directory in both the
- * old and new set isn't monitored.
- *
- * @param context The bus context
- * @param dirs List of strings which are directory paths
- */
-void bus_set_watched_dirs (BusContext *context, DBusList **dirs);
-
-#endif /* DIR_WATCH_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/dispatch.c b/src/3rd_party/dbus-1.7.8/bus/dispatch.c
deleted file mode 100644
index 5fc0d112ed..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/dispatch.c
+++ /dev/null
@@ -1,4917 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* dispatch.c Message dispatcher
- *
- * Copyright (C) 2003 CodeFactory AB
- * Copyright (C) 2003, 2004, 2005 Red Hat, Inc.
- * Copyright (C) 2004 Imendio HB
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "dispatch.h"
-#include "connection.h"
-#include "driver.h"
-#include "services.h"
-#include "activation.h"
-#include "utils.h"
-#include "bus.h"
-#include "signals.h"
-#include "test.h"
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-misc.h>
-#include <string.h>
-
-#ifdef HAVE_UNIX_FD_PASSING
-#include <dbus/dbus-sysdeps-unix.h>
-#include <unistd.h>
-#endif
-
-/* This is hard-coded in the files in valid-config-files-*. We have to use
- * the debug-pipe transport because the tests in this file require that
- * dbus_connection_open_private() does not block. */
-#define TEST_DEBUG_PIPE "debug-pipe:name=test-server"
-
-static dbus_bool_t
-send_one_message (DBusConnection *connection,
- BusContext *context,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusMessage *message,
- BusTransaction *transaction,
- DBusError *error)
-{
- if (!bus_context_check_security_policy (context, transaction,
- sender,
- addressed_recipient,
- connection,
- message,
- NULL))
- return TRUE; /* silently don't send it */
-
- if (dbus_message_contains_unix_fds(message) &&
- !dbus_connection_can_send_type(connection, DBUS_TYPE_UNIX_FD))
- return TRUE; /* silently don't send it */
-
- if (!bus_transaction_send (transaction,
- connection,
- message))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_dispatch_matches (BusTransaction *transaction,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusMessage *message,
- DBusError *error)
-{
- DBusError tmp_error;
- BusConnections *connections;
- DBusList *recipients;
- BusMatchmaker *matchmaker;
- DBusList *link;
- BusContext *context;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* sender and recipient can both be NULL for the bus driver,
- * or for signals with no particular recipient
- */
-
- _dbus_assert (sender == NULL || bus_connection_is_active (sender));
- _dbus_assert (dbus_message_get_sender (message) != NULL);
-
- context = bus_transaction_get_context (transaction);
-
- /* First, send the message to the addressed_recipient, if there is one. */
- if (addressed_recipient != NULL)
- {
- if (!bus_context_check_security_policy (context, transaction,
- sender, addressed_recipient,
- addressed_recipient,
- message, error))
- return FALSE;
-
- if (dbus_message_contains_unix_fds (message) &&
- !dbus_connection_can_send_type (addressed_recipient,
- DBUS_TYPE_UNIX_FD))
- {
- dbus_set_error (error,
- DBUS_ERROR_NOT_SUPPORTED,
- "Tried to send message with Unix file descriptors"
- "to a client that doesn't support that.");
- return FALSE;
- }
-
- /* Dispatch the message */
- if (!bus_transaction_send (transaction, addressed_recipient, message))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
- }
-
- /* Now dispatch to others who look interested in this message */
- connections = bus_transaction_get_connections (transaction);
- dbus_error_init (&tmp_error);
- matchmaker = bus_context_get_matchmaker (context);
-
- recipients = NULL;
- if (!bus_matchmaker_get_recipients (matchmaker, connections,
- sender, addressed_recipient, message,
- &recipients))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- link = _dbus_list_get_first_link (&recipients);
- while (link != NULL)
- {
- DBusConnection *dest;
-
- dest = link->data;
-
- if (!send_one_message (dest, context, sender, addressed_recipient,
- message, transaction, &tmp_error))
- break;
-
- link = _dbus_list_get_next_link (&recipients, link);
- }
-
- _dbus_list_clear (&recipients);
-
- if (dbus_error_is_set (&tmp_error))
- {
- dbus_move_error (&tmp_error, error);
- return FALSE;
- }
- else
- return TRUE;
-}
-
-static DBusHandlerResult
-bus_dispatch (DBusConnection *connection,
- DBusMessage *message)
-{
- const char *sender, *service_name;
- DBusError error;
- BusTransaction *transaction;
- BusContext *context;
- DBusHandlerResult result;
- DBusConnection *addressed_recipient;
-
- result = DBUS_HANDLER_RESULT_HANDLED;
-
- transaction = NULL;
- addressed_recipient = NULL;
- dbus_error_init (&error);
-
- context = bus_connection_get_context (connection);
- _dbus_assert (context != NULL);
-
- /* If we can't even allocate an OOM error, we just go to sleep
- * until we can.
- */
- while (!bus_connection_preallocate_oom_error (connection))
- _dbus_wait_for_memory ();
-
- /* Ref connection in case we disconnect it at some point in here */
- dbus_connection_ref (connection);
-
- service_name = dbus_message_get_destination (message);
-
-#ifdef DBUS_ENABLE_VERBOSE_MODE
- {
- const char *interface_name, *member_name, *error_name;
-
- interface_name = dbus_message_get_interface (message);
- member_name = dbus_message_get_member (message);
- error_name = dbus_message_get_error_name (message);
-
- _dbus_verbose ("DISPATCH: %s %s %s to %s\n",
- interface_name ? interface_name : "(no interface)",
- member_name ? member_name : "(no member)",
- error_name ? error_name : "(no error name)",
- service_name ? service_name : "peer");
- }
-#endif /* DBUS_ENABLE_VERBOSE_MODE */
-
- /* If service_name is NULL, if it's a signal we send it to all
- * connections with a match rule. If it's not a signal, there
- * are some special cases here but mostly we just bail out.
- */
- if (service_name == NULL)
- {
- if (dbus_message_is_signal (message,
- DBUS_INTERFACE_LOCAL,
- "Disconnected"))
- {
- bus_connection_disconnected (connection);
- goto out;
- }
-
- if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL)
- {
- /* DBusConnection also handles some of these automatically, we leave
- * it to do so.
- */
- result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- goto out;
- }
- }
-
- /* Create our transaction */
- transaction = bus_transaction_new (context);
- if (transaction == NULL)
- {
- BUS_SET_OOM (&error);
- goto out;
- }
-
- /* Assign a sender to the message */
- if (bus_connection_is_active (connection))
- {
- sender = bus_connection_get_name (connection);
- _dbus_assert (sender != NULL);
-
- if (!dbus_message_set_sender (message, sender))
- {
- BUS_SET_OOM (&error);
- goto out;
- }
-
- /* We need to refetch the service name here, because
- * dbus_message_set_sender can cause the header to be
- * reallocated, and thus the service_name pointer will become
- * invalid.
- */
- service_name = dbus_message_get_destination (message);
- }
-
- if (service_name &&
- strcmp (service_name, DBUS_SERVICE_DBUS) == 0) /* to bus driver */
- {
- if (!bus_context_check_security_policy (context, transaction,
- connection, NULL, NULL, message, &error))
- {
- _dbus_verbose ("Security policy rejected message\n");
- goto out;
- }
-
- _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS);
- if (!bus_driver_handle_message (connection, transaction, message, &error))
- goto out;
- }
- else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */
- {
- _dbus_verbose ("Received message from non-registered client. Disconnecting.\n");
- dbus_connection_close (connection);
- goto out;
- }
- else if (service_name != NULL) /* route to named service */
- {
- DBusString service_string;
- BusService *service;
- BusRegistry *registry;
-
- _dbus_assert (service_name != NULL);
-
- registry = bus_connection_get_registry (connection);
-
- _dbus_string_init_const (&service_string, service_name);
- service = bus_registry_lookup (registry, &service_string);
-
- if (service == NULL && dbus_message_get_auto_start (message))
- {
- BusActivation *activation;
- /* We can't do the security policy check here, since the addressed
- * recipient service doesn't exist yet. We do it before sending the
- * message after the service has been created.
- */
- activation = bus_connection_get_activation (connection);
-
- if (!bus_activation_activate_service (activation, connection, transaction, TRUE,
- message, service_name, &error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (&error);
- _dbus_verbose ("bus_activation_activate_service() failed: %s\n", error.name);
- goto out;
- }
-
- goto out;
- }
- else if (service == NULL)
- {
- dbus_set_error (&error,
- DBUS_ERROR_NAME_HAS_NO_OWNER,
- "Name \"%s\" does not exist",
- service_name);
- goto out;
- }
- else
- {
- addressed_recipient = bus_service_get_primary_owners_connection (service);
- _dbus_assert (addressed_recipient != NULL);
- }
- }
-
- /* Now send the message to its destination (or not, if
- * addressed_recipient == NULL), and match it against other connections'
- * match rules.
- */
- if (!bus_dispatch_matches (transaction, connection, addressed_recipient, message, &error))
- goto out;
-
- out:
- if (dbus_error_is_set (&error))
- {
- if (!dbus_connection_get_is_connected (connection))
- {
- /* If we disconnected it, we won't bother to send it any error
- * messages.
- */
- _dbus_verbose ("Not sending error to connection we disconnected\n");
- }
- else if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- bus_connection_send_oom_error (connection, message);
-
- /* cancel transaction due to OOM */
- if (transaction != NULL)
- {
- bus_transaction_cancel_and_free (transaction);
- transaction = NULL;
- }
- }
- else
- {
- /* Try to send the real error, if no mem to do that, send
- * the OOM error
- */
- _dbus_assert (transaction != NULL);
- if (!bus_transaction_send_error_reply (transaction, connection,
- &error, message))
- {
- bus_connection_send_oom_error (connection, message);
-
- /* cancel transaction due to OOM */
- if (transaction != NULL)
- {
- bus_transaction_cancel_and_free (transaction);
- transaction = NULL;
- }
- }
- }
-
-
- dbus_error_free (&error);
- }
-
- if (transaction != NULL)
- {
- bus_transaction_execute_and_free (transaction);
- }
-
- dbus_connection_unref (connection);
-
- return result;
-}
-
-static DBusHandlerResult
-bus_dispatch_message_filter (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- return bus_dispatch (connection, message);
-}
-
-dbus_bool_t
-bus_dispatch_add_connection (DBusConnection *connection)
-{
- if (!dbus_connection_add_filter (connection,
- bus_dispatch_message_filter,
- NULL, NULL))
- return FALSE;
-
- return TRUE;
-}
-
-void
-bus_dispatch_remove_connection (DBusConnection *connection)
-{
- /* Here we tell the bus driver that we want to get off. */
- bus_driver_remove_connection (connection);
-
- dbus_connection_remove_filter (connection,
- bus_dispatch_message_filter,
- NULL);
-}
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-
-#include <stdio.h>
-
-/* This is used to know whether we need to block in order to finish
- * sending a message, or whether the initial dbus_connection_send()
- * already flushed the queue.
- */
-#define SEND_PENDING(connection) (dbus_connection_has_messages_to_send (connection))
-
-typedef dbus_bool_t (* Check1Func) (BusContext *context);
-typedef dbus_bool_t (* Check2Func) (BusContext *context,
- DBusConnection *connection);
-
-static dbus_bool_t check_no_leftovers (BusContext *context);
-
-static void
-block_connection_until_message_from_bus (BusContext *context,
- DBusConnection *connection,
- const char *what_is_expected)
-{
- _dbus_verbose ("expecting: %s\n", what_is_expected);
-
- while (dbus_connection_get_dispatch_status (connection) ==
- DBUS_DISPATCH_COMPLETE &&
- dbus_connection_get_is_connected (connection))
- {
- bus_test_run_bus_loop (context, TRUE);
- bus_test_run_clients_loop (FALSE);
- }
-}
-
-static void
-spin_connection_until_authenticated (BusContext *context,
- DBusConnection *connection)
-{
- _dbus_verbose ("Spinning to auth connection %p\n", connection);
- while (!dbus_connection_get_is_authenticated (connection) &&
- dbus_connection_get_is_connected (connection))
- {
- bus_test_run_bus_loop (context, FALSE);
- bus_test_run_clients_loop (FALSE);
- }
- _dbus_verbose (" ... done spinning to auth connection %p\n", connection);
-}
-
-/* compensate for fact that pop_message() can return #NULL due to OOM */
-static DBusMessage*
-pop_message_waiting_for_memory (DBusConnection *connection)
-{
- while (dbus_connection_get_dispatch_status (connection) ==
- DBUS_DISPATCH_NEED_MEMORY)
- _dbus_wait_for_memory ();
-
- return dbus_connection_pop_message (connection);
-}
-
-static DBusMessage*
-borrow_message_waiting_for_memory (DBusConnection *connection)
-{
- while (dbus_connection_get_dispatch_status (connection) ==
- DBUS_DISPATCH_NEED_MEMORY)
- _dbus_wait_for_memory ();
-
- return dbus_connection_borrow_message (connection);
-}
-
-static void
-warn_unexpected_real (DBusConnection *connection,
- DBusMessage *message,
- const char *expected,
- const char *function,
- int line)
-{
- if (message)
- _dbus_warn ("%s:%d received message interface \"%s\" member \"%s\" error name \"%s\" on %p, expecting %s\n",
- function, line,
- dbus_message_get_interface (message) ?
- dbus_message_get_interface (message) : "(unset)",
- dbus_message_get_member (message) ?
- dbus_message_get_member (message) : "(unset)",
- dbus_message_get_error_name (message) ?
- dbus_message_get_error_name (message) : "(unset)",
- connection,
- expected);
- else
- _dbus_warn ("%s:%d received no message on %p, expecting %s\n",
- function, line, connection, expected);
-}
-
-#define warn_unexpected(connection, message, expected) \
- warn_unexpected_real (connection, message, expected, _DBUS_FUNCTION_NAME, __LINE__)
-
-static void
-verbose_message_received (DBusConnection *connection,
- DBusMessage *message)
-{
- _dbus_verbose ("Received message interface \"%s\" member \"%s\" error name \"%s\" on %p\n",
- dbus_message_get_interface (message) ?
- dbus_message_get_interface (message) : "(unset)",
- dbus_message_get_member (message) ?
- dbus_message_get_member (message) : "(unset)",
- dbus_message_get_error_name (message) ?
- dbus_message_get_error_name (message) : "(unset)",
- connection);
-}
-
-typedef enum
-{
- SERVICE_CREATED,
- OWNER_CHANGED,
- SERVICE_DELETED
-} ServiceInfoKind;
-
-typedef struct
-{
- ServiceInfoKind expected_kind;
- const char *expected_service_name;
- dbus_bool_t failed;
- DBusConnection *skip_connection;
-} CheckServiceOwnerChangedData;
-
-static dbus_bool_t
-check_service_owner_changed_foreach (DBusConnection *connection,
- void *data)
-{
- CheckServiceOwnerChangedData *d = data;
- DBusMessage *message;
- DBusError error;
- const char *service_name, *old_owner, *new_owner;
-
- if (d->expected_kind == SERVICE_CREATED
- && connection == d->skip_connection)
- return TRUE;
-
- dbus_error_init (&error);
- d->failed = TRUE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a message on %p, expecting %s\n",
- connection, "NameOwnerChanged");
- goto out;
- }
- else if (!dbus_message_is_signal (message,
- DBUS_INTERFACE_DBUS,
- "NameOwnerChanged"))
- {
- warn_unexpected (connection, message, "NameOwnerChanged");
-
- goto out;
- }
- else
- {
- reget_service_info_data:
- service_name = NULL;
- old_owner = NULL;
- new_owner = NULL;
-
- dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, &old_owner,
- DBUS_TYPE_STRING, &new_owner,
- DBUS_TYPE_INVALID);
-
- if (dbus_error_is_set (&error))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_error_free (&error);
- _dbus_wait_for_memory ();
- goto reget_service_info_data;
- }
- else
- {
- _dbus_warn ("Did not get the expected arguments\n");
- goto out;
- }
- }
-
- if ((d->expected_kind == SERVICE_CREATED && ( old_owner[0] || !new_owner[0]))
- || (d->expected_kind == OWNER_CHANGED && (!old_owner[0] || !new_owner[0]))
- || (d->expected_kind == SERVICE_DELETED && (!old_owner[0] || new_owner[0])))
- {
- _dbus_warn ("inconsistent NameOwnerChanged arguments\n");
- goto out;
- }
-
- if (strcmp (service_name, d->expected_service_name) != 0)
- {
- _dbus_warn ("expected info on service %s, got info on %s\n",
- d->expected_service_name,
- service_name);
- goto out;
- }
-
- if (*service_name == ':' && new_owner[0]
- && strcmp (service_name, new_owner) != 0)
- {
- _dbus_warn ("inconsistent ServiceOwnedChanged message (\"%s\" [ %s -> %s ])\n",
- service_name, old_owner, new_owner);
- goto out;
- }
- }
-
- d->failed = FALSE;
-
- out:
- dbus_error_free (&error);
-
- if (message)
- dbus_message_unref (message);
-
- return !d->failed;
-}
-
-
-static void
-kill_client_connection (BusContext *context,
- DBusConnection *connection)
-{
- char *base_service;
- const char *s;
- CheckServiceOwnerChangedData socd;
-
- _dbus_verbose ("killing connection %p\n", connection);
-
- s = dbus_bus_get_unique_name (connection);
- _dbus_assert (s != NULL);
-
- while ((base_service = _dbus_strdup (s)) == NULL)
- _dbus_wait_for_memory ();
-
- dbus_connection_ref (connection);
-
- /* kick in the disconnect handler that unrefs the connection */
- dbus_connection_close (connection);
-
- bus_test_run_everything (context);
-
- _dbus_assert (bus_test_client_listed (connection));
-
- /* Run disconnect handler in test.c */
- if (bus_connection_dispatch_one_message (connection))
- _dbus_assert_not_reached ("something received on connection being killed other than the disconnect");
-
- _dbus_assert (!dbus_connection_get_is_connected (connection));
- dbus_connection_unref (connection);
- connection = NULL;
- _dbus_assert (!bus_test_client_listed (connection));
-
- socd.expected_kind = SERVICE_DELETED;
- socd.expected_service_name = base_service;
- socd.failed = FALSE;
- socd.skip_connection = NULL;
-
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- dbus_free (base_service);
-
- if (socd.failed)
- _dbus_assert_not_reached ("didn't get the expected NameOwnerChanged (deletion) messages");
-
- if (!check_no_leftovers (context))
- _dbus_assert_not_reached ("stuff left in message queues after disconnecting a client");
-}
-
-static void
-kill_client_connection_unchecked (DBusConnection *connection)
-{
- /* This kills the connection without expecting it to affect
- * the rest of the bus.
- */
- _dbus_verbose ("Unchecked kill of connection %p\n", connection);
-
- dbus_connection_ref (connection);
- dbus_connection_close (connection);
- /* dispatching disconnect handler will unref once */
- if (bus_connection_dispatch_one_message (connection))
- _dbus_assert_not_reached ("message other than disconnect dispatched after failure to register");
-
- _dbus_assert (!bus_test_client_listed (connection));
- dbus_connection_unref (connection);
-}
-
-typedef struct
-{
- dbus_bool_t failed;
-} CheckNoMessagesData;
-
-static dbus_bool_t
-check_no_messages_foreach (DBusConnection *connection,
- void *data)
-{
- CheckNoMessagesData *d = data;
- DBusMessage *message;
-
- message = pop_message_waiting_for_memory (connection);
- if (message != NULL)
- {
- warn_unexpected (connection, message, "no messages");
-
- d->failed = TRUE;
- }
-
- if (message)
- dbus_message_unref (message);
- return !d->failed;
-}
-
-static dbus_bool_t
-check_no_leftovers (BusContext *context)
-{
- CheckNoMessagesData nmd;
-
- nmd.failed = FALSE;
- bus_test_clients_foreach (check_no_messages_foreach,
- &nmd);
-
- if (nmd.failed)
- {
- _dbus_verbose ("leftover message found\n");
- return FALSE;
- }
- else
- return TRUE;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_hello_message (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- DBusMessage *name_message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- DBusError error;
- const char *name;
- const char *acquired;
-
- retval = FALSE;
- dbus_error_init (&error);
- name = NULL;
- acquired = NULL;
- message = NULL;
- name_message = NULL;
-
- _dbus_verbose ("check_hello_message for %p\n", connection);
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "Hello");
-
- if (message == NULL)
- return TRUE;
-
- dbus_connection_ref (connection); /* because we may get disconnected */
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- dbus_connection_unref (connection);
- return TRUE;
- }
-
- _dbus_assert (dbus_message_has_signature (message, ""));
-
- dbus_message_unref (message);
- message = NULL;
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected (presumably auth failed)\n");
-
- dbus_connection_unref (connection);
-
- return TRUE;
- }
-
- /* send our message */
- bus_test_run_clients_loop (SEND_PENDING (connection));
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected (presumably auth failed)\n");
-
- dbus_connection_unref (connection);
-
- return TRUE;
- }
-
- block_connection_until_message_from_bus (context, connection, "reply to Hello");
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected (presumably auth failed)\n");
-
- dbus_connection_unref (connection);
-
- return TRUE;
- }
-
- dbus_connection_unref (connection);
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "Hello", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- CheckServiceOwnerChangedData socd;
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
- {
- ; /* good, expected */
- }
- else
- {
- warn_unexpected (connection, message, "method return for Hello");
-
- goto out;
- }
-
- retry_get_hello_name:
- if (!dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_INVALID))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- _dbus_verbose ("no memory to get service name arg from hello\n");
- dbus_error_free (&error);
- _dbus_wait_for_memory ();
- goto retry_get_hello_name;
- }
- else
- {
- _dbus_assert (dbus_error_is_set (&error));
- _dbus_warn ("Did not get the expected single string argument to hello\n");
- goto out;
- }
- }
-
- _dbus_verbose ("Got hello name: %s\n", name);
-
- while (!dbus_bus_set_unique_name (connection, name))
- _dbus_wait_for_memory ();
-
- socd.expected_kind = SERVICE_CREATED;
- socd.expected_service_name = name;
- socd.failed = FALSE;
- socd.skip_connection = connection; /* we haven't done AddMatch so won't get it ourselves */
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- if (socd.failed)
- goto out;
-
- name_message = message;
- /* Client should also have gotten ServiceAcquired */
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Expecting %s, got nothing\n",
- "NameAcquired");
- goto out;
- }
- if (! dbus_message_is_signal (message, DBUS_INTERFACE_DBUS,
- "NameAcquired"))
- {
- _dbus_warn ("Expecting %s, got smthg else\n",
- "NameAcquired");
- goto out;
- }
-
- retry_get_acquired_name:
- if (!dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &acquired,
- DBUS_TYPE_INVALID))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- _dbus_verbose ("no memory to get service name arg from acquired\n");
- dbus_error_free (&error);
- _dbus_wait_for_memory ();
- goto retry_get_acquired_name;
- }
- else
- {
- _dbus_assert (dbus_error_is_set (&error));
- _dbus_warn ("Did not get the expected single string argument to ServiceAcquired\n");
- goto out;
- }
- }
-
- _dbus_verbose ("Got acquired name: %s\n", acquired);
-
- if (strcmp (acquired, name) != 0)
- {
- _dbus_warn ("Acquired name is %s but expected %s\n",
- acquired, name);
- goto out;
- }
- acquired = NULL;
- }
-
- if (!check_no_leftovers (context))
- goto out;
-
- retval = TRUE;
-
- out:
- _dbus_verbose ("ending - retval = %d\n", retval);
-
- dbus_error_free (&error);
-
- if (message)
- dbus_message_unref (message);
-
- if (name_message)
- dbus_message_unref (name_message);
-
- return retval;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_double_hello_message (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- DBusError error;
-
- retval = FALSE;
- dbus_error_init (&error);
- message = NULL;
-
- _dbus_verbose ("check_double_hello_message for %p\n", connection);
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "Hello");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- /* send our message */
- bus_test_run_clients_loop (SEND_PENDING (connection));
-
- dbus_connection_ref (connection); /* because we may get disconnected */
- block_connection_until_message_from_bus (context, connection, "reply to Hello");
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
-
- dbus_connection_unref (connection);
-
- return TRUE;
- }
-
- dbus_connection_unref (connection);
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "Hello", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
- {
- warn_unexpected (connection, message, "method return for Hello");
- goto out;
- }
-
- if (!check_no_leftovers (context))
- goto out;
-
- retval = TRUE;
-
- out:
- dbus_error_free (&error);
-
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_get_connection_unix_user (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- DBusError error;
- const char *base_service_name;
- dbus_uint32_t uid;
-
- retval = FALSE;
- dbus_error_init (&error);
- message = NULL;
-
- _dbus_verbose ("check_get_connection_unix_user for %p\n", connection);
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "GetConnectionUnixUser");
-
- if (message == NULL)
- return TRUE;
-
- base_service_name = dbus_bus_get_unique_name (connection);
-
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &base_service_name,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- /* send our message */
- bus_test_run_clients_loop (SEND_PENDING (connection));
-
- dbus_message_unref (message);
- message = NULL;
-
- dbus_connection_ref (connection); /* because we may get disconnected */
- block_connection_until_message_from_bus (context, connection, "reply to GetConnectionUnixUser");
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
-
- dbus_connection_unref (connection);
-
- return TRUE;
- }
-
- dbus_connection_unref (connection);
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "GetConnectionUnixUser", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
- {
- ; /* good, expected */
- }
- else
- {
- warn_unexpected (connection, message,
- "method_return for GetConnectionUnixUser");
-
- goto out;
- }
-
- retry_get_property:
-
- if (!dbus_message_get_args (message, &error,
- DBUS_TYPE_UINT32, &uid,
- DBUS_TYPE_INVALID))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- _dbus_verbose ("no memory to get uid by GetConnectionUnixUser\n");
- dbus_error_free (&error);
- _dbus_wait_for_memory ();
- goto retry_get_property;
- }
- else
- {
- _dbus_assert (dbus_error_is_set (&error));
- _dbus_warn ("Did not get the expected DBUS_TYPE_UINT32 from GetConnectionUnixUser\n");
- goto out;
- }
- }
- }
-
- if (!check_no_leftovers (context))
- goto out;
-
- retval = TRUE;
-
- out:
- dbus_error_free (&error);
-
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_get_connection_unix_process_id (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- DBusError error;
- const char *base_service_name;
- dbus_uint32_t pid;
-
- retval = FALSE;
- dbus_error_init (&error);
- message = NULL;
-
- _dbus_verbose ("check_get_connection_unix_process_id for %p\n", connection);
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "GetConnectionUnixProcessID");
-
- if (message == NULL)
- return TRUE;
-
- base_service_name = dbus_bus_get_unique_name (connection);
-
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &base_service_name,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- /* send our message */
- bus_test_run_clients_loop (SEND_PENDING (connection));
-
- dbus_message_unref (message);
- message = NULL;
-
- dbus_connection_ref (connection); /* because we may get disconnected */
- block_connection_until_message_from_bus (context, connection, "reply to GetConnectionUnixProcessID");
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
-
- dbus_connection_unref (connection);
-
- return TRUE;
- }
-
- dbus_connection_unref (connection);
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "GetConnectionUnixProcessID", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
-#ifdef DBUS_WIN
- else if (dbus_message_is_error (message, DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN))
- {
- /* We are expecting this error, since we know in the test suite we aren't
- * talking to a client running on UNIX
- */
- _dbus_verbose ("Windows correctly does not support GetConnectionUnixProcessID\n");
- }
-#endif
- else
- {
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
- defined(__linux__) || \
- defined(__OpenBSD__)
- warn_unexpected (connection, message, "not this error");
-
- goto out;
-#else
- _dbus_verbose ("does not support GetConnectionUnixProcessID but perhaps that's OK?\n");
-#endif
- }
- }
- else
- {
-#ifdef DBUS_WIN
- warn_unexpected (connection, message, "GetConnectionUnixProcessID to fail on Windows");
- goto out;
-#else
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
- {
- ; /* good, expected */
- }
- else
- {
- warn_unexpected (connection, message,
- "method_return for GetConnectionUnixProcessID");
-
- goto out;
- }
-
- retry_get_property:
-
- if (!dbus_message_get_args (message, &error,
- DBUS_TYPE_UINT32, &pid,
- DBUS_TYPE_INVALID))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- _dbus_verbose ("no memory to get pid by GetConnectionUnixProcessID\n");
- dbus_error_free (&error);
- _dbus_wait_for_memory ();
- goto retry_get_property;
- }
- else
- {
- _dbus_assert (dbus_error_is_set (&error));
- _dbus_warn ("Did not get the expected DBUS_TYPE_UINT32 from GetConnectionUnixProcessID\n");
- goto out;
- }
- }
- else
- {
- /* test if returned pid is the same as our own pid
- *
- * @todo It would probably be good to restructure the tests
- * in a way so our parent is the bus that we're testing
- * cause then we can test that the pid returned matches
- * getppid()
- */
- if (pid != (dbus_uint32_t) _dbus_getpid ())
- {
- _dbus_assert (dbus_error_is_set (&error));
- _dbus_warn ("Result from GetConnectionUnixProcessID is not our own pid\n");
- goto out;
- }
- }
-#endif /* !DBUS_WIN */
- }
-
- if (!check_no_leftovers (context))
- goto out;
-
- retval = TRUE;
-
- out:
- dbus_error_free (&error);
-
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_add_match_all (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_bool_t retval;
- dbus_uint32_t serial;
- DBusError error;
- const char *empty = "";
-
- retval = FALSE;
- dbus_error_init (&error);
- message = NULL;
-
- _dbus_verbose ("check_add_match_all for %p\n", connection);
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "AddMatch");
-
- if (message == NULL)
- return TRUE;
-
- /* empty string match rule matches everything */
- if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &empty,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- dbus_connection_ref (connection); /* because we may get disconnected */
-
- /* send our message */
- bus_test_run_clients_loop (SEND_PENDING (connection));
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
-
- dbus_connection_unref (connection);
-
- return TRUE;
- }
-
- block_connection_until_message_from_bus (context, connection, "reply to AddMatch");
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
-
- dbus_connection_unref (connection);
-
- return TRUE;
- }
-
- dbus_connection_unref (connection);
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "AddMatch", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
- {
- ; /* good, expected */
- _dbus_assert (dbus_message_get_reply_serial (message) == serial);
- }
- else
- {
- warn_unexpected (connection, message, "method return for AddMatch");
-
- goto out;
- }
- }
-
- if (!check_no_leftovers (context))
- goto out;
-
- retval = TRUE;
-
- out:
- dbus_error_free (&error);
-
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_hello_connection (BusContext *context)
-{
- DBusConnection *connection;
- DBusError error;
-
- dbus_error_init (&error);
-
- connection = dbus_connection_open_private (TEST_DEBUG_PIPE, &error);
- if (connection == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (&error);
- dbus_error_free (&error);
- return TRUE;
- }
-
- if (!bus_setup_debug_client (connection))
- {
- dbus_connection_close (connection);
- dbus_connection_unref (connection);
- return TRUE;
- }
-
- spin_connection_until_authenticated (context, connection);
-
- if (!check_hello_message (context, connection))
- return FALSE;
-
- if (dbus_bus_get_unique_name (connection) == NULL)
- {
- /* We didn't successfully register, so we can't
- * do the usual kill_client_connection() checks
- */
- kill_client_connection_unchecked (connection);
- }
- else
- {
- if (!check_add_match_all (context, connection))
- return FALSE;
-
- kill_client_connection (context, connection);
- }
-
- return TRUE;
-}
-
-#define NONEXISTENT_SERVICE_NAME "test.this.service.does.not.exist.ewuoiurjdfxcvn"
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_nonexistent_service_no_auto_start (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- const char *nonexistent = NONEXISTENT_SERVICE_NAME;
- dbus_uint32_t flags;
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "StartServiceByName");
-
- if (message == NULL)
- return TRUE;
-
- dbus_message_set_auto_start (message, FALSE);
-
- flags = 0;
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &nonexistent,
- DBUS_TYPE_UINT32, &flags,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
- block_connection_until_message_from_bus (context, connection, "reply to ActivateService on nonexistent");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "StartServiceByName", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SERVICE_UNKNOWN))
- {
- ; /* good, this is expected also */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
- goto out;
- }
- }
- else
- {
- _dbus_warn ("Did not expect to successfully activate %s\n",
- NONEXISTENT_SERVICE_NAME);
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_nonexistent_service_auto_start (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
-
- message = dbus_message_new_method_call (NONEXISTENT_SERVICE_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Echo");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
- block_connection_until_message_from_bus (context, connection, "reply to Echo");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
-
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "Echo message (auto activation)", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SERVICE_UNKNOWN))
- {
- ; /* good, this is expected also */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
- goto out;
- }
- }
- else
- {
- _dbus_warn ("Did not expect to successfully activate %s\n",
- NONEXISTENT_SERVICE_NAME);
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-static dbus_bool_t
-check_base_service_activated (BusContext *context,
- DBusConnection *connection,
- DBusMessage *initial_message,
- const char **base_service_p)
-{
- DBusMessage *message;
- dbus_bool_t retval;
- DBusError error;
- const char *base_service, *base_service_from_bus, *old_owner;
-
- retval = FALSE;
-
- dbus_error_init (&error);
- base_service = NULL;
- old_owner = NULL;
- base_service_from_bus = NULL;
-
- message = initial_message;
- dbus_message_ref (message);
-
- if (dbus_message_is_signal (message,
- DBUS_INTERFACE_DBUS,
- "NameOwnerChanged"))
- {
- CheckServiceOwnerChangedData socd;
-
- reget_service_name_arg:
- base_service = NULL;
- old_owner = NULL;
- base_service_from_bus = NULL;
-
- if (!dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &base_service,
- DBUS_TYPE_STRING, &old_owner,
- DBUS_TYPE_STRING, &base_service_from_bus,
- DBUS_TYPE_INVALID))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_error_free (&error);
- _dbus_wait_for_memory ();
- goto reget_service_name_arg;
- }
- else
- {
- _dbus_warn ("Message %s doesn't have a service name: %s\n",
- "NameOwnerChanged (creation)",
- error.message);
- goto out;
- }
- }
-
- if (*base_service != ':')
- {
- _dbus_warn ("Expected base service activation, got \"%s\" instead\n",
- base_service);
- goto out;
- }
-
- if (strcmp (base_service, base_service_from_bus) != 0)
- {
- _dbus_warn ("Expected base service activation, got \"%s\" instead with owner \"%s\"\n",
- base_service, base_service_from_bus);
- goto out;
- }
-
- if (old_owner[0])
- {
- _dbus_warn ("Received an old_owner argument during base service activation, \"%s\"\n",
- old_owner);
- goto out;
- }
-
- socd.expected_kind = SERVICE_CREATED;
- socd.expected_service_name = base_service;
- socd.failed = FALSE;
- socd.skip_connection = connection;
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- if (socd.failed)
- goto out;
- }
- else
- {
- warn_unexpected (connection, message, "NameOwnerChanged (creation) for base service");
-
- goto out;
- }
-
- if (base_service_p)
- *base_service_p = base_service;
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
- dbus_error_free (&error);
-
- return retval;
-}
-
-static dbus_bool_t
-check_service_activated (BusContext *context,
- DBusConnection *connection,
- const char *activated_name,
- const char *base_service_name,
- DBusMessage *initial_message)
-{
- DBusMessage *message;
- dbus_bool_t retval;
- DBusError error;
- dbus_uint32_t activation_result;
-
- retval = FALSE;
-
- dbus_error_init (&error);
-
- message = initial_message;
- dbus_message_ref (message);
-
- if (dbus_message_is_signal (message,
- DBUS_INTERFACE_DBUS,
- "NameOwnerChanged"))
- {
- CheckServiceOwnerChangedData socd;
- const char *service_name, *base_service_from_bus, *old_owner;
-
- reget_service_name_arg:
- service_name = NULL;
- old_owner = NULL;
- base_service_from_bus = NULL;
-
- if (!dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, &old_owner,
- DBUS_TYPE_STRING, &base_service_from_bus,
- DBUS_TYPE_INVALID))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_error_free (&error);
- _dbus_wait_for_memory ();
- goto reget_service_name_arg;
- }
- else
- {
- _dbus_warn ("Message %s doesn't have a service name: %s\n",
- "NameOwnerChanged (creation)",
- error.message);
- goto out;
- }
- }
-
- if (strcmp (service_name, activated_name) != 0)
- {
- _dbus_warn ("Expected to see service %s created, saw %s instead\n",
- activated_name, service_name);
- goto out;
- }
-
- if (strcmp (base_service_name, base_service_from_bus) != 0)
- {
- _dbus_warn ("NameOwnerChanged reports wrong base service: %s owner, expected %s instead\n",
- base_service_from_bus, base_service_name);
- goto out;
- }
-
- if (old_owner[0])
- {
- _dbus_warn ("expected a %s, got a %s\n",
- "NameOwnerChanged (creation)",
- "NameOwnerChanged (change)");
- goto out;
- }
-
- socd.expected_kind = SERVICE_CREATED;
- socd.skip_connection = connection;
- socd.failed = FALSE;
- socd.expected_service_name = service_name;
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- if (socd.failed)
- goto out;
-
- dbus_message_unref (message);
- service_name = NULL;
- old_owner = NULL;
- base_service_from_bus = NULL;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Expected a reply to %s, got nothing\n",
- "StartServiceByName");
- goto out;
- }
- }
- else
- {
- warn_unexpected (connection, message, "NameOwnerChanged for the activated name");
-
- goto out;
- }
-
- if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN)
- {
- warn_unexpected (connection, message, "reply to StartServiceByName");
-
- goto out;
- }
-
- activation_result = 0;
- if (!dbus_message_get_args (message, &error,
- DBUS_TYPE_UINT32, &activation_result,
- DBUS_TYPE_INVALID))
- {
- if (!dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- _dbus_warn ("Did not have activation result first argument to %s: %s\n",
- "StartServiceByName", error.message);
- goto out;
- }
-
- dbus_error_free (&error);
- }
- else
- {
- if (activation_result == DBUS_START_REPLY_SUCCESS)
- ; /* Good */
- else if (activation_result == DBUS_START_REPLY_ALREADY_RUNNING)
- ; /* Good also */
- else
- {
- _dbus_warn ("Activation result was %u, no good.\n",
- activation_result);
- goto out;
- }
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- if (!check_no_leftovers (context))
- {
- _dbus_warn ("Messages were left over after verifying existent activation results\n");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
- dbus_error_free (&error);
-
- return retval;
-}
-
-static dbus_bool_t
-check_service_auto_activated (BusContext *context,
- DBusConnection *connection,
- const char *activated_name,
- const char *base_service_name,
- DBusMessage *initial_message)
-{
- DBusMessage *message;
- dbus_bool_t retval;
- DBusError error;
-
- retval = FALSE;
-
- dbus_error_init (&error);
-
- message = initial_message;
- dbus_message_ref (message);
-
- if (dbus_message_is_signal (message,
- DBUS_INTERFACE_DBUS,
- "NameOwnerChanged"))
- {
- const char *service_name;
- CheckServiceOwnerChangedData socd;
-
- reget_service_name_arg:
- if (!dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_error_free (&error);
- _dbus_wait_for_memory ();
- goto reget_service_name_arg;
- }
- else
- {
- _dbus_warn ("Message %s doesn't have a service name: %s\n",
- "NameOwnerChanged",
- error.message);
- dbus_error_free (&error);
- goto out;
- }
- }
-
- if (strcmp (service_name, activated_name) != 0)
- {
- _dbus_warn ("Expected to see service %s created, saw %s instead\n",
- activated_name, service_name);
- goto out;
- }
-
- socd.expected_kind = SERVICE_CREATED;
- socd.expected_service_name = service_name;
- socd.failed = FALSE;
- socd.skip_connection = connection;
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- if (socd.failed)
- goto out;
-
- /* Note that this differs from regular activation in that we don't get a
- * reply to ActivateService here.
- */
-
- dbus_message_unref (message);
- message = NULL;
- service_name = NULL;
- }
- else
- {
- warn_unexpected (connection, message, "NameOwnerChanged for the activated name");
-
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-static dbus_bool_t
-check_service_deactivated (BusContext *context,
- DBusConnection *connection,
- const char *activated_name,
- const char *base_service)
-{
- dbus_bool_t retval;
- CheckServiceOwnerChangedData socd;
-
- retval = FALSE;
-
- /* Now we are expecting ServiceOwnerChanged (deletion) messages for the base
- * service and the activated_name. The base service
- * notification is required to come last.
- */
- socd.expected_kind = SERVICE_DELETED;
- socd.expected_service_name = activated_name;
- socd.failed = FALSE;
- socd.skip_connection = NULL;
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- if (socd.failed)
- goto out;
-
- socd.expected_kind = SERVICE_DELETED;
- socd.expected_service_name = base_service;
- socd.failed = FALSE;
- socd.skip_connection = NULL;
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- if (socd.failed)
- goto out;
-
- retval = TRUE;
-
- out:
- return retval;
-}
-
-static dbus_bool_t
-check_send_exit_to_service (BusContext *context,
- DBusConnection *connection,
- const char *service_name,
- const char *base_service)
-{
- dbus_bool_t got_error;
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
-
- _dbus_verbose ("Sending exit message to the test service\n");
-
- retval = FALSE;
-
- /* Kill off the test service by sending it a quit message */
- message = dbus_message_new_method_call (service_name,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Exit");
-
- if (message == NULL)
- {
- /* Do this again; we still need the service to exit... */
- if (!check_send_exit_to_service (context, connection,
- service_name, base_service))
- goto out;
-
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
-
- /* Do this again; we still need the service to exit... */
- if (!check_send_exit_to_service (context, connection,
- service_name, base_service))
- goto out;
-
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- /* send message */
- bus_test_run_clients_loop (SEND_PENDING (connection));
-
- /* read it in and write it out to test service */
- bus_test_run_bus_loop (context, FALSE);
-
- /* see if we got an error during message bus dispatching */
- bus_test_run_clients_loop (FALSE);
- message = borrow_message_waiting_for_memory (connection);
- got_error = message != NULL && dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR;
- if (message)
- {
- dbus_connection_return_message (connection, message);
- message = NULL;
- }
-
- if (!got_error)
- {
- /* If no error, wait for the test service to exit */
- block_connection_until_message_from_bus (context, connection, "test service to exit");
-
- bus_test_run_everything (context);
- }
-
- if (got_error)
- {
- message = pop_message_waiting_for_memory (connection);
- _dbus_assert (message != NULL);
-
- if (dbus_message_get_reply_serial (message) != serial)
- {
- warn_unexpected (connection, message,
- "error with the correct reply serial");
- goto out;
- }
-
- if (!dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- warn_unexpected (connection, message,
- "a no memory error from asking test service to exit");
- goto out;
- }
-
- _dbus_verbose ("Got error %s when asking test service to exit\n",
- dbus_message_get_error_name (message));
-
- /* Do this again; we still need the service to exit... */
- if (!check_send_exit_to_service (context, connection,
- service_name, base_service))
- goto out;
- }
- else
- {
- if (!check_service_deactivated (context, connection,
- service_name, base_service))
- goto out;
-
- /* Should now have a NoReply error from the Exit() method
- * call; it should have come after all the deactivation
- * stuff.
- */
- message = pop_message_waiting_for_memory (connection);
-
- if (message == NULL)
- {
- warn_unexpected (connection, NULL,
- "reply to Exit() method call");
- goto out;
- }
- if (!dbus_message_is_error (message,
- DBUS_ERROR_NO_REPLY))
- {
- warn_unexpected (connection, message,
- "NoReply error from Exit() method call");
- goto out;
- }
-
- if (dbus_message_get_reply_serial (message) != serial)
- {
- warn_unexpected (connection, message,
- "error with the correct reply serial");
- goto out;
- }
-
- _dbus_verbose ("Got error %s after test service exited\n",
- dbus_message_get_error_name (message));
-
- if (!check_no_leftovers (context))
- {
- _dbus_warn ("Messages were left over after %s\n",
- _DBUS_FUNCTION_NAME);
- goto out;
- }
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-static dbus_bool_t
-check_got_error (BusContext *context,
- DBusConnection *connection,
- const char *first_error_name,
- ...)
-{
- DBusMessage *message;
- dbus_bool_t retval;
- va_list ap;
- dbus_bool_t error_found;
- const char *error_name;
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not get an expected error\n");
- goto out;
- }
-
- if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
- {
- warn_unexpected (connection, message, "an error");
-
- goto out;
- }
-
- error_found = FALSE;
-
- va_start (ap, first_error_name);
- error_name = first_error_name;
- while (error_name != NULL)
- {
- if (dbus_message_is_error (message, error_name))
- {
- error_found = TRUE;
- break;
- }
- error_name = va_arg (ap, char*);
- }
- va_end (ap);
-
- if (!error_found)
- {
- _dbus_warn ("Expected error %s or other, got %s instead\n",
- first_error_name,
- dbus_message_get_error_name (message));
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-typedef enum
-{
- GOT_SERVICE_CREATED,
- GOT_SERVICE_DELETED,
- GOT_ERROR,
- GOT_SOMETHING_ELSE
-} GotServiceInfo;
-
-static GotServiceInfo
-check_got_service_info (DBusMessage *message)
-{
- GotServiceInfo message_kind;
-
- if (dbus_message_is_signal (message,
- DBUS_INTERFACE_DBUS,
- "NameOwnerChanged"))
- {
- DBusError error;
- const char *service_name, *old_owner, *new_owner;
- dbus_error_init (&error);
-
- reget_service_info_data:
- service_name = NULL;
- old_owner = NULL;
- new_owner = NULL;
-
- dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, &old_owner,
- DBUS_TYPE_STRING, &new_owner,
- DBUS_TYPE_INVALID);
- if (dbus_error_is_set (&error))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_error_free (&error);
- goto reget_service_info_data;
- }
- else
- {
- _dbus_warn ("unexpected arguments for NameOwnerChanged message\n");
- message_kind = GOT_SOMETHING_ELSE;
- }
- }
- else if (!old_owner[0])
- message_kind = GOT_SERVICE_CREATED;
- else if (!new_owner[0])
- message_kind = GOT_SERVICE_DELETED;
- else
- message_kind = GOT_SOMETHING_ELSE;
-
- dbus_error_free (&error);
- }
- else if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- message_kind = GOT_ERROR;
- else
- message_kind = GOT_SOMETHING_ELSE;
-
- return message_kind;
-}
-
-#define EXISTENT_SERVICE_NAME "org.freedesktop.DBus.TestSuiteEchoService"
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_existent_service_no_auto_start (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- DBusMessage *base_service_message;
- const char *base_service;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- const char *existent = EXISTENT_SERVICE_NAME;
- dbus_uint32_t flags;
-
- base_service_message = NULL;
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "StartServiceByName");
-
- if (message == NULL)
- return TRUE;
-
- dbus_message_set_auto_start (message, FALSE);
-
- flags = 0;
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &existent,
- DBUS_TYPE_UINT32, &flags,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
-
- /* now wait for the message bus to hear back from the activated
- * service.
- */
- block_connection_until_message_from_bus (context, connection, "activated service to connect");
-
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive any messages after %s %d on %p\n",
- "StartServiceByName", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
- _dbus_verbose (" (after sending %s)\n", "StartServiceByName");
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_CHILD_EXITED) ||
- dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_CHILD_SIGNALED) ||
- dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_EXEC_FAILED))
- {
- ; /* good, this is expected also */
- }
- else
- {
- _dbus_warn ("Did not expect error %s\n",
- dbus_message_get_error_name (message));
- goto out;
- }
- }
- else
- {
- GotServiceInfo message_kind;
-
- if (!check_base_service_activated (context, connection,
- message, &base_service))
- goto out;
-
- base_service_message = message;
- message = NULL;
-
- /* We may need to block here for the test service to exit or finish up */
- block_connection_until_message_from_bus (context, connection, "test service to exit or finish up");
-
- message = dbus_connection_borrow_message (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive any messages after base service creation notification\n");
- goto out;
- }
-
- message_kind = check_got_service_info (message);
-
- dbus_connection_return_message (connection, message);
- message = NULL;
-
- switch (message_kind)
- {
- case GOT_SOMETHING_ELSE:
- _dbus_warn ("Unexpected message after ActivateService "
- "(should be an error or a service announcement");
- goto out;
-
- case GOT_ERROR:
- if (!check_got_error (context, connection,
- DBUS_ERROR_SPAWN_CHILD_EXITED,
- DBUS_ERROR_NO_MEMORY,
- NULL))
- goto out;
- /* A service deleted should be coming along now after this error.
- * We can also get the error *after* the service deleted.
- */
-
- /* fall through */
-
- case GOT_SERVICE_DELETED:
- {
- /* The service started up and got a base address, but then
- * failed to register under EXISTENT_SERVICE_NAME
- */
- CheckServiceOwnerChangedData socd;
-
- socd.expected_kind = SERVICE_DELETED;
- socd.expected_service_name = base_service;
- socd.failed = FALSE;
- socd.skip_connection = NULL;
-
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- if (socd.failed)
- goto out;
-
- /* Now we should get an error about the service exiting
- * if we didn't get it before.
- */
- if (message_kind != GOT_ERROR)
- {
- block_connection_until_message_from_bus (context, connection, "error about service exiting");
-
- /* and process everything again */
- bus_test_run_everything (context);
-
- if (!check_got_error (context, connection,
- DBUS_ERROR_SPAWN_CHILD_EXITED,
- DBUS_ERROR_NO_MEMORY,
- NULL))
- goto out;
- }
- break;
- }
-
- case GOT_SERVICE_CREATED:
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Failed to pop message we just put back! "
- "should have been a NameOwnerChanged (creation)\n");
- goto out;
- }
-
- if (!check_service_activated (context, connection, EXISTENT_SERVICE_NAME,
- base_service, message))
- goto out;
-
- dbus_message_unref (message);
- message = NULL;
-
- if (!check_no_leftovers (context))
- {
- _dbus_warn ("Messages were left over after successful activation\n");
- goto out;
- }
-
- if (!check_send_exit_to_service (context, connection,
- EXISTENT_SERVICE_NAME, base_service))
- goto out;
-
- break;
- }
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- if (base_service_message)
- dbus_message_unref (base_service_message);
-
- return retval;
-}
-
-#ifndef DBUS_WIN_FIXME
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_segfault_service_no_auto_start (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- const char *segv_service;
- dbus_uint32_t flags;
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "StartServiceByName");
-
- if (message == NULL)
- return TRUE;
-
- dbus_message_set_auto_start (message, FALSE);
-
- segv_service = "org.freedesktop.DBus.TestSuiteSegfaultService";
- flags = 0;
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &segv_service,
- DBUS_TYPE_UINT32, &flags,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
- block_connection_until_message_from_bus (context, connection, "reply to activating segfault service");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "StartServiceByName", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_FAILED))
- {
- const char *servicehelper;
- servicehelper = bus_context_get_servicehelper (context);
- /* make sure this only happens with the launch helper */
- _dbus_assert (servicehelper != NULL);
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_CHILD_SIGNALED))
- {
- ; /* good, this is expected also */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- _dbus_warn ("Did not expect to successfully activate segfault service\n");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_segfault_service_auto_start (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
-
- message = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteSegfaultService",
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Echo");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
- block_connection_until_message_from_bus (context, connection, "reply to Echo on segfault service");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "Echo message (auto activation)", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_CHILD_SIGNALED))
- {
- ; /* good, this is expected also */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- _dbus_warn ("Did not expect to successfully activate segfault service\n");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-#endif
-
-#define TEST_ECHO_MESSAGE "Test echo message"
-#define TEST_RUN_HELLO_FROM_SELF_MESSAGE "Test sending message to self"
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_existent_hello_from_self (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- const char *text;
-
- message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "RunHelloFromSelf");
-
- if (message == NULL)
- return TRUE;
-
- text = TEST_RUN_HELLO_FROM_SELF_MESSAGE;
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
-
- /* Note: if this test is run in OOM mode, it will block when the bus
- * doesn't send a reply due to OOM.
- */
- block_connection_until_message_from_bus (context, connection, "reply from running hello from self");
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Failed to pop message! Should have been reply from RunHelloFromSelf message\n");
- return FALSE;
- }
-
- if (dbus_message_get_reply_serial (message) != serial)
- {
- _dbus_warn ("Wrong reply serial\n");
- dbus_message_unref (message);
- return FALSE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- return TRUE;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_existent_ping (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.DBus.Peer",
- "Ping");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
-
- /* Note: if this test is run in OOM mode, it will block when the bus
- * doesn't send a reply due to OOM.
- */
- block_connection_until_message_from_bus (context, connection, "reply from running Ping");
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Failed to pop message! Should have been reply from Ping message\n");
- return FALSE;
- }
-
- if (dbus_message_get_reply_serial (message) != serial)
- {
- _dbus_warn ("Wrong reply serial\n");
- dbus_message_unref (message);
- return FALSE;
- }
-
- if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN)
- {
- _dbus_warn ("Unexpected message return during Ping\n");
- dbus_message_unref (message);
- return FALSE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- return TRUE;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_existent_get_machine_id (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- const char *machine_id;
-
- message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.DBus.Peer",
- "GetMachineId");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
-
- /* Note: if this test is run in OOM mode, it will block when the bus
- * doesn't send a reply due to OOM.
- */
- block_connection_until_message_from_bus (context, connection, "reply from running GetMachineId");
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Failed to pop message! Should have been reply from GetMachineId message\n");
- return FALSE;
- }
-
- if (dbus_message_get_reply_serial (message) != serial)
- {
- _dbus_warn ("Wrong reply serial\n");
- dbus_message_unref (message);
- return FALSE;
- }
-
- if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN)
- {
- _dbus_warn ("Unexpected message return during GetMachineId\n");
- dbus_message_unref (message);
- return FALSE;
- }
-
- machine_id = NULL;
- if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &machine_id, DBUS_TYPE_INVALID))
- {
- _dbus_warn ("Did not get a machine ID in reply to GetMachineId\n");
- dbus_message_unref (message);
- return FALSE;
- }
-
- if (machine_id == NULL || strlen (machine_id) != 32)
- {
- _dbus_warn ("Machine id looks bogus: '%s'\n", machine_id ? machine_id : "null");
- dbus_message_unref (message);
- return FALSE;
- }
-
- /* We can't check that the machine id is correct because during make check it is
- * just made up for each process separately
- */
-
- dbus_message_unref (message);
- message = NULL;
-
- return TRUE;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_existent_service_auto_start (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- DBusMessage *base_service_message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- const char *base_service;
- const char *text;
-
- base_service_message = NULL;
-
- message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Echo");
-
- if (message == NULL)
- return TRUE;
-
- text = TEST_ECHO_MESSAGE;
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
-
- /* now wait for the message bus to hear back from the activated
- * service.
- */
- block_connection_until_message_from_bus (context, connection, "reply to Echo on existent service");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive any messages after auto start %d on %p\n",
- serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
- _dbus_verbose (" (after sending %s)\n", "auto start");
-
- /* we should get zero or two ServiceOwnerChanged signals */
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_SIGNAL)
- {
- GotServiceInfo message_kind;
-
- if (!check_base_service_activated (context, connection,
- message, &base_service))
- goto out;
-
- base_service_message = message;
- message = NULL;
-
- /* We may need to block here for the test service to exit or finish up */
- block_connection_until_message_from_bus (context, connection, "service to exit");
-
- /* Should get a service creation notification for the activated
- * service name, or a service deletion on the base service name
- */
- message = dbus_connection_borrow_message (connection);
- if (message == NULL)
- {
- _dbus_warn ("No message after auto activation "
- "(should be a service announcement)\n");
- dbus_connection_return_message (connection, message);
- message = NULL;
- goto out;
- }
-
- message_kind = check_got_service_info (message);
-
- dbus_connection_return_message (connection, message);
- message = NULL;
-
- switch (message_kind)
- {
- case GOT_SERVICE_CREATED:
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Failed to pop message we just put back! "
- "should have been a NameOwnerChanged (creation)\n");
- goto out;
- }
-
- /* Check that ServiceOwnerChanged (creation) was correctly received */
- if (!check_service_auto_activated (context, connection, EXISTENT_SERVICE_NAME,
- base_service, message))
- goto out;
-
- dbus_message_unref (message);
- message = NULL;
-
- break;
-
- case GOT_SERVICE_DELETED:
- {
- /* The service started up and got a base address, but then
- * failed to register under EXISTENT_SERVICE_NAME
- */
- CheckServiceOwnerChangedData socd;
-
- socd.expected_kind = SERVICE_DELETED;
- socd.expected_service_name = base_service;
- socd.failed = FALSE;
- socd.skip_connection = NULL;
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- if (socd.failed)
- goto out;
-
- break;
- }
-
- case GOT_ERROR:
- case GOT_SOMETHING_ELSE:
- _dbus_warn ("Unexpected message after auto activation\n");
- goto out;
- }
- }
-
- /* OK, now we've dealt with ServiceOwnerChanged signals, now should
- * come the method reply (or error) from the initial method call
- */
-
- /* Note: if this test is run in OOM mode, it will block when the bus
- * doesn't send a reply due to OOM.
- */
- block_connection_until_message_from_bus (context, connection, "reply from echo message after auto-activation");
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Failed to pop message! Should have been reply from echo message\n");
- goto out;
- }
-
- if (dbus_message_get_reply_serial (message) != serial)
- {
- _dbus_warn ("Wrong reply serial\n");
- goto out;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- if (!check_existent_ping (context, connection))
- goto out;
-
- if (!check_existent_get_machine_id (context, connection))
- goto out;
-
- if (!check_existent_hello_from_self (context, connection))
- goto out;
-
- if (!check_send_exit_to_service (context, connection,
- EXISTENT_SERVICE_NAME,
- base_service))
- goto out;
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- if (base_service_message)
- dbus_message_unref (base_service_message);
-
- return retval;
-}
-
-#define SERVICE_FILE_MISSING_NAME "org.freedesktop.DBus.TestSuiteEchoServiceDotServiceFileDoesNotExist"
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_launch_service_file_missing (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
-
- message = dbus_message_new_method_call (SERVICE_FILE_MISSING_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Echo");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
- block_connection_until_message_from_bus (context, connection, "reply to service file missing should fail to auto-start");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "Echo message (auto activation)", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SERVICE_UNKNOWN))
- {
- _dbus_verbose("got service unknown\n");
- ; /* good, this is expected (only valid when using launch helper) */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- _dbus_warn ("Did not expect to successfully auto-start missing service\n");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-#define SERVICE_USER_MISSING_NAME "org.freedesktop.DBus.TestSuiteNoUser"
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_launch_service_user_missing (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
-
- message = dbus_message_new_method_call (SERVICE_USER_MISSING_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Echo");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
- block_connection_until_message_from_bus (context, connection,
- "reply to service which should fail to auto-start (missing User)");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_warn ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "Echo message (auto activation)", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_FILE_INVALID))
- {
- _dbus_verbose("got service file invalid\n");
- ; /* good, this is expected (only valid when using launch helper) */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- _dbus_warn ("Did not expect to successfully auto-start missing service\n");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-#define SERVICE_EXEC_MISSING_NAME "org.freedesktop.DBus.TestSuiteNoExec"
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_launch_service_exec_missing (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
-
- message = dbus_message_new_method_call (SERVICE_EXEC_MISSING_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Echo");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
- block_connection_until_message_from_bus (context, connection,
- "reply to service which should fail to auto-start (missing Exec)");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_warn ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "Echo message (auto activation)", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SERVICE_UNKNOWN))
- {
- _dbus_verbose("could not activate as invalid service file was not added\n");
- ; /* good, this is expected as we shouldn't have been added to
- * the activation list with a missing Exec key */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_FILE_INVALID))
- {
- _dbus_verbose("got service file invalid\n");
- ; /* good, this is allowed, and is the message passed back from the
- * launch helper */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- _dbus_warn ("Did not expect to successfully auto-start missing service\n");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-#define SERVICE_SERVICE_MISSING_NAME "org.freedesktop.DBus.TestSuiteNoService"
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_launch_service_service_missing (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
-
- message = dbus_message_new_method_call (SERVICE_SERVICE_MISSING_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Echo");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
- block_connection_until_message_from_bus (context, connection,
- "reply to service which should fail to auto-start (missing Service)");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_warn ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "Echo message (auto activation)", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SERVICE_UNKNOWN))
- {
- _dbus_verbose("could not activate as invalid service file was not added\n");
- ; /* good, this is expected as we shouldn't have been added to
- * the activation list with a missing Exec key */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_FILE_INVALID))
- {
- _dbus_verbose("got service file invalid\n");
- ; /* good, this is allowed, and is the message passed back from the
- * launch helper */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- _dbus_warn ("Did not expect to successfully auto-start missing service\n");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-#define SHELL_FAIL_SERVICE_NAME "org.freedesktop.DBus.TestSuiteShellEchoServiceFail"
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_shell_fail_service_auto_start (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
-
- message = dbus_message_new_method_call (SHELL_FAIL_SERVICE_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Echo");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
- block_connection_until_message_from_bus (context, connection, "reply to shell Echo on service which should fail to auto-start");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- "Echo message (auto activation)", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_INVALID_ARGS))
- {
- _dbus_verbose("got invalid args\n");
- ; /* good, this is expected also */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- _dbus_warn ("Did not expect to successfully auto-start shell fail service\n");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-#define SHELL_SUCCESS_SERVICE_NAME "org.freedesktop.DBus.TestSuiteShellEchoServiceSuccess"
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_shell_service_success_auto_start (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- DBusMessage *base_service_message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- const char *base_service;
- const char *argv[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
-
- base_service_message = NULL;
-
- message = dbus_message_new_method_call (SHELL_SUCCESS_SERVICE_NAME,
- "/org/freedesktop/TestSuite",
- "org.freedesktop.TestSuite",
- "Echo");
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
-
- /* now wait for the message bus to hear back from the activated
- * service.
- */
- block_connection_until_message_from_bus (context, connection, "reply to Echo on shell success service");
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive any messages after auto start %d on %p\n",
- serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
- _dbus_verbose (" (after sending %s)\n", "auto start");
-
- /* we should get zero or two ServiceOwnerChanged signals */
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_SIGNAL)
- {
- GotServiceInfo message_kind;
-
- if (!check_base_service_activated (context, connection,
- message, &base_service))
- goto out;
-
- base_service_message = message;
- message = NULL;
-
- /* We may need to block here for the test service to exit or finish up */
- block_connection_until_message_from_bus (context, connection, "service to exit");
-
- /* Should get a service creation notification for the activated
- * service name, or a service deletion on the base service name
- */
- message = dbus_connection_borrow_message (connection);
- if (message == NULL)
- {
- _dbus_warn ("No message after auto activation "
- "(should be a service announcement)\n");
- dbus_connection_return_message (connection, message);
- message = NULL;
- goto out;
- }
-
- message_kind = check_got_service_info (message);
-
- dbus_connection_return_message (connection, message);
- message = NULL;
-
- switch (message_kind)
- {
- case GOT_SERVICE_CREATED:
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Failed to pop message we just put back! "
- "should have been a NameOwnerChanged (creation)\n");
- goto out;
- }
-
- /* Check that ServiceOwnerChanged (creation) was correctly received */
- if (!check_service_auto_activated (context, connection, SHELL_SUCCESS_SERVICE_NAME,
- base_service, message))
- goto out;
-
- dbus_message_unref (message);
- message = NULL;
-
- break;
-
- case GOT_SERVICE_DELETED:
- {
- /* The service started up and got a base address, but then
- * failed to register under SHELL_SUCCESS_SERVICE_NAME
- */
- CheckServiceOwnerChangedData socd;
-
- socd.expected_kind = SERVICE_DELETED;
- socd.expected_service_name = base_service;
- socd.failed = FALSE;
- socd.skip_connection = NULL;
- bus_test_clients_foreach (check_service_owner_changed_foreach,
- &socd);
-
- if (socd.failed)
- goto out;
-
- break;
- }
-
- case GOT_ERROR:
- case GOT_SOMETHING_ELSE:
- _dbus_warn ("Unexpected message after auto activation\n");
- goto out;
- }
- }
-
- /* OK, now we've dealt with ServiceOwnerChanged signals, now should
- * come the method reply (or error) from the initial method call
- */
-
- /* Note: if this test is run in OOM mode, it will block when the bus
- * doesn't send a reply due to OOM.
- */
- block_connection_until_message_from_bus (context, connection, "reply from echo message after auto-activation");
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Failed to pop message! Should have been reply from echo message\n");
- goto out;
- }
-
- if (dbus_message_get_reply_serial (message) != serial)
- {
- _dbus_warn ("Wrong reply serial\n");
- goto out;
- }
-
- if (!dbus_message_get_args (message, NULL,
- DBUS_TYPE_STRING, &argv[0],
- DBUS_TYPE_STRING, &argv[1],
- DBUS_TYPE_STRING, &argv[2],
- DBUS_TYPE_STRING, &argv[3],
- DBUS_TYPE_STRING, &argv[4],
- DBUS_TYPE_STRING, &argv[5],
- DBUS_TYPE_STRING, &argv[6],
- DBUS_TYPE_INVALID))
- {
- _dbus_warn ("Error getting arguments from return\n");
- goto out;
- }
-
- /* don't worry about arg[0] as it may be different
- depending on the path to the tests
- */
- if (strcmp("-test", argv[1]) != 0)
- {
- _dbus_warn ("Unexpected argv[1] in shell success service test (expected: %s, got: %s)\n",
- "-test", argv[1]);
- goto out;
- }
-
- if (strcmp("that", argv[2]) != 0)
- {
- _dbus_warn ("Unexpected argv[2] in shell success service test (expected: %s, got: %s)\n",
- "that", argv[2]);
- goto out;
- }
-
- if (strcmp("we get", argv[3]) != 0)
- {
- _dbus_warn ("Unexpected argv[3] in shell success service test (expected: %s, got: %s)\n",
- "we get", argv[3]);
- goto out;
- }
-
- if (strcmp("back", argv[4]) != 0)
- {
- _dbus_warn ("Unexpected argv[4] in shell success service test (expected: %s, got: %s)\n",
- "back", argv[4]);
- goto out;
- }
-
- if (strcmp("--what", argv[5]) != 0)
- {
- _dbus_warn ("Unexpected argv[5] in shell success service test (expected: %s, got: %s)\n",
- "--what", argv[5]);
- goto out;
- }
-
- if (strcmp("we put in", argv[6]) != 0)
- {
- _dbus_warn ("Unexpected argv[6] in shell success service test (expected: %s, got: %s)\n",
- "we put in", argv[6]);
- goto out;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- if (!check_send_exit_to_service (context, connection,
- SHELL_SUCCESS_SERVICE_NAME,
- base_service))
- goto out;
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- if (base_service_message)
- dbus_message_unref (base_service_message);
-
- return retval;
-}
-
-typedef struct
-{
- Check1Func func;
- BusContext *context;
-} Check1Data;
-
-static dbus_bool_t
-check_oom_check1_func (void *data)
-{
- Check1Data *d = data;
-
- if (! (* d->func) (d->context))
- return FALSE;
-
- if (!check_no_leftovers (d->context))
- {
- _dbus_warn ("Messages were left over, should be covered by test suite\n");
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-check1_try_iterations (BusContext *context,
- const char *description,
- Check1Func func)
-{
- Check1Data d;
-
- d.func = func;
- d.context = context;
-
- if (!_dbus_test_oom_handling (description, check_oom_check1_func,
- &d))
- _dbus_assert_not_reached ("test failed");
-}
-
-static dbus_bool_t
-check_get_services (BusContext *context,
- DBusConnection *connection,
- const char *method,
- char ***services,
- int *len)
-{
- DBusMessage *message;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- DBusError error;
- char **srvs;
- int l;
-
- retval = FALSE;
- dbus_error_init (&error);
- message = NULL;
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- method);
-
- if (message == NULL)
- return TRUE;
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- /* send our message */
- bus_test_run_clients_loop (SEND_PENDING (connection));
-
- dbus_message_unref (message);
- message = NULL;
-
- dbus_connection_ref (connection); /* because we may get disconnected */
- block_connection_until_message_from_bus (context, connection, "reply to ListActivatableNames/ListNames");
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
-
- dbus_connection_unref (connection);
-
- return TRUE;
- }
-
- dbus_connection_unref (connection);
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive a reply to %s %d on %p\n",
- method, serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else
- {
- warn_unexpected (connection, message, "not this error");
-
- goto out;
- }
- }
- else
- {
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
- {
- ; /* good, expected */
- }
- else
- {
- warn_unexpected (connection, message,
- "method_return for ListActivatableNames/ListNames");
-
- goto out;
- }
-
- retry_get_property:
-
- if (!dbus_message_get_args (message, &error,
- DBUS_TYPE_ARRAY,
- DBUS_TYPE_STRING,
- &srvs, &l,
- DBUS_TYPE_INVALID))
- {
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- _dbus_verbose ("no memory to list services by %s\n", method);
- dbus_error_free (&error);
- _dbus_wait_for_memory ();
- goto retry_get_property;
- }
- else
- {
- _dbus_assert (dbus_error_is_set (&error));
- _dbus_warn ("Did not get the expected DBUS_TYPE_ARRAY from %s\n", method);
- goto out;
- }
- } else {
- *services = srvs;
- *len = l;
- }
- }
-
- if (!check_no_leftovers (context))
- goto out;
-
- retval = TRUE;
-
- out:
- dbus_error_free (&error);
-
- if (message)
- dbus_message_unref (message);
-
- return retval;
-}
-
-/* returns TRUE if the correct thing happens,
- * but the correct thing may include OOM errors.
- */
-static dbus_bool_t
-check_list_services (BusContext *context,
- DBusConnection *connection)
-{
- DBusMessage *message;
- DBusMessage *base_service_message;
- const char *base_service;
- dbus_uint32_t serial;
- dbus_bool_t retval;
- const char *existent = EXISTENT_SERVICE_NAME;
- dbus_uint32_t flags;
- char **services;
- int len;
-
- _dbus_verbose ("check_list_services for %p\n", connection);
-
- if (!check_get_services (context, connection, "ListActivatableNames", &services, &len))
- {
- return TRUE;
- }
-
- if (!_dbus_string_array_contains ((const char **)services, existent))
- {
- _dbus_warn ("Did not get the expected %s from ListActivatableNames\n", existent);
- dbus_free_string_array (services);
- return FALSE;
- }
-
- dbus_free_string_array (services);
-
- base_service_message = NULL;
-
- message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "StartServiceByName");
-
- if (message == NULL)
- return TRUE;
-
- dbus_message_set_auto_start (message, FALSE);
-
- flags = 0;
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &existent,
- DBUS_TYPE_UINT32, &flags,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- if (!dbus_connection_send (connection, message, &serial))
- {
- dbus_message_unref (message);
- return TRUE;
- }
-
- dbus_message_unref (message);
- message = NULL;
-
- bus_test_run_everything (context);
-
- /* now wait for the message bus to hear back from the activated
- * service.
- */
- block_connection_until_message_from_bus (context, connection, "activated service to connect");
-
- bus_test_run_everything (context);
-
- if (!dbus_connection_get_is_connected (connection))
- {
- _dbus_verbose ("connection was disconnected\n");
- return TRUE;
- }
-
- retval = FALSE;
-
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive any messages after %s %d on %p\n",
- "StartServiceByName", serial, connection);
- goto out;
- }
-
- verbose_message_received (connection, message);
- _dbus_verbose (" (after sending %s)\n", "StartServiceByName");
-
- if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
- {
- if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
- {
- _dbus_warn ("Message has wrong sender %s\n",
- dbus_message_get_sender (message) ?
- dbus_message_get_sender (message) : "(none)");
- goto out;
- }
-
- if (dbus_message_is_error (message,
- DBUS_ERROR_NO_MEMORY))
- {
- ; /* good, this is a valid response */
- }
- else if (dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_CHILD_EXITED) ||
- dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_CHILD_SIGNALED) ||
- dbus_message_is_error (message,
- DBUS_ERROR_SPAWN_EXEC_FAILED))
- {
- ; /* good, this is expected also */
- }
- else
- {
- _dbus_warn ("Did not expect error %s\n",
- dbus_message_get_error_name (message));
- goto out;
- }
- }
- else
- {
- GotServiceInfo message_kind;
-
- if (!check_base_service_activated (context, connection,
- message, &base_service))
- goto out;
-
- base_service_message = message;
- message = NULL;
-
- /* We may need to block here for the test service to exit or finish up */
- block_connection_until_message_from_bus (context, connection, "test service to exit or finish up");
-
- message = dbus_connection_borrow_message (connection);
- if (message == NULL)
- {
- _dbus_warn ("Did not receive any messages after base service creation notification\n");
- goto out;
- }
-
- message_kind = check_got_service_info (message);
-
- dbus_connection_return_message (connection, message);
- message = NULL;
-
- switch (message_kind)
- {
- case GOT_SOMETHING_ELSE:
- case GOT_ERROR:
- case GOT_SERVICE_DELETED:
- _dbus_warn ("Unexpected message after ActivateService "
- "(should be an error or a service announcement)\n");
- goto out;
-
- case GOT_SERVICE_CREATED:
- message = pop_message_waiting_for_memory (connection);
- if (message == NULL)
- {
- _dbus_warn ("Failed to pop message we just put back! "
- "should have been a NameOwnerChanged (creation)\n");
- goto out;
- }
-
- if (!check_service_activated (context, connection, EXISTENT_SERVICE_NAME,
- base_service, message))
- goto out;
-
- dbus_message_unref (message);
- message = NULL;
-
- if (!check_no_leftovers (context))
- {
- _dbus_warn ("Messages were left over after successful activation\n");
- goto out;
- }
-
- break;
- }
- }
-
- if (!check_get_services (context, connection, "ListNames", &services, &len))
- {
- return TRUE;
- }
-
- if (!_dbus_string_array_contains ((const char **)services, existent))
- {
- _dbus_warn ("Did not get the expected %s from ListNames\n", existent);
- goto out;
- }
-
- dbus_free_string_array (services);
-
- if (!check_send_exit_to_service (context, connection,
- EXISTENT_SERVICE_NAME, base_service))
- goto out;
-
- retval = TRUE;
-
- out:
- if (message)
- dbus_message_unref (message);
-
- if (base_service_message)
- dbus_message_unref (base_service_message);
-
- return retval;
-}
-
-typedef struct
-{
- Check2Func func;
- BusContext *context;
- DBusConnection *connection;
-} Check2Data;
-
-static dbus_bool_t
-check_oom_check2_func (void *data)
-{
- Check2Data *d = data;
-
- if (! (* d->func) (d->context, d->connection))
- return FALSE;
-
- if (!check_no_leftovers (d->context))
- {
- _dbus_warn ("Messages were left over, should be covered by test suite\n");
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-check2_try_iterations (BusContext *context,
- DBusConnection *connection,
- const char *description,
- Check2Func func)
-{
- Check2Data d;
-
- d.func = func;
- d.context = context;
- d.connection = connection;
-
- if (!_dbus_test_oom_handling (description, check_oom_check2_func,
- &d))
- {
- _dbus_warn ("%s failed during oom\n", description);
- _dbus_assert_not_reached ("test failed");
- }
-}
-
-static dbus_bool_t
-setenv_TEST_LAUNCH_HELPER_CONFIG(const DBusString *test_data_dir,
- const char *filename)
-{
- DBusString full;
- DBusString file;
-
- if (!_dbus_string_init (&full))
- return FALSE;
-
- if (!_dbus_string_copy (test_data_dir, 0, &full, 0))
- {
- _dbus_string_free (&full);
- return FALSE;
- }
-
- _dbus_string_init_const (&file, filename);
-
- if (!_dbus_concat_dir_and_file (&full, &file))
- {
- _dbus_string_free (&full);
- return FALSE;
- }
-
- _dbus_verbose ("Setting TEST_LAUNCH_HELPER_CONFIG to '%s'\n",
- _dbus_string_get_const_data (&full));
-
- dbus_setenv ("TEST_LAUNCH_HELPER_CONFIG", _dbus_string_get_const_data (&full));
-
- _dbus_string_free (&full);
-
- return TRUE;
-}
-
-static dbus_bool_t
-bus_dispatch_test_conf (const DBusString *test_data_dir,
- const char *filename,
- dbus_bool_t use_launcher)
-{
- BusContext *context;
- DBusConnection *foo;
- DBusConnection *bar;
- DBusConnection *baz;
- DBusError error;
-
- /* save the config name for the activation helper */
- if (!setenv_TEST_LAUNCH_HELPER_CONFIG (test_data_dir, filename))
- _dbus_assert_not_reached ("no memory setting TEST_LAUNCH_HELPER_CONFIG");
-
- dbus_error_init (&error);
-
- context = bus_context_new_test (test_data_dir, filename);
- if (context == NULL)
- return FALSE;
-
- foo = dbus_connection_open_private (TEST_DEBUG_PIPE, &error);
- if (foo == NULL)
- _dbus_assert_not_reached ("could not alloc connection");
-
- if (!bus_setup_debug_client (foo))
- _dbus_assert_not_reached ("could not set up connection");
-
- spin_connection_until_authenticated (context, foo);
-
- if (!check_hello_message (context, foo))
- _dbus_assert_not_reached ("hello message failed");
-
- if (!check_double_hello_message (context, foo))
- _dbus_assert_not_reached ("double hello message failed");
-
- if (!check_add_match_all (context, foo))
- _dbus_assert_not_reached ("AddMatch message failed");
-
- bar = dbus_connection_open_private (TEST_DEBUG_PIPE, &error);
- if (bar == NULL)
- _dbus_assert_not_reached ("could not alloc connection");
-
- if (!bus_setup_debug_client (bar))
- _dbus_assert_not_reached ("could not set up connection");
-
- spin_connection_until_authenticated (context, bar);
-
- if (!check_hello_message (context, bar))
- _dbus_assert_not_reached ("hello message failed");
-
- if (!check_add_match_all (context, bar))
- _dbus_assert_not_reached ("AddMatch message failed");
-
- baz = dbus_connection_open_private (TEST_DEBUG_PIPE, &error);
- if (baz == NULL)
- _dbus_assert_not_reached ("could not alloc connection");
-
- if (!bus_setup_debug_client (baz))
- _dbus_assert_not_reached ("could not set up connection");
-
- spin_connection_until_authenticated (context, baz);
-
- if (!check_hello_message (context, baz))
- _dbus_assert_not_reached ("hello message failed");
-
- if (!check_add_match_all (context, baz))
- _dbus_assert_not_reached ("AddMatch message failed");
-
-#ifdef DBUS_WIN_FIXME
- _dbus_warn("TODO: testing of GetConnectionUnixUser message skipped for now\n");
- _dbus_warn("TODO: testing of GetConnectionUnixProcessID message skipped for now\n");
-#else
- if (!check_get_connection_unix_user (context, baz))
- _dbus_assert_not_reached ("GetConnectionUnixUser message failed");
-
- if (!check_get_connection_unix_process_id (context, baz))
- _dbus_assert_not_reached ("GetConnectionUnixProcessID message failed");
-#endif
-
- if (!check_list_services (context, baz))
- _dbus_assert_not_reached ("ListActivatableNames message failed");
-
- if (!check_no_leftovers (context))
- {
- _dbus_warn ("Messages were left over after setting up initial connections\n");
- _dbus_assert_not_reached ("initial connection setup failed");
- }
-
- check1_try_iterations (context, "create_and_hello",
- check_hello_connection);
-
- check2_try_iterations (context, foo, "nonexistent_service_no_auto_start",
- check_nonexistent_service_no_auto_start);
-
-#ifdef DBUS_WIN_FIXME
- _dbus_warn("TODO: dispatch.c segfault_service_no_auto_start test\n");
-#else
- check2_try_iterations (context, foo, "segfault_service_no_auto_start",
- check_segfault_service_no_auto_start);
-#endif
-
- check2_try_iterations (context, foo, "existent_service_no_auto_start",
- check_existent_service_no_auto_start);
-
- check2_try_iterations (context, foo, "nonexistent_service_auto_start",
- check_nonexistent_service_auto_start);
-
-
-#ifdef DBUS_WIN_FIXME
- _dbus_warn("TODO: dispatch.c segfault_service_auto_start test\n");
-#else
- /* only do the segfault test if we are not using the launcher */
- check2_try_iterations (context, foo, "segfault_service_auto_start",
- check_segfault_service_auto_start);
-#endif
-
- /* only do the shell fail test if we are not using the launcher */
- check2_try_iterations (context, foo, "shell_fail_service_auto_start",
- check_shell_fail_service_auto_start);
-
- /* specific to launcher */
- if (use_launcher)
- if (!check_launch_service_file_missing (context, foo))
- _dbus_assert_not_reached ("did not get service file not found error");
-
-#if 0
- /* Note: need to resolve some issues with the testing code in order to run
- * this in oom (handle that we sometimes don't get replies back from the bus
- * when oom happens, without blocking the test).
- */
- check2_try_iterations (context, foo, "existent_service_auto_auto_start",
- check_existent_service_auto_start);
-#endif
-
- if (!check_existent_service_auto_start (context, foo))
- _dbus_assert_not_reached ("existent service auto start failed");
-
- if (!check_shell_service_success_auto_start (context, foo))
- _dbus_assert_not_reached ("shell success service auto start failed");
-
- _dbus_verbose ("Disconnecting foo, bar, and baz\n");
-
- kill_client_connection_unchecked (foo);
- kill_client_connection_unchecked (bar);
- kill_client_connection_unchecked (baz);
-
- bus_context_unref (context);
-
- return TRUE;
-}
-
-static dbus_bool_t
-bus_dispatch_test_conf_fail (const DBusString *test_data_dir,
- const char *filename)
-{
- BusContext *context;
- DBusConnection *foo;
- DBusError error;
-
- /* save the config name for the activation helper */
- if (!setenv_TEST_LAUNCH_HELPER_CONFIG (test_data_dir, filename))
- _dbus_assert_not_reached ("no memory setting TEST_LAUNCH_HELPER_CONFIG");
-
- dbus_error_init (&error);
-
- context = bus_context_new_test (test_data_dir, filename);
- if (context == NULL)
- return FALSE;
-
- foo = dbus_connection_open_private (TEST_DEBUG_PIPE, &error);
- if (foo == NULL)
- _dbus_assert_not_reached ("could not alloc connection");
-
- if (!bus_setup_debug_client (foo))
- _dbus_assert_not_reached ("could not set up connection");
-
- spin_connection_until_authenticated (context, foo);
-
- if (!check_hello_message (context, foo))
- _dbus_assert_not_reached ("hello message failed");
-
- if (!check_double_hello_message (context, foo))
- _dbus_assert_not_reached ("double hello message failed");
-
- if (!check_add_match_all (context, foo))
- _dbus_assert_not_reached ("AddMatch message failed");
-
- /* this only tests the activation.c user check */
- if (!check_launch_service_user_missing (context, foo))
- _dbus_assert_not_reached ("user missing did not trigger error");
-
- /* this only tests the desktop.c exec check */
- if (!check_launch_service_exec_missing (context, foo))
- _dbus_assert_not_reached ("exec missing did not trigger error");
-
- /* this only tests the desktop.c service check */
- if (!check_launch_service_service_missing (context, foo))
- _dbus_assert_not_reached ("service missing did not trigger error");
-
- _dbus_verbose ("Disconnecting foo\n");
-
- kill_client_connection_unchecked (foo);
-
- bus_context_unref (context);
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_dispatch_test (const DBusString *test_data_dir)
-{
- /* run normal activation tests */
- _dbus_verbose ("Normal activation tests\n");
- if (!bus_dispatch_test_conf (test_data_dir,
- "valid-config-files/debug-allow-all.conf", FALSE))
- return FALSE;
-
-#ifdef DBUS_WIN
- _dbus_warn("Info: Launch helper activation tests skipped because launch-helper is not supported yet\n");
-#else
- /* run launch-helper activation tests */
- _dbus_verbose ("Launch helper activation tests\n");
- if (!bus_dispatch_test_conf (test_data_dir,
- "valid-config-files-system/debug-allow-all-pass.conf", TRUE))
- return FALSE;
-
- /* run select launch-helper activation tests on broken service files */
- if (!bus_dispatch_test_conf_fail (test_data_dir,
- "valid-config-files-system/debug-allow-all-fail.conf"))
- return FALSE;
-#endif
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_dispatch_sha1_test (const DBusString *test_data_dir)
-{
- BusContext *context;
- DBusConnection *foo;
- DBusError error;
-
- dbus_error_init (&error);
-
- /* Test SHA1 authentication */
- _dbus_verbose ("Testing SHA1 context\n");
-
- context = bus_context_new_test (test_data_dir,
- "valid-config-files/debug-allow-all-sha1.conf");
- if (context == NULL)
- return FALSE;
-
- foo = dbus_connection_open_private (TEST_DEBUG_PIPE, &error);
- if (foo == NULL)
- _dbus_assert_not_reached ("could not alloc connection");
-
- if (!bus_setup_debug_client (foo))
- _dbus_assert_not_reached ("could not set up connection");
-
- spin_connection_until_authenticated (context, foo);
-
- if (!check_hello_message (context, foo))
- _dbus_assert_not_reached ("hello message failed");
-
- if (!check_add_match_all (context, foo))
- _dbus_assert_not_reached ("addmatch message failed");
-
- if (!check_no_leftovers (context))
- {
- _dbus_warn ("Messages were left over after setting up initial SHA-1 connection\n");
- _dbus_assert_not_reached ("initial connection setup failed");
- }
-
- check1_try_iterations (context, "create_and_hello_sha1",
- check_hello_connection);
-
- kill_client_connection_unchecked (foo);
-
- bus_context_unref (context);
-
- return TRUE;
-}
-
-#ifdef HAVE_UNIX_FD_PASSING
-
-dbus_bool_t
-bus_unix_fds_passing_test(const DBusString *test_data_dir)
-{
- BusContext *context;
- DBusConnection *foo, *bar;
- DBusError error;
- DBusMessage *m;
- int one[2], two[2], x, y, z;
- char r;
-
- dbus_error_init (&error);
-
- context = bus_context_new_test (test_data_dir, "valid-config-files/debug-allow-all.conf");
- if (context == NULL)
- _dbus_assert_not_reached ("could not alloc context");
-
- foo = dbus_connection_open_private (TEST_DEBUG_PIPE, &error);
- if (foo == NULL)
- _dbus_assert_not_reached ("could not alloc connection");
-
- if (!bus_setup_debug_client (foo))
- _dbus_assert_not_reached ("could not set up connection");
-
- spin_connection_until_authenticated (context, foo);
-
- if (!check_hello_message (context, foo))
- _dbus_assert_not_reached ("hello message failed");
-
- if (!check_add_match_all (context, foo))
- _dbus_assert_not_reached ("AddMatch message failed");
-
- bar = dbus_connection_open_private (TEST_DEBUG_PIPE, &error);
- if (bar == NULL)
- _dbus_assert_not_reached ("could not alloc connection");
-
- if (!bus_setup_debug_client (bar))
- _dbus_assert_not_reached ("could not set up connection");
-
- spin_connection_until_authenticated (context, bar);
-
- if (!check_hello_message (context, bar))
- _dbus_assert_not_reached ("hello message failed");
-
- if (!check_add_match_all (context, bar))
- _dbus_assert_not_reached ("AddMatch message failed");
-
- if (!(m = dbus_message_new_signal("/", "a.b.c", "d")))
- _dbus_assert_not_reached ("could not alloc message");
-
- if (!(_dbus_full_duplex_pipe(one, one+1, TRUE, &error)))
- _dbus_assert_not_reached("Failed to allocate pipe #1");
-
- if (!(_dbus_full_duplex_pipe(two, two+1, TRUE, &error)))
- _dbus_assert_not_reached("Failed to allocate pipe #2");
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_UNIX_FD, one,
- DBUS_TYPE_UNIX_FD, two,
- DBUS_TYPE_UNIX_FD, two,
- DBUS_TYPE_INVALID))
- _dbus_assert_not_reached("Failed to attach fds.");
-
- if (!_dbus_close(one[0], &error))
- _dbus_assert_not_reached("Failed to close pipe #1 ");
- if (!_dbus_close(two[0], &error))
- _dbus_assert_not_reached("Failed to close pipe #2 ");
-
- if (!(dbus_connection_can_send_type(foo, DBUS_TYPE_UNIX_FD)))
- _dbus_assert_not_reached("Connection cannot do fd passing");
-
- if (!(dbus_connection_can_send_type(bar, DBUS_TYPE_UNIX_FD)))
- _dbus_assert_not_reached("Connection cannot do fd passing");
-
- if (!dbus_connection_send (foo, m, NULL))
- _dbus_assert_not_reached("Failed to send fds");
-
- dbus_message_unref(m);
-
- bus_test_run_clients_loop (SEND_PENDING (foo));
-
- bus_test_run_everything (context);
-
- block_connection_until_message_from_bus (context, foo, "unix fd reception on foo");
-
- if (!(m = pop_message_waiting_for_memory (foo)))
- _dbus_assert_not_reached("Failed to receive msg");
-
- if (!dbus_message_is_signal(m, "a.b.c", "d"))
- _dbus_assert_not_reached("bogus message received");
-
- dbus_message_unref(m);
-
- block_connection_until_message_from_bus (context, bar, "unix fd reception on bar");
-
- if (!(m = pop_message_waiting_for_memory (bar)))
- _dbus_assert_not_reached("Failed to receive msg");
-
- if (!dbus_message_is_signal(m, "a.b.c", "d"))
- _dbus_assert_not_reached("bogus message received");
-
- if (!dbus_message_get_args(m,
- &error,
- DBUS_TYPE_UNIX_FD, &x,
- DBUS_TYPE_UNIX_FD, &y,
- DBUS_TYPE_UNIX_FD, &z,
- DBUS_TYPE_INVALID))
- _dbus_assert_not_reached("Failed to parse fds.");
-
- dbus_message_unref(m);
-
- if (write(x, "X", 1) != 1)
- _dbus_assert_not_reached("Failed to write to pipe #1");
- if (write(y, "Y", 1) != 1)
- _dbus_assert_not_reached("Failed to write to pipe #2");
- if (write(z, "Z", 1) != 1)
- _dbus_assert_not_reached("Failed to write to pipe #2/2nd fd");
-
- if (!_dbus_close(x, &error))
- _dbus_assert_not_reached("Failed to close pipe #1/other side ");
- if (!_dbus_close(y, &error))
- _dbus_assert_not_reached("Failed to close pipe #2/other side ");
- if (!_dbus_close(z, &error))
- _dbus_assert_not_reached("Failed to close pipe #2/other size 2nd fd ");
-
- if (read(one[1], &r, 1) != 1 || r != 'X')
- _dbus_assert_not_reached("Failed to read value from pipe.");
- if (read(two[1], &r, 1) != 1 || r != 'Y')
- _dbus_assert_not_reached("Failed to read value from pipe.");
- if (read(two[1], &r, 1) != 1 || r != 'Z')
- _dbus_assert_not_reached("Failed to read value from pipe.");
-
- if (!_dbus_close(one[1], &error))
- _dbus_assert_not_reached("Failed to close pipe #1 ");
- if (!_dbus_close(two[1], &error))
- _dbus_assert_not_reached("Failed to close pipe #2 ");
-
- _dbus_verbose ("Disconnecting foo\n");
- kill_client_connection_unchecked (foo);
-
- _dbus_verbose ("Disconnecting bar\n");
- kill_client_connection_unchecked (bar);
-
- bus_context_unref (context);
-
- return TRUE;
-}
-#endif
-
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
diff --git a/src/3rd_party/dbus-1.7.8/bus/dispatch.h b/src/3rd_party/dbus-1.7.8/bus/dispatch.h
deleted file mode 100644
index fb5ba7a5b1..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/dispatch.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* dispatch.h Message dispatcher
- *
- * Copyright (C) 2003 CodeFactory AB
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_DISPATCH_H
-#define BUS_DISPATCH_H
-
-#include <dbus/dbus.h>
-#include "connection.h"
-
-dbus_bool_t bus_dispatch_add_connection (DBusConnection *connection);
-void bus_dispatch_remove_connection (DBusConnection *connection);
-dbus_bool_t bus_dispatch_matches (BusTransaction *transaction,
- DBusConnection *sender,
- DBusConnection *recipient,
- DBusMessage *message,
- DBusError *error);
-
-#endif /* BUS_DISPATCH_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/driver.c b/src/3rd_party/dbus-1.7.8/bus/driver.c
deleted file mode 100644
index e95a79d9df..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/driver.c
+++ /dev/null
@@ -1,2068 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* driver.c Bus client (driver)
- *
- * Copyright (C) 2003 CodeFactory AB
- * Copyright (C) 2003, 2004, 2005 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "activation.h"
-#include "connection.h"
-#include "driver.h"
-#include "dispatch.h"
-#include "services.h"
-#include "selinux.h"
-#include "signals.h"
-#include "stats.h"
-#include "utils.h"
-
-#include <dbus/dbus-asv-util.h>
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-message.h>
-#include <dbus/dbus-marshal-recursive.h>
-#include <string.h>
-
-static DBusConnection *
-bus_driver_get_conn_helper (DBusConnection *connection,
- DBusMessage *message,
- const char *what_we_want,
- const char **name_p,
- DBusError *error)
-{
- const char *name;
- BusRegistry *registry;
- BusService *serv;
- DBusString str;
- DBusConnection *conn;
-
- if (!dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_INVALID))
- return NULL;
-
- _dbus_assert (name != NULL);
- _dbus_verbose ("asked for %s of connection %s\n", what_we_want, name);
-
- registry = bus_connection_get_registry (connection);
- _dbus_string_init_const (&str, name);
- serv = bus_registry_lookup (registry, &str);
-
- if (serv == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_NAME_HAS_NO_OWNER,
- "Could not get %s of name '%s': no such name",
- what_we_want, name);
- return NULL;
- }
-
- conn = bus_service_get_primary_owners_connection (serv);
- _dbus_assert (conn != NULL);
-
- if (name_p != NULL)
- *name_p = name;
-
- return conn;
-}
-
-static dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection,
- DBusMessage *hello_message,
- BusTransaction *transaction,
- DBusError *error);
-
-dbus_bool_t
-bus_driver_send_service_owner_changed (const char *service_name,
- const char *old_owner,
- const char *new_owner,
- BusTransaction *transaction,
- DBusError *error)
-{
- DBusMessage *message;
- dbus_bool_t retval;
- const char *null_service;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- null_service = "";
- _dbus_verbose ("sending name owner changed: %s [%s -> %s]\n",
- service_name,
- old_owner ? old_owner : null_service,
- new_owner ? new_owner : null_service);
-
- message = dbus_message_new_signal (DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "NameOwnerChanged");
-
- if (message == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
- goto oom;
-
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, old_owner ? &old_owner : &null_service,
- DBUS_TYPE_STRING, new_owner ? &new_owner : &null_service,
- DBUS_TYPE_INVALID))
- goto oom;
-
- _dbus_assert (dbus_message_has_signature (message, "sss"));
-
- retval = bus_dispatch_matches (transaction, NULL, NULL, message, error);
- dbus_message_unref (message);
-
- return retval;
-
- oom:
- dbus_message_unref (message);
- BUS_SET_OOM (error);
- return FALSE;
-}
-
-dbus_bool_t
-bus_driver_send_service_lost (DBusConnection *connection,
- const char *service_name,
- BusTransaction *transaction,
- DBusError *error)
-{
- DBusMessage *message;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- message = dbus_message_new_signal (DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "NameLost");
-
- if (message == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
- !dbus_message_append_args (message,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!bus_transaction_send_from_driver (transaction, connection, message))
- {
- dbus_message_unref (message);
- BUS_SET_OOM (error);
- return FALSE;
- }
- else
- {
- dbus_message_unref (message);
- return TRUE;
- }
-}
-
-dbus_bool_t
-bus_driver_send_service_acquired (DBusConnection *connection,
- const char *service_name,
- BusTransaction *transaction,
- DBusError *error)
-{
- DBusMessage *message;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- message = dbus_message_new_signal (DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- "NameAcquired");
-
- if (message == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
- !dbus_message_append_args (message,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (message);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!bus_transaction_send_from_driver (transaction, connection, message))
- {
- dbus_message_unref (message);
- BUS_SET_OOM (error);
- return FALSE;
- }
- else
- {
- dbus_message_unref (message);
- return TRUE;
- }
-}
-
-static dbus_bool_t
-create_unique_client_name (BusRegistry *registry,
- DBusString *str)
-{
- /* We never want to use the same unique client name twice, because
- * we want to guarantee that if you send a message to a given unique
- * name, you always get the same application. So we use two numbers
- * for INT_MAX * INT_MAX combinations, should be pretty safe against
- * wraparound.
- */
- /* FIXME these should be in BusRegistry rather than static vars */
- static int next_major_number = 0;
- static int next_minor_number = 0;
- int len;
-
- len = _dbus_string_get_length (str);
-
- while (TRUE)
- {
- /* start out with 1-0, go to 1-1, 1-2, 1-3,
- * up to 1-MAXINT, then 2-0, 2-1, etc.
- */
- if (next_minor_number <= 0)
- {
- next_major_number += 1;
- next_minor_number = 0;
- if (next_major_number <= 0)
- _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added");
- }
-
- _dbus_assert (next_major_number > 0);
- _dbus_assert (next_minor_number >= 0);
-
- /* appname:MAJOR-MINOR */
-
- if (!_dbus_string_append (str, ":"))
- return FALSE;
-
- if (!_dbus_string_append_int (str, next_major_number))
- return FALSE;
-
- if (!_dbus_string_append (str, "."))
- return FALSE;
-
- if (!_dbus_string_append_int (str, next_minor_number))
- return FALSE;
-
- next_minor_number += 1;
-
- /* Check if a client with the name exists */
- if (bus_registry_lookup (registry, str) == NULL)
- break;
-
- /* drop the number again, try the next one. */
- _dbus_string_set_length (str, len);
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-bus_driver_handle_hello (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusString unique_name;
- BusService *service;
- dbus_bool_t retval;
- BusRegistry *registry;
- BusConnections *connections;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (bus_connection_is_active (connection))
- {
- /* We already handled an Hello message for this connection. */
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Already handled an Hello message");
- return FALSE;
- }
-
- /* Note that when these limits are exceeded we don't disconnect the
- * connection; we just sort of leave it hanging there until it times
- * out or disconnects itself or is dropped due to the max number of
- * incomplete connections. It's even OK if the connection wants to
- * retry the hello message, we support that.
- */
- connections = bus_connection_get_connections (connection);
- if (!bus_connections_check_limits (connections, connection,
- error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- return FALSE;
- }
-
- if (!_dbus_string_init (&unique_name))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- retval = FALSE;
-
- registry = bus_connection_get_registry (connection);
-
- if (!create_unique_client_name (registry, &unique_name))
- {
- BUS_SET_OOM (error);
- goto out_0;
- }
-
- if (!bus_connection_complete (connection, &unique_name, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- goto out_0;
- }
-
- if (!dbus_message_set_sender (message,
- bus_connection_get_name (connection)))
- {
- BUS_SET_OOM (error);
- goto out_0;
- }
-
- if (!bus_driver_send_welcome_message (connection, message, transaction, error))
- goto out_0;
-
- /* Create the service */
- service = bus_registry_ensure (registry,
- &unique_name, connection, 0, transaction, error);
- if (service == NULL)
- goto out_0;
-
- _dbus_assert (bus_connection_is_active (connection));
- retval = TRUE;
-
- out_0:
- _dbus_string_free (&unique_name);
- return retval;
-}
-
-static dbus_bool_t
-bus_driver_send_welcome_message (DBusConnection *connection,
- DBusMessage *hello_message,
- BusTransaction *transaction,
- DBusError *error)
-{
- DBusMessage *welcome;
- const char *name;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- name = bus_connection_get_name (connection);
- _dbus_assert (name != NULL);
-
- welcome = dbus_message_new_method_return (hello_message);
- if (welcome == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!dbus_message_append_args (welcome,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (welcome);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- _dbus_assert (dbus_message_has_signature (welcome, DBUS_TYPE_STRING_AS_STRING));
-
- if (!bus_transaction_send_from_driver (transaction, connection, welcome))
- {
- dbus_message_unref (welcome);
- BUS_SET_OOM (error);
- return FALSE;
- }
- else
- {
- dbus_message_unref (welcome);
- return TRUE;
- }
-}
-
-static dbus_bool_t
-bus_driver_handle_list_services (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusMessage *reply;
- int len;
- char **services;
- BusRegistry *registry;
- int i;
- DBusMessageIter iter;
- DBusMessageIter sub;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- registry = bus_connection_get_registry (connection);
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!bus_registry_list_services (registry, &services, &len))
- {
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- dbus_message_iter_init_append (reply, &iter);
-
- if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
- DBUS_TYPE_STRING_AS_STRING,
- &sub))
- {
- dbus_free_string_array (services);
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- {
- /* Include the bus driver in the list */
- const char *v_STRING = DBUS_SERVICE_DBUS;
- if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
- &v_STRING))
- {
- dbus_free_string_array (services);
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
- }
-
- i = 0;
- while (i < len)
- {
- if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
- &services[i]))
- {
- dbus_free_string_array (services);
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
- ++i;
- }
-
- dbus_free_string_array (services);
-
- if (!dbus_message_iter_close_container (&iter, &sub))
- {
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!bus_transaction_send_from_driver (transaction, connection, reply))
- {
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
- else
- {
- dbus_message_unref (reply);
- return TRUE;
- }
-}
-
-static dbus_bool_t
-bus_driver_handle_list_activatable_services (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusMessage *reply;
- int len;
- char **services;
- BusActivation *activation;
- int i;
- DBusMessageIter iter;
- DBusMessageIter sub;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- activation = bus_connection_get_activation (connection);
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!bus_activation_list_services (activation, &services, &len))
- {
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- dbus_message_iter_init_append (reply, &iter);
-
- if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
- DBUS_TYPE_STRING_AS_STRING,
- &sub))
- {
- dbus_free_string_array (services);
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- {
- /* Include the bus driver in the list */
- const char *v_STRING = DBUS_SERVICE_DBUS;
- if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
- &v_STRING))
- {
- dbus_free_string_array (services);
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
- }
-
- i = 0;
- while (i < len)
- {
- if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
- &services[i]))
- {
- dbus_free_string_array (services);
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
- ++i;
- }
-
- dbus_free_string_array (services);
-
- if (!dbus_message_iter_close_container (&iter, &sub))
- {
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!bus_transaction_send_from_driver (transaction, connection, reply))
- {
- dbus_message_unref (reply);
- BUS_SET_OOM (error);
- return FALSE;
- }
- else
- {
- dbus_message_unref (reply);
- return TRUE;
- }
-}
-
-static dbus_bool_t
-bus_driver_handle_acquire_service (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusMessage *reply;
- DBusString service_name;
- const char *name;
- dbus_uint32_t service_reply;
- dbus_uint32_t flags;
- dbus_bool_t retval;
- BusRegistry *registry;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- registry = bus_connection_get_registry (connection);
-
- if (!dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_UINT32, &flags,
- DBUS_TYPE_INVALID))
- return FALSE;
-
- _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags);
-
- retval = FALSE;
- reply = NULL;
-
- _dbus_string_init_const (&service_name, name);
-
- if (!bus_registry_acquire_service (registry, connection,
- &service_name, flags,
- &service_reply, transaction,
- error))
- goto out;
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!bus_transaction_send_from_driver (transaction, connection, reply))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (reply)
- dbus_message_unref (reply);
- return retval;
-}
-
-static dbus_bool_t
-bus_driver_handle_release_service (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusMessage *reply;
- DBusString service_name;
- const char *name;
- dbus_uint32_t service_reply;
- dbus_bool_t retval;
- BusRegistry *registry;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- registry = bus_connection_get_registry (connection);
-
- if (!dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_INVALID))
- return FALSE;
-
- _dbus_verbose ("Trying to release name %s\n", name);
-
- retval = FALSE;
- reply = NULL;
-
- _dbus_string_init_const (&service_name, name);
-
- if (!bus_registry_release_service (registry, connection,
- &service_name, &service_reply,
- transaction, error))
- goto out;
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!bus_transaction_send_from_driver (transaction, connection, reply))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (reply)
- dbus_message_unref (reply);
- return retval;
-}
-
-static dbus_bool_t
-bus_driver_handle_service_exists (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusMessage *reply;
- DBusString service_name;
- BusService *service;
- dbus_bool_t service_exists;
- const char *name;
- dbus_bool_t retval;
- BusRegistry *registry;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- registry = bus_connection_get_registry (connection);
-
- if (!dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_INVALID))
- return FALSE;
-
- retval = FALSE;
-
- if (strcmp (name, DBUS_SERVICE_DBUS) == 0)
- {
- service_exists = TRUE;
- }
- else
- {
- _dbus_string_init_const (&service_name, name);
- service = bus_registry_lookup (registry, &service_name);
- service_exists = service != NULL;
- }
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!dbus_message_append_args (reply,
- DBUS_TYPE_BOOLEAN, &service_exists,
- 0))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!bus_transaction_send_from_driver (transaction, connection, reply))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- retval = TRUE;
-
- out:
- if (reply)
- dbus_message_unref (reply);
-
- return retval;
-}
-
-static dbus_bool_t
-bus_driver_handle_activate_service (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- dbus_uint32_t flags;
- const char *name;
- dbus_bool_t retval;
- BusActivation *activation;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- activation = bus_connection_get_activation (connection);
-
- if (!dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_UINT32, &flags,
- DBUS_TYPE_INVALID))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- _dbus_verbose ("No memory to get arguments to StartServiceByName\n");
- return FALSE;
- }
-
- retval = FALSE;
-
- if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
- message, name, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- _dbus_verbose ("bus_activation_activate_service() failed\n");
- goto out;
- }
-
- retval = TRUE;
-
- out:
- return retval;
-}
-
-static dbus_bool_t
-send_ack_reply (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusMessage *reply;
-
- if (dbus_message_get_no_reply (message))
- return TRUE;
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!bus_transaction_send_from_driver (transaction, connection, reply))
- {
- BUS_SET_OOM (error);
- dbus_message_unref (reply);
- return FALSE;
- }
-
- dbus_message_unref (reply);
-
- return TRUE;
-}
-
-static dbus_bool_t
-bus_driver_handle_update_activation_environment (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- dbus_bool_t retval;
- BusActivation *activation;
- DBusMessageIter iter;
- DBusMessageIter dict_iter;
- DBusMessageIter dict_entry_iter;
- int array_type;
- int key_type;
- DBusList *keys, *key_link;
- DBusList *values, *value_link;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- activation = bus_connection_get_activation (connection);
-
- dbus_message_iter_init (message, &iter);
-
- /* The message signature has already been checked for us,
- * so let's just assert it's right.
- */
- _dbus_assert (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY);
-
- dbus_message_iter_recurse (&iter, &dict_iter);
-
- retval = FALSE;
-
- /* Then loop through the sent dictionary, add the location of
- * the environment keys and values to lists. The result will
- * be in reverse order, so we don't have to constantly search
- * for the end of the list in a loop.
- */
- keys = NULL;
- values = NULL;
- while ((array_type = dbus_message_iter_get_arg_type (&dict_iter)) == DBUS_TYPE_DICT_ENTRY)
- {
- dbus_message_iter_recurse (&dict_iter, &dict_entry_iter);
-
- while ((key_type = dbus_message_iter_get_arg_type (&dict_entry_iter)) == DBUS_TYPE_STRING)
- {
- char *key;
- char *value;
- int value_type;
-
- dbus_message_iter_get_basic (&dict_entry_iter, &key);
- dbus_message_iter_next (&dict_entry_iter);
-
- value_type = dbus_message_iter_get_arg_type (&dict_entry_iter);
-
- if (value_type != DBUS_TYPE_STRING)
- break;
-
- dbus_message_iter_get_basic (&dict_entry_iter, &value);
-
- if (!_dbus_list_append (&keys, key))
- {
- BUS_SET_OOM (error);
- break;
- }
-
- if (!_dbus_list_append (&values, value))
- {
- BUS_SET_OOM (error);
- break;
- }
-
- dbus_message_iter_next (&dict_entry_iter);
- }
-
- if (key_type != DBUS_TYPE_INVALID)
- break;
-
- dbus_message_iter_next (&dict_iter);
- }
-
- if (array_type != DBUS_TYPE_INVALID)
- goto out;
-
- _dbus_assert (_dbus_list_get_length (&keys) == _dbus_list_get_length (&values));
-
- key_link = keys;
- value_link = values;
- while (key_link != NULL)
- {
- const char *key;
- const char *value;
-
- key = key_link->data;
- value = value_link->data;
-
- if (!bus_activation_set_environment_variable (activation,
- key, value, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- _dbus_verbose ("bus_activation_set_environment_variable() failed\n");
- break;
- }
- key_link = _dbus_list_get_next_link (&keys, key_link);
- value_link = _dbus_list_get_next_link (&values, value_link);
- }
-
- /* FIXME: We can fail early having set only some of the environment variables,
- * (because of OOM failure). It's sort of hard to fix and it doesn't really
- * matter, so we're punting for now.
- */
- if (key_link != NULL)
- goto out;
-
- if (!send_ack_reply (connection, transaction,
- message, error))
- goto out;
-
- retval = TRUE;
-
- out:
- _dbus_list_clear (&keys);
- _dbus_list_clear (&values);
- return retval;
-}
-
-static dbus_bool_t
-bus_driver_handle_add_match (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- BusMatchRule *rule;
- const char *text;
- DBusString str;
- BusMatchmaker *matchmaker;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- text = NULL;
- rule = NULL;
-
- if (bus_connection_get_n_match_rules (connection) >=
- bus_context_get_max_match_rules_per_connection (bus_transaction_get_context (transaction)))
- {
- dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
- "Connection \"%s\" is not allowed to add more match rules "
- "(increase limits in configuration file if required)",
- bus_connection_is_active (connection) ?
- bus_connection_get_name (connection) :
- "(inactive)");
- goto failed;
- }
-
- if (!dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID))
- {
- _dbus_verbose ("No memory to get arguments to AddMatch\n");
- goto failed;
- }
-
- _dbus_string_init_const (&str, text);
-
- rule = bus_match_rule_parse (connection, &str, error);
- if (rule == NULL)
- goto failed;
-
- matchmaker = bus_connection_get_matchmaker (connection);
-
- if (!bus_matchmaker_add_rule (matchmaker, rule))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (!send_ack_reply (connection, transaction,
- message, error))
- {
- bus_matchmaker_remove_rule (matchmaker, rule);
- goto failed;
- }
-
- bus_match_rule_unref (rule);
-
- return TRUE;
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (rule)
- bus_match_rule_unref (rule);
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_remove_match (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- BusMatchRule *rule;
- const char *text;
- DBusString str;
- BusMatchmaker *matchmaker;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- text = NULL;
- rule = NULL;
-
- if (!dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID))
- {
- _dbus_verbose ("No memory to get arguments to RemoveMatch\n");
- goto failed;
- }
-
- _dbus_string_init_const (&str, text);
-
- rule = bus_match_rule_parse (connection, &str, error);
- if (rule == NULL)
- goto failed;
-
- /* Send the ack before we remove the rule, since the ack is undone
- * on transaction cancel, but rule removal isn't.
- */
- if (!send_ack_reply (connection, transaction,
- message, error))
- goto failed;
-
- matchmaker = bus_connection_get_matchmaker (connection);
-
- if (!bus_matchmaker_remove_rule_by_value (matchmaker, rule, error))
- goto failed;
-
- bus_match_rule_unref (rule);
-
- return TRUE;
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (rule)
- bus_match_rule_unref (rule);
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_get_service_owner (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- const char *text;
- const char *base_name;
- DBusString str;
- BusRegistry *registry;
- BusService *service;
- DBusMessage *reply;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- registry = bus_connection_get_registry (connection);
-
- text = NULL;
- reply = NULL;
-
- if (! dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID))
- goto failed;
-
- _dbus_string_init_const (&str, text);
- service = bus_registry_lookup (registry, &str);
- if (service == NULL &&
- _dbus_string_equal_c_str (&str, DBUS_SERVICE_DBUS))
- {
- /* ORG_FREEDESKTOP_DBUS owns itself */
- base_name = DBUS_SERVICE_DBUS;
- }
- else if (service == NULL)
- {
- dbus_set_error (error,
- DBUS_ERROR_NAME_HAS_NO_OWNER,
- "Could not get owner of name '%s': no such name", text);
- goto failed;
- }
- else
- {
- base_name = bus_connection_get_name (bus_service_get_primary_owners_connection (service));
- if (base_name == NULL)
- {
- /* FIXME - how is this error possible? */
- dbus_set_error (error,
- DBUS_ERROR_FAILED,
- "Could not determine unique name for '%s'", text);
- goto failed;
- }
- _dbus_assert (*base_name == ':');
- }
-
- _dbus_assert (base_name != NULL);
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- goto oom;
-
- if (! dbus_message_append_args (reply,
- DBUS_TYPE_STRING, &base_name,
- DBUS_TYPE_INVALID))
- goto oom;
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- dbus_message_unref (reply);
-
- return TRUE;
-
- oom:
- BUS_SET_OOM (error);
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (reply)
- dbus_message_unref (reply);
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_list_queued_owners (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- const char *text;
- DBusList *base_names;
- DBusList *link;
- DBusString str;
- BusRegistry *registry;
- BusService *service;
- DBusMessage *reply;
- DBusMessageIter iter, array_iter;
- char *dbus_service_name = DBUS_SERVICE_DBUS;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- registry = bus_connection_get_registry (connection);
-
- base_names = NULL;
- text = NULL;
- reply = NULL;
-
- if (! dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID))
- goto failed;
-
- _dbus_string_init_const (&str, text);
- service = bus_registry_lookup (registry, &str);
- if (service == NULL &&
- _dbus_string_equal_c_str (&str, DBUS_SERVICE_DBUS))
- {
- /* ORG_FREEDESKTOP_DBUS owns itself */
- if (! _dbus_list_append (&base_names, dbus_service_name))
- goto oom;
- }
- else if (service == NULL)
- {
- dbus_set_error (error,
- DBUS_ERROR_NAME_HAS_NO_OWNER,
- "Could not get owners of name '%s': no such name", text);
- goto failed;
- }
- else
- {
- if (!bus_service_list_queued_owners (service,
- &base_names,
- error))
- goto failed;
- }
-
- _dbus_assert (base_names != NULL);
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- goto oom;
-
- dbus_message_iter_init_append (reply, &iter);
- if (!dbus_message_iter_open_container (&iter,
- DBUS_TYPE_ARRAY,
- DBUS_TYPE_STRING_AS_STRING,
- &array_iter))
- goto oom;
-
- link = _dbus_list_get_first_link (&base_names);
- while (link != NULL)
- {
- char *uname;
-
- _dbus_assert (link->data != NULL);
- uname = (char *)link->data;
-
- if (!dbus_message_iter_append_basic (&array_iter,
- DBUS_TYPE_STRING,
- &uname))
- goto oom;
-
- link = _dbus_list_get_next_link (&base_names, link);
- }
-
- if (! dbus_message_iter_close_container (&iter, &array_iter))
- goto oom;
-
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- dbus_message_unref (reply);
-
- return TRUE;
-
- oom:
- BUS_SET_OOM (error);
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (reply)
- dbus_message_unref (reply);
-
- if (base_names)
- _dbus_list_clear (&base_names);
-
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusConnection *conn;
- DBusMessage *reply;
- unsigned long uid;
- dbus_uint32_t uid32;
- const char *service;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- reply = NULL;
-
- conn = bus_driver_get_conn_helper (connection, message, "UID", &service,
- error);
-
- if (conn == NULL)
- goto failed;
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- goto oom;
-
- if (!dbus_connection_get_unix_user (conn, &uid))
- {
- dbus_set_error (error,
- DBUS_ERROR_FAILED,
- "Could not determine UID for '%s'", service);
- goto failed;
- }
-
- uid32 = uid;
- if (! dbus_message_append_args (reply,
- DBUS_TYPE_UINT32, &uid32,
- DBUS_TYPE_INVALID))
- goto oom;
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- dbus_message_unref (reply);
-
- return TRUE;
-
- oom:
- BUS_SET_OOM (error);
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (reply)
- dbus_message_unref (reply);
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusConnection *conn;
- DBusMessage *reply;
- unsigned long pid;
- dbus_uint32_t pid32;
- const char *service;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- reply = NULL;
-
- conn = bus_driver_get_conn_helper (connection, message, "PID", &service,
- error);
-
- if (conn == NULL)
- goto failed;
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- goto oom;
-
- if (!dbus_connection_get_unix_process_id (conn, &pid))
- {
- dbus_set_error (error,
- DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN,
- "Could not determine PID for '%s'", service);
- goto failed;
- }
-
- pid32 = pid;
- if (! dbus_message_append_args (reply,
- DBUS_TYPE_UINT32, &pid32,
- DBUS_TYPE_INVALID))
- goto oom;
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- dbus_message_unref (reply);
-
- return TRUE;
-
- oom:
- BUS_SET_OOM (error);
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (reply)
- dbus_message_unref (reply);
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusConnection *conn;
- DBusMessage *reply;
- void *data = NULL;
- dbus_uint32_t data_size;
- const char *service;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- reply = NULL;
-
- conn = bus_driver_get_conn_helper (connection, message,
- "audit session data", &service, error);
-
- if (conn == NULL)
- goto failed;
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- goto oom;
-
- if (!dbus_connection_get_adt_audit_session_data (conn, &data, &data_size) || data == NULL)
- {
- dbus_set_error (error,
- DBUS_ERROR_ADT_AUDIT_DATA_UNKNOWN,
- "Could not determine audit session data for '%s'", service);
- goto failed;
- }
-
- if (! dbus_message_append_args (reply,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &data, data_size,
- DBUS_TYPE_INVALID))
- goto oom;
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- dbus_message_unref (reply);
-
- return TRUE;
-
- oom:
- BUS_SET_OOM (error);
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (reply)
- dbus_message_unref (reply);
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusConnection *conn;
- DBusMessage *reply;
- BusSELinuxID *context;
- const char *service;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- reply = NULL;
-
- conn = bus_driver_get_conn_helper (connection, message, "security context",
- &service, error);
-
- if (conn == NULL)
- goto failed;
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- goto oom;
-
- context = bus_connection_get_selinux_id (conn);
- if (!context)
- {
- dbus_set_error (error,
- DBUS_ERROR_SELINUX_SECURITY_CONTEXT_UNKNOWN,
- "Could not determine security context for '%s'", service);
- goto failed;
- }
-
- if (! bus_selinux_append_context (reply, context, error))
- goto failed;
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- dbus_message_unref (reply);
-
- return TRUE;
-
- oom:
- BUS_SET_OOM (error);
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (reply)
- dbus_message_unref (reply);
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_get_connection_credentials (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusConnection *conn;
- DBusMessage *reply;
- DBusMessageIter reply_iter;
- DBusMessageIter array_iter;
- unsigned long ulong_val;
- const char *service;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- reply = NULL;
-
- conn = bus_driver_get_conn_helper (connection, message, "credentials",
- &service, error);
-
- if (conn == NULL)
- goto failed;
-
- reply = _dbus_asv_new_method_return (message, &reply_iter, &array_iter);
- if (reply == NULL)
- goto oom;
-
- /* we can't represent > 32-bit pids; if your system needs them, please
- * add ProcessID64 to the spec or something */
- if (dbus_connection_get_unix_process_id (conn, &ulong_val) &&
- ulong_val <= _DBUS_UINT32_MAX)
- {
- if (!_dbus_asv_add_uint32 (&array_iter, "ProcessID", ulong_val))
- goto oom;
- }
-
- /* we can't represent > 32-bit uids; if your system needs them, please
- * add UnixUserID64 to the spec or something */
- if (dbus_connection_get_unix_user (conn, &ulong_val) &&
- ulong_val <= _DBUS_UINT32_MAX)
- {
- if (!_dbus_asv_add_uint32 (&array_iter, "UnixUserID", ulong_val))
- goto oom;
- }
-
- if (!_dbus_asv_close (&reply_iter, &array_iter))
- goto oom;
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- {
- /* this time we don't want to close the iterator again, so just
- * get rid of the message */
- dbus_message_unref (reply);
- reply = NULL;
- goto oom;
- }
-
- return TRUE;
-
- oom:
- BUS_SET_OOM (error);
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
-
- if (reply)
- {
- _dbus_asv_abandon (&reply_iter, &array_iter);
- dbus_message_unref (reply);
- }
-
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_reload_config (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- BusContext *context;
- DBusMessage *reply;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- reply = NULL;
-
- context = bus_connection_get_context (connection);
- if (!bus_context_reload_config (context, error))
- goto failed;
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- goto oom;
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- dbus_message_unref (reply);
- return TRUE;
-
- oom:
- BUS_SET_OOM (error);
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (reply)
- dbus_message_unref (reply);
- return FALSE;
-}
-
-static dbus_bool_t
-bus_driver_handle_get_id (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- BusContext *context;
- DBusMessage *reply;
- DBusString uuid;
- const char *v_STRING;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (!_dbus_string_init (&uuid))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- reply = NULL;
-
- context = bus_connection_get_context (connection);
- if (!bus_context_get_id (context, &uuid))
- goto oom;
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- goto oom;
-
- v_STRING = _dbus_string_get_const_data (&uuid);
- if (!dbus_message_append_args (reply,
- DBUS_TYPE_STRING, &v_STRING,
- DBUS_TYPE_INVALID))
- goto oom;
-
- _dbus_assert (dbus_message_has_signature (reply, "s"));
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- _dbus_string_free (&uuid);
- dbus_message_unref (reply);
- return TRUE;
-
- oom:
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- BUS_SET_OOM (error);
-
- if (reply)
- dbus_message_unref (reply);
- _dbus_string_free (&uuid);
- return FALSE;
-}
-
-typedef struct
-{
- const char *name;
- const char *in_args;
- const char *out_args;
- dbus_bool_t (* handler) (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error);
-} MessageHandler;
-
-/* For speed it might be useful to sort this in order of
- * frequency of use (but doesn't matter with only a few items
- * anyhow)
- */
-static const MessageHandler dbus_message_handlers[] = {
- { "Hello",
- "",
- DBUS_TYPE_STRING_AS_STRING,
- bus_driver_handle_hello },
- { "RequestName",
- DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING,
- DBUS_TYPE_UINT32_AS_STRING,
- bus_driver_handle_acquire_service },
- { "ReleaseName",
- DBUS_TYPE_STRING_AS_STRING,
- DBUS_TYPE_UINT32_AS_STRING,
- bus_driver_handle_release_service },
- { "StartServiceByName",
- DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING,
- DBUS_TYPE_UINT32_AS_STRING,
- bus_driver_handle_activate_service },
- { "UpdateActivationEnvironment",
- DBUS_TYPE_ARRAY_AS_STRING DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
- "",
- bus_driver_handle_update_activation_environment },
- { "NameHasOwner",
- DBUS_TYPE_STRING_AS_STRING,
- DBUS_TYPE_BOOLEAN_AS_STRING,
- bus_driver_handle_service_exists },
- { "ListNames",
- "",
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING,
- bus_driver_handle_list_services },
- { "ListActivatableNames",
- "",
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING,
- bus_driver_handle_list_activatable_services },
- { "AddMatch",
- DBUS_TYPE_STRING_AS_STRING,
- "",
- bus_driver_handle_add_match },
- { "RemoveMatch",
- DBUS_TYPE_STRING_AS_STRING,
- "",
- bus_driver_handle_remove_match },
- { "GetNameOwner",
- DBUS_TYPE_STRING_AS_STRING,
- DBUS_TYPE_STRING_AS_STRING,
- bus_driver_handle_get_service_owner },
- { "ListQueuedOwners",
- DBUS_TYPE_STRING_AS_STRING,
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING,
- bus_driver_handle_list_queued_owners },
- { "GetConnectionUnixUser",
- DBUS_TYPE_STRING_AS_STRING,
- DBUS_TYPE_UINT32_AS_STRING,
- bus_driver_handle_get_connection_unix_user },
- { "GetConnectionUnixProcessID",
- DBUS_TYPE_STRING_AS_STRING,
- DBUS_TYPE_UINT32_AS_STRING,
- bus_driver_handle_get_connection_unix_process_id },
- { "GetAdtAuditSessionData",
- DBUS_TYPE_STRING_AS_STRING,
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING,
- bus_driver_handle_get_adt_audit_session_data },
- { "GetConnectionSELinuxSecurityContext",
- DBUS_TYPE_STRING_AS_STRING,
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING,
- bus_driver_handle_get_connection_selinux_security_context },
- { "ReloadConfig",
- "",
- "",
- bus_driver_handle_reload_config },
- { "GetId",
- "",
- DBUS_TYPE_STRING_AS_STRING,
- bus_driver_handle_get_id },
- { "GetConnectionCredentials", "s", "a{sv}",
- bus_driver_handle_get_connection_credentials },
- { NULL, NULL, NULL, NULL }
-};
-
-static dbus_bool_t bus_driver_handle_introspect (DBusConnection *,
- BusTransaction *, DBusMessage *, DBusError *);
-
-static const MessageHandler introspectable_message_handlers[] = {
- { "Introspect", "", DBUS_TYPE_STRING_AS_STRING, bus_driver_handle_introspect },
- { NULL, NULL, NULL, NULL }
-};
-
-#ifdef DBUS_ENABLE_STATS
-static const MessageHandler stats_message_handlers[] = {
- { "GetStats", "", "a{sv}", bus_stats_handle_get_stats },
- { "GetConnectionStats", "s", "a{sv}", bus_stats_handle_get_connection_stats },
- { NULL, NULL, NULL, NULL }
-};
-#endif
-
-typedef struct {
- const char *name;
- const MessageHandler *message_handlers;
- const char *extra_introspection;
-} InterfaceHandler;
-
-/* These should ideally be sorted by frequency of use, although it
- * probably doesn't matter with this few items */
-static InterfaceHandler interface_handlers[] = {
- { DBUS_INTERFACE_DBUS, dbus_message_handlers,
- " <signal name=\"NameOwnerChanged\">\n"
- " <arg type=\"s\"/>\n"
- " <arg type=\"s\"/>\n"
- " <arg type=\"s\"/>\n"
- " </signal>\n"
- " <signal name=\"NameLost\">\n"
- " <arg type=\"s\"/>\n"
- " </signal>\n"
- " <signal name=\"NameAcquired\">\n"
- " <arg type=\"s\"/>\n"
- " </signal>\n" },
- { DBUS_INTERFACE_INTROSPECTABLE, introspectable_message_handlers, NULL },
-#ifdef DBUS_ENABLE_STATS
- { BUS_INTERFACE_STATS, stats_message_handlers, NULL },
-#endif
- { NULL, NULL, NULL }
-};
-
-static dbus_bool_t
-write_args_for_direction (DBusString *xml,
- const char *signature,
- dbus_bool_t in)
-{
- DBusTypeReader typereader;
- DBusString sigstr;
- int current_type;
-
- _dbus_string_init_const (&sigstr, signature);
- _dbus_type_reader_init_types_only (&typereader, &sigstr, 0);
-
- while ((current_type = _dbus_type_reader_get_current_type (&typereader)) != DBUS_TYPE_INVALID)
- {
- const DBusString *subsig;
- int start, len;
-
- _dbus_type_reader_get_signature (&typereader, &subsig, &start, &len);
- if (!_dbus_string_append_printf (xml, " <arg direction=\"%s\" type=\"",
- in ? "in" : "out"))
- goto oom;
- if (!_dbus_string_append_len (xml,
- _dbus_string_get_const_data (subsig) + start,
- len))
- goto oom;
- if (!_dbus_string_append (xml, "\"/>\n"))
- goto oom;
-
- _dbus_type_reader_next (&typereader);
- }
- return TRUE;
- oom:
- return FALSE;
-}
-
-dbus_bool_t
-bus_driver_generate_introspect_string (DBusString *xml)
-{
- const InterfaceHandler *ih;
- const MessageHandler *mh;
-
- if (!_dbus_string_append (xml, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE))
- return FALSE;
- if (!_dbus_string_append (xml, "<node>\n"))
- return FALSE;
-
- for (ih = interface_handlers; ih->name != NULL; ih++)
- {
- if (!_dbus_string_append_printf (xml, " <interface name=\"%s\">\n",
- ih->name))
- return FALSE;
-
- for (mh = ih->message_handlers; mh->name != NULL; mh++)
- {
- if (!_dbus_string_append_printf (xml, " <method name=\"%s\">\n",
- mh->name))
- return FALSE;
-
- if (!write_args_for_direction (xml, mh->in_args, TRUE))
- return FALSE;
-
- if (!write_args_for_direction (xml, mh->out_args, FALSE))
- return FALSE;
-
- if (!_dbus_string_append (xml, " </method>\n"))
- return FALSE;
- }
-
- if (ih->extra_introspection != NULL &&
- !_dbus_string_append (xml, ih->extra_introspection))
- return FALSE;
-
- if (!_dbus_string_append (xml, " </interface>\n"))
- return FALSE;
- }
-
- if (!_dbus_string_append (xml, "</node>\n"))
- return FALSE;
-
- return TRUE;
-}
-
-static dbus_bool_t
-bus_driver_handle_introspect (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- DBusString xml;
- DBusMessage *reply;
- const char *v_STRING;
-
- _dbus_verbose ("Introspect() on bus driver\n");
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- reply = NULL;
-
- if (! dbus_message_get_args (message, error,
- DBUS_TYPE_INVALID))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- return FALSE;
- }
-
- if (!_dbus_string_init (&xml))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!bus_driver_generate_introspect_string (&xml))
- goto oom;
-
- v_STRING = _dbus_string_get_const_data (&xml);
-
- reply = dbus_message_new_method_return (message);
- if (reply == NULL)
- goto oom;
-
- if (! dbus_message_append_args (reply,
- DBUS_TYPE_STRING, &v_STRING,
- DBUS_TYPE_INVALID))
- goto oom;
-
- if (! bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- dbus_message_unref (reply);
- _dbus_string_free (&xml);
-
- return TRUE;
-
- oom:
- BUS_SET_OOM (error);
-
- if (reply)
- dbus_message_unref (reply);
-
- _dbus_string_free (&xml);
-
- return FALSE;
-}
-
-dbus_bool_t
-bus_driver_handle_message (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- const char *name, *interface;
- const InterfaceHandler *ih;
- const MessageHandler *mh;
- dbus_bool_t found_interface = FALSE;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (dbus_message_is_signal (message, "org.freedesktop.systemd1.Activator", "ActivationFailure"))
- {
- BusContext *context;
-
- context = bus_connection_get_context (connection);
- return dbus_activation_systemd_failure(bus_context_get_activation(context), message);
- }
-
- if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
- {
- _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
- return TRUE; /* we just ignore this */
- }
-
- /* may be NULL, which means "any interface will do" */
- interface = dbus_message_get_interface (message);
-
- _dbus_assert (dbus_message_get_member (message) != NULL);
-
- name = dbus_message_get_member (message);
-
- _dbus_verbose ("Driver got a method call: %s\n", name);
-
- /* security checks should have kept this from getting here */
- _dbus_assert (dbus_message_get_sender (message) != NULL ||
- strcmp (name, "Hello") == 0);
-
- for (ih = interface_handlers; ih->name != NULL; ih++)
- {
- if (interface != NULL && strcmp (interface, ih->name) != 0)
- continue;
-
- found_interface = TRUE;
-
- for (mh = ih->message_handlers; mh->name != NULL; mh++)
- {
- if (strcmp (mh->name, name) != 0)
- continue;
-
- _dbus_verbose ("Found driver handler for %s\n", name);
-
- if (!dbus_message_has_signature (message, mh->in_args))
- {
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- _dbus_verbose ("Call to %s has wrong args (%s, expected %s)\n",
- name, dbus_message_get_signature (message),
- mh->in_args);
-
- dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
- "Call to %s has wrong args (%s, expected %s)\n",
- name, dbus_message_get_signature (message),
- mh->in_args);
- _DBUS_ASSERT_ERROR_IS_SET (error);
- return FALSE;
- }
-
- if ((* mh->handler) (connection, transaction, message, error))
- {
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- _dbus_verbose ("Driver handler succeeded\n");
- return TRUE;
- }
- else
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- _dbus_verbose ("Driver handler returned failure\n");
- return FALSE;
- }
- }
- }
-
- _dbus_verbose ("No driver handler for message \"%s\"\n",
- name);
-
- dbus_set_error (error, found_interface ? DBUS_ERROR_UNKNOWN_METHOD : DBUS_ERROR_UNKNOWN_INTERFACE,
- "%s does not understand message %s",
- DBUS_SERVICE_DBUS, name);
-
- return FALSE;
-}
-
-void
-bus_driver_remove_connection (DBusConnection *connection)
-{
- /* FIXME 1.0 Does nothing for now, should unregister the connection
- * with the bus driver.
- */
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/driver.h b/src/3rd_party/dbus-1.7.8/bus/driver.h
deleted file mode 100644
index 713b276403..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/driver.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* driver.h Bus client (driver)
- *
- * Copyright (C) 2003 CodeFactory AB
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_DRIVER_H
-#define BUS_DRIVER_H
-
-#include <dbus/dbus.h>
-#include "connection.h"
-
-void bus_driver_remove_connection (DBusConnection *connection);
-dbus_bool_t bus_driver_handle_message (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error);
-dbus_bool_t bus_driver_send_service_lost (DBusConnection *connection,
- const char *service_name,
- BusTransaction *transaction,
- DBusError *error);
-dbus_bool_t bus_driver_send_service_acquired (DBusConnection *connection,
- const char *service_name,
- BusTransaction *transaction,
- DBusError *error);
-dbus_bool_t bus_driver_send_service_owner_changed (const char *service_name,
- const char *old_owner,
- const char *new_owner,
- BusTransaction *transaction,
- DBusError *error);
-dbus_bool_t bus_driver_generate_introspect_string (DBusString *xml);
-
-
-
-#endif /* BUS_DRIVER_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/expirelist.c b/src/3rd_party/dbus-1.7.8/bus/expirelist.c
deleted file mode 100644
index 9a3886e979..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/expirelist.c
+++ /dev/null
@@ -1,402 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* expirelist.c List of items that expire
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "expirelist.h"
-#include "test.h"
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-mainloop.h>
-#include <dbus/dbus-timeout.h>
-
-struct BusExpireList
-{
- DBusList *items; /**< List of BusExpireItem */
- DBusTimeout *timeout;
- DBusLoop *loop;
- BusExpireFunc expire_func;
- void *data;
- int expire_after; /**< Expire after milliseconds (thousandths) */
-};
-
-static dbus_bool_t expire_timeout_handler (void *data);
-
-BusExpireList*
-bus_expire_list_new (DBusLoop *loop,
- int expire_after,
- BusExpireFunc expire_func,
- void *data)
-{
- BusExpireList *list;
-
- list = dbus_new0 (BusExpireList, 1);
- if (list == NULL)
- return NULL;
-
- list->expire_func = expire_func;
- list->data = data;
- list->loop = loop;
- list->expire_after = expire_after;
-
- list->timeout = _dbus_timeout_new (100, /* irrelevant */
- expire_timeout_handler,
- list, NULL);
- if (list->timeout == NULL)
- goto failed;
-
- _dbus_timeout_set_enabled (list->timeout, FALSE);
-
- if (!_dbus_loop_add_timeout (list->loop, list->timeout))
- goto failed;
-
- return list;
-
- failed:
- if (list->timeout)
- _dbus_timeout_unref (list->timeout);
-
- dbus_free (list);
-
- return NULL;
-}
-
-void
-bus_expire_list_free (BusExpireList *list)
-{
- _dbus_assert (list->items == NULL);
-
- _dbus_loop_remove_timeout (list->loop, list->timeout);
-
- _dbus_timeout_unref (list->timeout);
-
- dbus_free (list);
-}
-
-void
-bus_expire_timeout_set_interval (DBusTimeout *timeout,
- int next_interval)
-{
- if (next_interval >= 0)
- {
- _dbus_timeout_set_interval (timeout,
- next_interval);
- _dbus_timeout_set_enabled (timeout, TRUE);
-
- _dbus_verbose ("Enabled an expire timeout with interval %d\n",
- next_interval);
- }
- else if (dbus_timeout_get_enabled (timeout))
- {
- _dbus_timeout_set_enabled (timeout, FALSE);
-
- _dbus_verbose ("Disabled an expire timeout\n");
- }
- else
- _dbus_verbose ("No need to disable this expire timeout\n");
-}
-
-void
-bus_expire_list_recheck_immediately (BusExpireList *list)
-{
- _dbus_verbose ("setting interval on expire list to 0 for immediate recheck\n");
-
- bus_expire_timeout_set_interval (list->timeout, 0);
-}
-
-static int
-do_expiration_with_monotonic_time (BusExpireList *list,
- long tv_sec,
- long tv_usec)
-{
- DBusList *link;
- int next_interval, min_wait_time, items_to_expire;
-
- next_interval = -1;
- min_wait_time = 3600 * 1000; /* this is reset anyway if used */
- items_to_expire = 0;
-
- link = _dbus_list_get_first_link (&list->items);
- while (link != NULL)
- {
- DBusList *next = _dbus_list_get_next_link (&list->items, link);
- double elapsed;
- BusExpireItem *item;
-
- item = link->data;
-
- elapsed = ELAPSED_MILLISECONDS_SINCE (item->added_tv_sec,
- item->added_tv_usec,
- tv_sec, tv_usec);
-
- if (((item->added_tv_sec == 0) && (item->added_tv_usec == 0)) ||
- ((list->expire_after > 0) && (elapsed >= (double) list->expire_after)))
- {
- _dbus_verbose ("Expiring an item %p\n", item);
-
- /* If the expire function fails, we just end up expiring
- * this item next time we walk through the list. This would
- * be an indeterminate time normally, so we set up the
- * next_interval to be "shortly" (just enough to avoid
- * a busy loop)
- */
- if (!(* list->expire_func) (list, link, list->data))
- {
- next_interval = _dbus_get_oom_wait ();
- break;
- }
- }
- else if (list->expire_after > 0)
- {
- double to_wait;
-
- items_to_expire = 1;
- to_wait = (double) list->expire_after - elapsed;
- if (min_wait_time > to_wait)
- min_wait_time = to_wait;
- }
-
- link = next;
- }
-
- if (next_interval < 0 && items_to_expire)
- next_interval = min_wait_time;
-
- return next_interval;
-}
-
-static void
-bus_expirelist_expire (BusExpireList *list)
-{
- int next_interval;
-
- next_interval = -1;
-
- if (list->items != NULL)
- {
- long tv_sec, tv_usec;
-
- _dbus_get_monotonic_time (&tv_sec, &tv_usec);
-
- next_interval = do_expiration_with_monotonic_time (list, tv_sec, tv_usec);
- }
-
- bus_expire_timeout_set_interval (list->timeout, next_interval);
-}
-
-static dbus_bool_t
-expire_timeout_handler (void *data)
-{
- BusExpireList *list = data;
-
- _dbus_verbose ("Running\n");
-
- /* note that this may remove the timeout */
- bus_expirelist_expire (list);
-
- return TRUE;
-}
-
-void
-bus_expire_list_remove_link (BusExpireList *list,
- DBusList *link)
-{
- _dbus_list_remove_link (&list->items, link);
-}
-
-dbus_bool_t
-bus_expire_list_remove (BusExpireList *list,
- BusExpireItem *item)
-{
- return _dbus_list_remove (&list->items, item);
-}
-
-void
-bus_expire_list_unlink (BusExpireList *list,
- DBusList *link)
-{
- _dbus_list_unlink (&list->items, link);
-}
-
-dbus_bool_t
-bus_expire_list_add (BusExpireList *list,
- BusExpireItem *item)
-{
- dbus_bool_t ret;
-
- ret = _dbus_list_prepend (&list->items, item);
- if (ret && !dbus_timeout_get_enabled (list->timeout))
- bus_expire_timeout_set_interval (list->timeout, 0);
-
- return ret;
-}
-
-void
-bus_expire_list_add_link (BusExpireList *list,
- DBusList *link)
-{
- _dbus_assert (link->data != NULL);
-
- _dbus_list_prepend_link (&list->items, link);
-
- if (!dbus_timeout_get_enabled (list->timeout))
- bus_expire_timeout_set_interval (list->timeout, 0);
-}
-
-DBusList*
-bus_expire_list_get_first_link (BusExpireList *list)
-{
- return _dbus_list_get_first_link (&list->items);
-}
-
-DBusList*
-bus_expire_list_get_next_link (BusExpireList *list,
- DBusList *link)
-{
- return _dbus_list_get_next_link (&list->items, link);
-}
-
-dbus_bool_t
-bus_expire_list_contains_item (BusExpireList *list,
- BusExpireItem *item)
-{
- return _dbus_list_find_last (&list->items, item) != NULL;
-}
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-
-typedef struct
-{
- BusExpireItem item;
- int expire_count;
-} TestExpireItem;
-
-static dbus_bool_t
-test_expire_func (BusExpireList *list,
- DBusList *link,
- void *data)
-{
- TestExpireItem *t;
-
- t = (TestExpireItem*) link->data;
-
- t->expire_count += 1;
-
- return TRUE;
-}
-
-static void
-time_add_milliseconds (long *tv_sec,
- long *tv_usec,
- int milliseconds)
-{
- *tv_sec = *tv_sec + milliseconds / 1000;
- *tv_usec = *tv_usec + milliseconds * 1000;
- if (*tv_usec >= 1000000)
- {
- *tv_usec -= 1000000;
- *tv_sec += 1;
- }
-}
-
-dbus_bool_t
-bus_expire_list_test (const DBusString *test_data_dir)
-{
- DBusLoop *loop;
- BusExpireList *list;
- long tv_sec, tv_usec;
- long tv_sec_not_expired, tv_usec_not_expired;
- long tv_sec_expired, tv_usec_expired;
- long tv_sec_past, tv_usec_past;
- TestExpireItem *item;
- int next_interval;
- dbus_bool_t result = FALSE;
-
-
- loop = _dbus_loop_new ();
- _dbus_assert (loop != NULL);
-
-#define EXPIRE_AFTER 100
-
- list = bus_expire_list_new (loop, EXPIRE_AFTER,
- test_expire_func, NULL);
- _dbus_assert (list != NULL);
-
- _dbus_get_monotonic_time (&tv_sec, &tv_usec);
-
- tv_sec_not_expired = tv_sec;
- tv_usec_not_expired = tv_usec;
- time_add_milliseconds (&tv_sec_not_expired,
- &tv_usec_not_expired, EXPIRE_AFTER - 1);
-
- tv_sec_expired = tv_sec;
- tv_usec_expired = tv_usec;
- time_add_milliseconds (&tv_sec_expired,
- &tv_usec_expired, EXPIRE_AFTER);
-
-
- tv_sec_past = tv_sec - 1;
- tv_usec_past = tv_usec;
-
- item = dbus_new0 (TestExpireItem, 1);
-
- if (item == NULL)
- goto oom;
-
- item->item.added_tv_sec = tv_sec;
- item->item.added_tv_usec = tv_usec;
- if (!bus_expire_list_add (list, &item->item))
- _dbus_assert_not_reached ("out of memory");
-
- next_interval =
- do_expiration_with_monotonic_time (list, tv_sec_not_expired,
- tv_usec_not_expired);
- _dbus_assert (item->expire_count == 0);
- _dbus_verbose ("next_interval = %d\n", next_interval);
- _dbus_assert (next_interval == 1);
-
- next_interval =
- do_expiration_with_monotonic_time (list, tv_sec_expired,
- tv_usec_expired);
- _dbus_assert (item->expire_count == 1);
- _dbus_verbose ("next_interval = %d\n", next_interval);
- _dbus_assert (next_interval == -1);
-
- next_interval =
- do_expiration_with_monotonic_time (list, tv_sec_past,
- tv_usec_past);
- _dbus_assert (item->expire_count == 1);
- _dbus_verbose ("next_interval = %d\n", next_interval);
- _dbus_assert (next_interval == 1000 + EXPIRE_AFTER);
-
- bus_expire_list_remove (list, &item->item);
- dbus_free (item);
-
- bus_expire_list_free (list);
- _dbus_loop_unref (loop);
-
- result = TRUE;
-
- oom:
- return result;
-}
-
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
diff --git a/src/3rd_party/dbus-1.7.8/bus/expirelist.h b/src/3rd_party/dbus-1.7.8/bus/expirelist.h
deleted file mode 100644
index 887cb97b06..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/expirelist.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* expirelist.h List of stuff that expires
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_EXPIRE_LIST_H
-#define BUS_EXPIRE_LIST_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-mainloop.h>
-
-typedef struct BusExpireList BusExpireList;
-typedef struct BusExpireItem BusExpireItem;
-
-typedef dbus_bool_t (* BusExpireFunc) (BusExpireList *list,
- DBusList *link,
- void *data);
-
-
-/* embed this in a child expire item struct */
-struct BusExpireItem
-{
- long added_tv_sec; /**< Time we were added (seconds component) */
- long added_tv_usec; /**< Time we were added (microsec component) */
-};
-
-BusExpireList* bus_expire_list_new (DBusLoop *loop,
- int expire_after,
- BusExpireFunc expire_func,
- void *data);
-void bus_expire_list_free (BusExpireList *list);
-void bus_expire_list_recheck_immediately (BusExpireList *list);
-void bus_expire_list_remove_link (BusExpireList *list,
- DBusList *link);
-dbus_bool_t bus_expire_list_remove (BusExpireList *list,
- BusExpireItem *item);
-DBusList* bus_expire_list_get_first_link (BusExpireList *list);
-DBusList* bus_expire_list_get_next_link (BusExpireList *list,
- DBusList *link);
-dbus_bool_t bus_expire_list_add (BusExpireList *list,
- BusExpireItem *item);
-void bus_expire_list_add_link (BusExpireList *list,
- DBusList *link);
-dbus_bool_t bus_expire_list_contains_item (BusExpireList *list,
- BusExpireItem *item);
-void bus_expire_list_unlink (BusExpireList *list,
- DBusList *link);
-
-/* this macro and function are semi-related utility functions, not really part of the
- * BusExpireList API
- */
-
-#define ELAPSED_MILLISECONDS_SINCE(orig_tv_sec, orig_tv_usec, \
- now_tv_sec, now_tv_usec) \
- (((double) (now_tv_sec) - (double) (orig_tv_sec)) * 1000.0 + \
- ((double) (now_tv_usec) - (double) (orig_tv_usec)) / 1000.0)
-
-void bus_expire_timeout_set_interval (DBusTimeout *timeout,
- int next_interval);
-
-#endif /* BUS_EXPIRE_LIST_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/main.c b/src/3rd_party/dbus-1.7.8/bus/main.c
deleted file mode 100644
index e060baa8e8..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/main.c
+++ /dev/null
@@ -1,654 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* main.c main() for message bus
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "bus.h"
-#include "driver.h"
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-watch.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef HAVE_SIGNAL_H
-#include <signal.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h> /* for write() and STDERR_FILENO */
-#endif
-#include "selinux.h"
-
-static BusContext *context;
-
-#ifdef DBUS_UNIX
-
-static int reload_pipe[2];
-#define RELOAD_READ_END 0
-#define RELOAD_WRITE_END 1
-
-static void close_reload_pipe (DBusWatch **);
-
-typedef enum
- {
- ACTION_RELOAD = 'r',
- ACTION_QUIT = 'q'
- } SignalAction;
-
-static void
-signal_handler (int sig)
-{
- switch (sig)
- {
- case SIGHUP:
- {
- DBusString str;
- char action[2] = { ACTION_RELOAD, '\0' };
-
- _dbus_string_init_const (&str, action);
- if ((reload_pipe[RELOAD_WRITE_END] > 0) &&
- !_dbus_write_socket (reload_pipe[RELOAD_WRITE_END], &str, 0, 1))
- {
- /* If we receive SIGHUP often enough to fill the pipe buffer (4096
- * times on old Linux, 65536 on modern Linux) before it can be
- * drained, let's just warn and ignore. The configuration will be
- * reloaded while draining the pipe buffer, which is what we
- * wanted. It's harmless that it will be reloaded fewer times than
- * we asked for, since the reload is delayed anyway, so new changes
- * will be picked up.
- *
- * We use write() because _dbus_warn uses vfprintf, which isn't
- * async-signal-safe.
- *
- * This is necessarily Unix-specific, but so are POSIX signals,
- * so... */
- static const char message[] =
- "Unable to write to reload pipe - buffer full?\n";
-
- if (write (STDERR_FILENO, message, strlen (message)) != strlen (message))
- {
- /* ignore failure to write out a warning */
- }
- }
- }
- break;
-
- case SIGTERM:
- {
- DBusString str;
- char action[2] = { ACTION_QUIT, '\0' };
- _dbus_string_init_const (&str, action);
- if ((reload_pipe[RELOAD_WRITE_END] < 0) ||
- !_dbus_write_socket (reload_pipe[RELOAD_WRITE_END], &str, 0, 1))
- {
- /* If we can't write to the socket, dying seems a more
- * important response to SIGTERM than cleaning up sockets,
- * so we exit. We'd use exit(), but that's not async-signal-safe,
- * so we'll have to resort to _exit(). */
- static const char message[] =
- "Unable to write termination signal to pipe - buffer full?\n"
- "Will exit instead.\n";
-
- if (write (STDERR_FILENO, message, strlen (message)) != strlen (message))
- {
- /* ignore failure to write out a warning */
- }
- _exit (1);
- }
- }
- break;
- }
-}
-#endif /* DBUS_UNIX */
-
-static void
-usage (void)
-{
- fprintf (stderr,
- DBUS_DAEMON_NAME
- " [--version]"
- " [--session]"
- " [--system]"
- " [--config-file=FILE]"
- " [--print-address[=DESCRIPTOR]]"
- " [--print-pid[=DESCRIPTOR]]"
- " [--introspect]"
- " [--address=ADDRESS]"
- " [--nopidfile]"
- " [--nofork]"
-#ifdef DBUS_UNIX
- " [--fork]"
- " [--systemd-activation]"
-#endif
- "\n");
- exit (1);
-}
-
-static void
-version (void)
-{
- printf ("D-Bus Message Bus Daemon %s\n"
- "Copyright (C) 2002, 2003 Red Hat, Inc., CodeFactory AB, and others\n"
- "This is free software; see the source for copying conditions.\n"
- "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
- DBUS_VERSION_STRING);
- exit (0);
-}
-
-static void
-introspect (void)
-{
- DBusString xml;
- const char *v_STRING;
-
- if (!_dbus_string_init (&xml))
- goto oom;
-
- if (!bus_driver_generate_introspect_string (&xml))
- {
- _dbus_string_free (&xml);
- goto oom;
- }
-
- v_STRING = _dbus_string_get_const_data (&xml);
- printf ("%s\n", v_STRING);
-
- exit (0);
-
- oom:
- _dbus_warn ("Can not introspect - Out of memory\n");
- exit (1);
-}
-
-static void
-check_two_config_files (const DBusString *config_file,
- const char *extra_arg)
-{
- if (_dbus_string_get_length (config_file) > 0)
- {
- fprintf (stderr, "--%s specified but configuration file %s already requested\n",
- extra_arg, _dbus_string_get_const_data (config_file));
- exit (1);
- }
-}
-
-static void
-check_two_addresses (const DBusString *address,
- const char *extra_arg)
-{
- if (_dbus_string_get_length (address) > 0)
- {
- fprintf (stderr, "--%s specified but address %s already requested\n",
- extra_arg, _dbus_string_get_const_data (address));
- exit (1);
- }
-}
-
-static void
-check_two_addr_descriptors (const DBusString *addr_fd,
- const char *extra_arg)
-{
- if (_dbus_string_get_length (addr_fd) > 0)
- {
- fprintf (stderr, "--%s specified but printing address to %s already requested\n",
- extra_arg, _dbus_string_get_const_data (addr_fd));
- exit (1);
- }
-}
-
-static void
-check_two_pid_descriptors (const DBusString *pid_fd,
- const char *extra_arg)
-{
- if (_dbus_string_get_length (pid_fd) > 0)
- {
- fprintf (stderr, "--%s specified but printing pid to %s already requested\n",
- extra_arg, _dbus_string_get_const_data (pid_fd));
- exit (1);
- }
-}
-
-#ifdef DBUS_UNIX
-static dbus_bool_t
-handle_reload_watch (DBusWatch *watch,
- unsigned int flags,
- void *data)
-{
- DBusError error;
- DBusString str;
- char *action_str;
- char action = '\0';
-
- while (!_dbus_string_init (&str))
- _dbus_wait_for_memory ();
-
- if ((reload_pipe[RELOAD_READ_END] > 0) &&
- _dbus_read_socket (reload_pipe[RELOAD_READ_END], &str, 1) != 1)
- {
- _dbus_warn ("Couldn't read from reload pipe.\n");
- close_reload_pipe (&watch);
- return TRUE;
- }
-
- action_str = _dbus_string_get_data (&str);
- if (action_str != NULL)
- {
- action = action_str[0];
- }
- _dbus_string_free (&str);
-
- /* this can only fail if we don't understand the config file
- * or OOM. Either way we should just stick with the currently
- * loaded config.
- */
- dbus_error_init (&error);
-
- switch (action)
- {
- case ACTION_RELOAD:
- if (! bus_context_reload_config (context, &error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (&error);
- _dbus_assert (dbus_error_has_name (&error, DBUS_ERROR_FAILED) ||
- dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY));
- _dbus_warn ("Unable to reload configuration: %s\n",
- error.message);
- dbus_error_free (&error);
- }
- break;
-
- case ACTION_QUIT:
- {
- DBusLoop *loop;
- /*
- * On OSs without abstract sockets, we want to quit
- * gracefully rather than being killed by SIGTERM,
- * so that DBusServer gets a chance to clean up the
- * sockets from the filesystem. fd.o #38656
- */
- loop = bus_context_get_loop (context);
- if (loop != NULL)
- {
- _dbus_loop_quit (loop);
- }
- }
- break;
-
- default:
- break;
- }
-
- return TRUE;
-}
-
-static void
-setup_reload_pipe (DBusLoop *loop)
-{
- DBusError error;
- DBusWatch *watch;
-
- dbus_error_init (&error);
-
- if (!_dbus_full_duplex_pipe (&reload_pipe[0], &reload_pipe[1],
- TRUE, &error))
- {
- _dbus_warn ("Unable to create reload pipe: %s\n",
- error.message);
- dbus_error_free (&error);
- exit (1);
- }
-
- watch = _dbus_watch_new (reload_pipe[RELOAD_READ_END],
- DBUS_WATCH_READABLE, TRUE,
- handle_reload_watch, NULL, NULL);
-
- if (watch == NULL)
- {
- _dbus_warn ("Unable to create reload watch: %s\n",
- error.message);
- dbus_error_free (&error);
- exit (1);
- }
-
- if (!_dbus_loop_add_watch (loop, watch))
- {
- _dbus_warn ("Unable to add reload watch to main loop: %s\n",
- error.message);
- dbus_error_free (&error);
- exit (1);
- }
-
-}
-
-static void
-close_reload_pipe (DBusWatch **watch)
-{
- _dbus_loop_remove_watch (bus_context_get_loop (context), *watch);
- _dbus_watch_invalidate (*watch);
- _dbus_watch_unref (*watch);
- *watch = NULL;
-
- _dbus_close_socket (reload_pipe[RELOAD_READ_END], NULL);
- reload_pipe[RELOAD_READ_END] = -1;
-
- _dbus_close_socket (reload_pipe[RELOAD_WRITE_END], NULL);
- reload_pipe[RELOAD_WRITE_END] = -1;
-}
-#endif /* DBUS_UNIX */
-
-int
-main (int argc, char **argv)
-{
- DBusError error;
- DBusString config_file;
- DBusString address;
- DBusString addr_fd;
- DBusString pid_fd;
- const char *prev_arg;
- DBusPipe print_addr_pipe;
- DBusPipe print_pid_pipe;
- int i;
- dbus_bool_t print_address;
- dbus_bool_t print_pid;
- BusContextFlags flags;
-
- if (!_dbus_string_init (&config_file))
- return 1;
-
- if (!_dbus_string_init (&address))
- return 1;
-
- if (!_dbus_string_init (&addr_fd))
- return 1;
-
- if (!_dbus_string_init (&pid_fd))
- return 1;
-
- print_address = FALSE;
- print_pid = FALSE;
-
- flags = BUS_CONTEXT_FLAG_WRITE_PID_FILE;
-
- prev_arg = NULL;
- i = 1;
- while (i < argc)
- {
- const char *arg = argv[i];
-
- if (strcmp (arg, "--help") == 0 ||
- strcmp (arg, "-h") == 0 ||
- strcmp (arg, "-?") == 0)
- {
- usage ();
- }
- else if (strcmp (arg, "--version") == 0)
- {
- version ();
- }
- else if (strcmp (arg, "--introspect") == 0)
- {
- introspect ();
- }
- else if (strcmp (arg, "--nofork") == 0)
- {
- flags &= ~BUS_CONTEXT_FLAG_FORK_ALWAYS;
- flags |= BUS_CONTEXT_FLAG_FORK_NEVER;
- }
-#ifdef DBUS_UNIX
- else if (strcmp (arg, "--fork") == 0)
- {
- flags &= ~BUS_CONTEXT_FLAG_FORK_NEVER;
- flags |= BUS_CONTEXT_FLAG_FORK_ALWAYS;
- }
- else if (strcmp (arg, "--systemd-activation") == 0)
- {
- flags |= BUS_CONTEXT_FLAG_SYSTEMD_ACTIVATION;
- }
-#endif
- else if (strcmp (arg, "--nopidfile") == 0)
- {
- flags &= ~BUS_CONTEXT_FLAG_WRITE_PID_FILE;
- }
- else if (strcmp (arg, "--system") == 0)
- {
- check_two_config_files (&config_file, "system");
-
- if (!_dbus_append_system_config_file (&config_file))
- exit (1);
- }
- else if (strcmp (arg, "--session") == 0)
- {
- check_two_config_files (&config_file, "session");
-
- if (!_dbus_append_session_config_file (&config_file))
- exit (1);
- }
- else if (strstr (arg, "--config-file=") == arg)
- {
- const char *file;
-
- check_two_config_files (&config_file, "config-file");
-
- file = strchr (arg, '=');
- ++file;
-
- if (!_dbus_string_append (&config_file, file))
- exit (1);
- }
- else if (prev_arg &&
- strcmp (prev_arg, "--config-file") == 0)
- {
- check_two_config_files (&config_file, "config-file");
-
- if (!_dbus_string_append (&config_file, arg))
- exit (1);
- }
- else if (strcmp (arg, "--config-file") == 0)
- {
- /* wait for next arg */
- }
- else if (strstr (arg, "--address=") == arg)
- {
- const char *file;
-
- check_two_addresses (&address, "address");
-
- file = strchr (arg, '=');
- ++file;
-
- if (!_dbus_string_append (&address, file))
- exit (1);
- }
- else if (prev_arg &&
- strcmp (prev_arg, "--address") == 0)
- {
- check_two_addresses (&address, "address");
-
- if (!_dbus_string_append (&address, arg))
- exit (1);
- }
- else if (strcmp (arg, "--address") == 0)
- {
- /* wait for next arg */
- }
- else if (strstr (arg, "--print-address=") == arg)
- {
- const char *desc;
-
- check_two_addr_descriptors (&addr_fd, "print-address");
-
- desc = strchr (arg, '=');
- ++desc;
-
- if (!_dbus_string_append (&addr_fd, desc))
- exit (1);
-
- print_address = TRUE;
- }
- else if (prev_arg &&
- strcmp (prev_arg, "--print-address") == 0)
- {
- check_two_addr_descriptors (&addr_fd, "print-address");
-
- if (!_dbus_string_append (&addr_fd, arg))
- exit (1);
-
- print_address = TRUE;
- }
- else if (strcmp (arg, "--print-address") == 0)
- {
- print_address = TRUE; /* and we'll get the next arg if appropriate */
- }
- else if (strstr (arg, "--print-pid=") == arg)
- {
- const char *desc;
-
- check_two_pid_descriptors (&pid_fd, "print-pid");
-
- desc = strchr (arg, '=');
- ++desc;
-
- if (!_dbus_string_append (&pid_fd, desc))
- exit (1);
-
- print_pid = TRUE;
- }
- else if (prev_arg &&
- strcmp (prev_arg, "--print-pid") == 0)
- {
- check_two_pid_descriptors (&pid_fd, "print-pid");
-
- if (!_dbus_string_append (&pid_fd, arg))
- exit (1);
-
- print_pid = TRUE;
- }
- else if (strcmp (arg, "--print-pid") == 0)
- {
- print_pid = TRUE; /* and we'll get the next arg if appropriate */
- }
- else
- {
- usage ();
- }
-
- prev_arg = arg;
-
- ++i;
- }
-
- if (_dbus_string_get_length (&config_file) == 0)
- {
- fprintf (stderr, "No configuration file specified.\n");
- usage ();
- }
-
- _dbus_pipe_invalidate (&print_addr_pipe);
- if (print_address)
- {
- _dbus_pipe_init_stdout (&print_addr_pipe);
- if (_dbus_string_get_length (&addr_fd) > 0)
- {
- long val;
- int end;
- if (!_dbus_string_parse_int (&addr_fd, 0, &val, &end) ||
- end != _dbus_string_get_length (&addr_fd) ||
- val < 0 || val > _DBUS_INT_MAX)
- {
- fprintf (stderr, "Invalid file descriptor: \"%s\"\n",
- _dbus_string_get_const_data (&addr_fd));
- exit (1);
- }
-
- _dbus_pipe_init (&print_addr_pipe, val);
- }
- }
- _dbus_string_free (&addr_fd);
-
- _dbus_pipe_invalidate (&print_pid_pipe);
- if (print_pid)
- {
- _dbus_pipe_init_stdout (&print_pid_pipe);
- if (_dbus_string_get_length (&pid_fd) > 0)
- {
- long val;
- int end;
- if (!_dbus_string_parse_int (&pid_fd, 0, &val, &end) ||
- end != _dbus_string_get_length (&pid_fd) ||
- val < 0 || val > _DBUS_INT_MAX)
- {
- fprintf (stderr, "Invalid file descriptor: \"%s\"\n",
- _dbus_string_get_const_data (&pid_fd));
- exit (1);
- }
-
- _dbus_pipe_init (&print_pid_pipe, val);
- }
- }
- _dbus_string_free (&pid_fd);
-
- if (!bus_selinux_pre_init ())
- {
- _dbus_warn ("SELinux pre-initialization failed\n");
- exit (1);
- }
-
- dbus_error_init (&error);
- context = bus_context_new (&config_file, flags,
- &print_addr_pipe, &print_pid_pipe,
- _dbus_string_get_length(&address) > 0 ? &address : NULL,
- &error);
- _dbus_string_free (&config_file);
- if (context == NULL)
- {
- _dbus_warn ("Failed to start message bus: %s\n",
- error.message);
- dbus_error_free (&error);
- exit (1);
- }
-
- /* bus_context_new() closes the print_addr_pipe and
- * print_pid_pipe
- */
-
-#ifdef DBUS_UNIX
- setup_reload_pipe (bus_context_get_loop (context));
-
- /* POSIX signals are Unix-specific, and _dbus_set_signal_handler is
- * unimplemented (and probably unimplementable) on Windows, so there's
- * no point in trying to make the handler portable to non-Unix. */
-
- _dbus_set_signal_handler (SIGTERM, signal_handler);
- _dbus_set_signal_handler (SIGHUP, signal_handler);
-#endif /* DBUS_UNIX */
-
- _dbus_verbose ("We are on D-Bus...\n");
- _dbus_loop_run (bus_context_get_loop (context));
-
- bus_context_shutdown (context);
- bus_context_unref (context);
- bus_selinux_shutdown ();
-
- return 0;
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/messagebus-config.in b/src/3rd_party/dbus-1.7.8/bus/messagebus-config.in
deleted file mode 100644
index 39459dcb7c..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/messagebus-config.in
+++ /dev/null
@@ -1,178 +0,0 @@
-#!/bin/sh
-#
-# messagebus-config, Copyright 2009 Yaakov Selkowitz
-#
-# This file is part of the Cygwin port of dbus.
-
-# ======================================================================
-# Initialization
-# ======================================================================
-PROGNAME=$(basename $0)
-_tdir=$(dirname $0)
-PROGDIR=$(cd $_tdir && pwd)
-
-CSIH_SCRIPT=/usr/share/csih/cygwin-service-installation-helper.sh
-
-# Subdirectory where the new package is being installed
-PREFIX=@prefix@
-
-# Directory where the config files are stored
-SYSCONFDIR=@sysconfdir@/dbus-1
-DEVDIR=/dev
-LOGDIR=/var/log
-RUNDIR=$(dirname @DBUS_SYSTEM_PID_FILE@)
-SOCKDIR=$(dirname @DBUS_SYSTEM_SOCKET@)
-
-source ${CSIH_SCRIPT}
-
-# ======================================================================
-# Routine: install_service
-# Install messagebus as a service
-# ======================================================================
-install_service() {
-
- if csih_is_nt
- then
-
- # Check if messagebus is installed and remove on user request.
- if cygrunsrv -Q messagebus > /dev/null 2>&1
- then
- csih_warning "The messagebus service is already installed."
- echo
- if csih_request "Do you want to reinstall it with different args?"
- then
- cygrunsrv -E messagebus
- cygrunsrv -R messagebus
- fi
- fi
-
- # Install messagebus service if it is not already installed
- if ! cygrunsrv -Q messagebus > /dev/null 2>&1
- then
- echo
- csih_warning "The following function requires administrator privileges!"
- if csih_request "Do you want to install messagebus as service?"
- then
- if cygrunsrv -I messagebus -d "CYGWIN D-Bus system service" -p @EXPANDED_BINDIR@/dbus-daemon -a "--nofork --system"
- then
- echo
- csih_inform "The messagebus service has been installed under the LocalSystem"
- csih_inform "account (also known as SYSTEM). To start the service now, call"
- csih_inform "\`net start messagebus' or \`cygrunsrv -S messagebus'. Otherwise, it"
- csih_inform "will start automatically after the next reboot."
- echo
- csih_inform "Check ${SYSCONFDIR}/system.conf first, if it suits your needs."
- fi
- fi # user allowed us to install messagebus
- fi # messagebus already installed
- fi # csih_is_nt
-} # --- End of install_service --- #
-
-
-# ======================================================================
-# Main Entry Point
-# ======================================================================
-
-
-# Check how the script has been started. If
-# (1) it has been started by giving the full path and
-# that path is /etc/postinstall, OR
-# (2) Otherwise, if the environment variable
-# CONFIG_AUTO_ANSWER_NO is set
-# then set auto_answer to "no". This allows automatic
-# creation of the config files in /etc w/o overwriting
-# them if they already exist. In both cases, color
-# escape sequences are suppressed, so as to prevent
-# cluttering setup's logfiles.
-if [ "$PROGDIR" = "/etc/postinstall" ]
-then
- csih_auto_answer="no"
- csih_disable_color
-fi
-if [ -n "${CONFIG_AUTO_ANSWER_NO}" ]
-then
- csih_auto_answer="no"
- csih_disable_color
-fi
-
-
-# ======================================================================
-# Parse options
-# ======================================================================
-while :
-do
- case $# in
- 0)
- break
- ;;
- esac
-
- option=$1
- shift
-
- case "$option" in
- -d | --debug )
- set -x
- csih_trace_on
- ;;
-
- -y | --yes )
- csih_auto_answer=yes
- ;;
-
- -n | --no )
- csih_auto_answer=no
- ;;
-
- *)
- echo "usage: ${PROGNAME} [OPTION]..."
- echo
- echo "This script creates a basic messagebus configuration."
- echo
- echo "Options:"
- echo " --debug -d Enable shell's debug output."
- echo " --yes -y Answer all questions with \"yes\" automatically."
- echo " --no -n Answer all questions with \"no\" automatically."
- echo
- exit 1
- ;;
-
- esac
-done
-
-# ======================================================================
-# Action!
-# ======================================================================
-
-# Check for ${SYSCONFDIR} directory
-csih_make_dir "${SYSCONFDIR}" "Cannot create global configuration files."
-chmod 775 "${SYSCONFDIR}"
-setfacl -m u:system:rwx "${SYSCONFDIR}"
-
-# Check for ${DEVDIR} directory
-csih_make_dir "${DEVDIR}" "Syslogging using messagebus will not work."
-chmod 775 "${DEVDIR}"
-setfacl -m u:system:rwx "${DEVDIR}"
-
-# Check for ${LOGDIR} directory
-csih_make_dir "${LOGDIR}" "Syslogging using messagebus will not work."
-chmod 775 "${LOGDIR}"
-setfacl -m u:system:rwx "${LOGDIR}"
-
-# Check for ${RUNDIR} directory
-csih_make_dir "${RUNDIR}" "PID files of running processes will not be created."
-chmod 775 "${RUNDIR}"
-setfacl -m u:system:rwx "${RUNDIR}"
-
-# Check for ${SOCKDIR} directory
-csih_make_dir "${SOCKDIR}" "SOCKET files of running processes will not be created."
-chmod 775 "${SOCKDIR}"
-setfacl -m u:system:rwx "${SOCKDIR}"
-
-# maybe: csih_auto_answer=no will skip,
-# interactive user will get a chance to override
-install_service
-
-
-echo
-echo "Configuration finished. Have fun!"
diff --git a/src/3rd_party/dbus-1.7.8/bus/messagebus.in b/src/3rd_party/dbus-1.7.8/bus/messagebus.in
deleted file mode 100755
index 3e2ee07a11..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/messagebus.in
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/bin/sh
-#
-# messagebus: The D-BUS systemwide message bus
-#
-# chkconfig: 345 22 85
-# description: This is a daemon which broadcasts notifications of system events \
-# and other messages. See http://www.freedesktop.org/software/dbus/
-#
-# processname: dbus-daemon
-# pidfile: @DBUS_SYSTEM_PID_FILE@
-#
-### BEGIN INIT INFO
-# Provides: messagebus
-# Required-Start: $syslog $local_fs
-# Required-Stop: $syslog $local_fs
-# Default-Start: 2 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: The D-Bus systemwide message bus
-# Description: This is a daemon which broadcasts notifications of system
-# events and other messages. See http://www.freedesktop.org/software/dbus
-### END INIT INFO
-
-# Sanity checks.
-[ -x @EXPANDED_BINDIR@/dbus-daemon ] || exit 0
-
-# Source function library.
-. @EXPANDED_SYSCONFDIR@/rc.d/init.d/functions
-
-# so we can rearrange this easily
-processname=dbus-daemon
-servicename=messagebus
-
-RETVAL=0
-
-start() {
- echo -n $"Starting system message bus: "
- if [ -x @EXPANDED_BINDIR@/dbus-uuidgen ] ; then
- @EXPANDED_BINDIR@/dbus-uuidgen --ensure
- fi
-
- daemon --check $servicename $processname --system
- RETVAL=$?
- echo
- [ $RETVAL -eq 0 ] && touch @EXPANDED_LOCALSTATEDIR@/lock/subsys/$servicename
-}
-
-stop() {
- echo -n $"Stopping system message bus: "
-
- ## we don't want to kill all the per-user $processname, we want
- ## to use the pid file *only*; because we use the fake nonexistent
- ## program name "$servicename" that should be safe-ish
- killproc $servicename -TERM
- RETVAL=$?
- echo
- if [ $RETVAL -eq 0 ]; then
- rm -f @EXPANDED_LOCALSTATEDIR@/lock/subsys/$servicename
- rm -f @DBUS_SYSTEM_PID_FILE@
- fi
-}
-
-# See how we were called.
-case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- status)
- status $servicename
- RETVAL=$?
- ;;
- restart)
- stop
- start
- ;;
- condrestart)
- if [ -f @EXPANDED_LOCALSTATEDIR@/lock/subsys/$servicename ]; then
- stop
- start
- fi
- ;;
- reload)
- echo "Message bus can't reload its configuration, you have to restart it"
- RETVAL=$?
- ;;
- *)
- echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
- ;;
-esac
-exit $RETVAL
diff --git a/src/3rd_party/dbus-1.7.8/bus/org.freedesktop.dbus-session.plist.in b/src/3rd_party/dbus-1.7.8/bus/org.freedesktop.dbus-session.plist.in
deleted file mode 100644
index 40ff370d6a..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/org.freedesktop.dbus-session.plist.in
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>Label</key>
- <string>org.freedesktop.dbus-session</string>
-
- <key>ServiceIPC</key>
- <true/>
-
- <!-- Please uncomment on 10.4; OnDemand doesn't work properly there. -->
- <!--
- <key>OnDemand</key>
- <false />
- -->
-
- <key>ProgramArguments</key>
- <array>
- <string>@DBUS_DAEMONDIR@/dbus-daemon</string>
- <string>--nofork</string>
- <string>--session</string>
- </array>
-
- <key>Sockets</key>
- <dict>
- <key>unix_domain_listener</key>
- <dict>
- <key>SecureSocketWithKey</key>
- <string>DBUS_LAUNCHD_SESSION_BUS_SOCKET</string>
- </dict>
- </dict>
-</dict>
-</plist>
diff --git a/src/3rd_party/dbus-1.7.8/bus/policy.c b/src/3rd_party/dbus-1.7.8/bus/policy.c
deleted file mode 100644
index 082f3853b8..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/policy.c
+++ /dev/null
@@ -1,1313 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* policy.c Bus security policy
- *
- * Copyright (C) 2003, 2004 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "policy.h"
-#include "services.h"
-#include "test.h"
-#include "utils.h"
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-hash.h>
-#include <dbus/dbus-internals.h>
-
-BusPolicyRule*
-bus_policy_rule_new (BusPolicyRuleType type,
- dbus_bool_t allow)
-{
- BusPolicyRule *rule;
-
- rule = dbus_new0 (BusPolicyRule, 1);
- if (rule == NULL)
- return NULL;
-
- rule->type = type;
- rule->refcount = 1;
- rule->allow = allow;
-
- switch (rule->type)
- {
- case BUS_POLICY_RULE_USER:
- rule->d.user.uid = DBUS_UID_UNSET;
- break;
- case BUS_POLICY_RULE_GROUP:
- rule->d.group.gid = DBUS_GID_UNSET;
- break;
- case BUS_POLICY_RULE_SEND:
- rule->d.send.message_type = DBUS_MESSAGE_TYPE_INVALID;
-
- /* allow rules default to TRUE (only requested replies allowed)
- * deny rules default to FALSE (only unrequested replies denied)
- */
- rule->d.send.requested_reply = rule->allow;
- break;
- case BUS_POLICY_RULE_RECEIVE:
- rule->d.receive.message_type = DBUS_MESSAGE_TYPE_INVALID;
- /* allow rules default to TRUE (only requested replies allowed)
- * deny rules default to FALSE (only unrequested replies denied)
- */
- rule->d.receive.requested_reply = rule->allow;
- break;
- case BUS_POLICY_RULE_OWN:
- break;
- }
-
- return rule;
-}
-
-BusPolicyRule *
-bus_policy_rule_ref (BusPolicyRule *rule)
-{
- _dbus_assert (rule->refcount > 0);
-
- rule->refcount += 1;
-
- return rule;
-}
-
-void
-bus_policy_rule_unref (BusPolicyRule *rule)
-{
- _dbus_assert (rule->refcount > 0);
-
- rule->refcount -= 1;
-
- if (rule->refcount == 0)
- {
- switch (rule->type)
- {
- case BUS_POLICY_RULE_SEND:
- dbus_free (rule->d.send.path);
- dbus_free (rule->d.send.interface);
- dbus_free (rule->d.send.member);
- dbus_free (rule->d.send.error);
- dbus_free (rule->d.send.destination);
- break;
- case BUS_POLICY_RULE_RECEIVE:
- dbus_free (rule->d.receive.path);
- dbus_free (rule->d.receive.interface);
- dbus_free (rule->d.receive.member);
- dbus_free (rule->d.receive.error);
- dbus_free (rule->d.receive.origin);
- break;
- case BUS_POLICY_RULE_OWN:
- dbus_free (rule->d.own.service_name);
- break;
- case BUS_POLICY_RULE_USER:
- break;
- case BUS_POLICY_RULE_GROUP:
- break;
- }
-
- dbus_free (rule);
- }
-}
-
-struct BusPolicy
-{
- int refcount;
-
- DBusList *default_rules; /**< Default policy rules */
- DBusList *mandatory_rules; /**< Mandatory policy rules */
- DBusHashTable *rules_by_uid; /**< per-UID policy rules */
- DBusHashTable *rules_by_gid; /**< per-GID policy rules */
- DBusList *at_console_true_rules; /**< console user policy rules where at_console="true"*/
- DBusList *at_console_false_rules; /**< console user policy rules where at_console="false"*/
-};
-
-static void
-free_rule_func (void *data,
- void *user_data)
-{
- BusPolicyRule *rule = data;
-
- bus_policy_rule_unref (rule);
-}
-
-static void
-free_rule_list_func (void *data)
-{
- DBusList **list = data;
-
- if (list == NULL) /* DBusHashTable is on crack */
- return;
-
- _dbus_list_foreach (list, free_rule_func, NULL);
-
- _dbus_list_clear (list);
-
- dbus_free (list);
-}
-
-BusPolicy*
-bus_policy_new (void)
-{
- BusPolicy *policy;
-
- policy = dbus_new0 (BusPolicy, 1);
- if (policy == NULL)
- return NULL;
-
- policy->refcount = 1;
-
- policy->rules_by_uid = _dbus_hash_table_new (DBUS_HASH_UINTPTR,
- NULL,
- free_rule_list_func);
- if (policy->rules_by_uid == NULL)
- goto failed;
-
- policy->rules_by_gid = _dbus_hash_table_new (DBUS_HASH_UINTPTR,
- NULL,
- free_rule_list_func);
- if (policy->rules_by_gid == NULL)
- goto failed;
-
- return policy;
-
- failed:
- bus_policy_unref (policy);
- return NULL;
-}
-
-BusPolicy *
-bus_policy_ref (BusPolicy *policy)
-{
- _dbus_assert (policy->refcount > 0);
-
- policy->refcount += 1;
-
- return policy;
-}
-
-void
-bus_policy_unref (BusPolicy *policy)
-{
- _dbus_assert (policy->refcount > 0);
-
- policy->refcount -= 1;
-
- if (policy->refcount == 0)
- {
- _dbus_list_foreach (&policy->default_rules, free_rule_func, NULL);
- _dbus_list_clear (&policy->default_rules);
-
- _dbus_list_foreach (&policy->mandatory_rules, free_rule_func, NULL);
- _dbus_list_clear (&policy->mandatory_rules);
-
- _dbus_list_foreach (&policy->at_console_true_rules, free_rule_func, NULL);
- _dbus_list_clear (&policy->at_console_true_rules);
-
- _dbus_list_foreach (&policy->at_console_false_rules, free_rule_func, NULL);
- _dbus_list_clear (&policy->at_console_false_rules);
-
- if (policy->rules_by_uid)
- {
- _dbus_hash_table_unref (policy->rules_by_uid);
- policy->rules_by_uid = NULL;
- }
-
- if (policy->rules_by_gid)
- {
- _dbus_hash_table_unref (policy->rules_by_gid);
- policy->rules_by_gid = NULL;
- }
-
- dbus_free (policy);
- }
-}
-
-static dbus_bool_t
-add_list_to_client (DBusList **list,
- BusClientPolicy *client)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (list);
- while (link != NULL)
- {
- BusPolicyRule *rule = link->data;
- link = _dbus_list_get_next_link (list, link);
-
- switch (rule->type)
- {
- case BUS_POLICY_RULE_USER:
- case BUS_POLICY_RULE_GROUP:
- /* These aren't per-connection policies */
- break;
-
- case BUS_POLICY_RULE_OWN:
- case BUS_POLICY_RULE_SEND:
- case BUS_POLICY_RULE_RECEIVE:
- /* These are per-connection */
- if (!bus_client_policy_append_rule (client, rule))
- return FALSE;
- break;
- }
- }
-
- return TRUE;
-}
-
-BusClientPolicy*
-bus_policy_create_client_policy (BusPolicy *policy,
- DBusConnection *connection,
- DBusError *error)
-{
- BusClientPolicy *client;
- dbus_uid_t uid;
- dbus_bool_t at_console;
-
- _dbus_assert (dbus_connection_get_is_authenticated (connection));
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- client = bus_client_policy_new ();
- if (client == NULL)
- goto nomem;
-
- if (!add_list_to_client (&policy->default_rules,
- client))
- goto nomem;
-
- /* we avoid the overhead of looking up user's groups
- * if we don't have any group rules anyway
- */
- if (_dbus_hash_table_get_n_entries (policy->rules_by_gid) > 0)
- {
- unsigned long *groups;
- int n_groups;
- int i;
-
- if (!bus_connection_get_unix_groups (connection, &groups, &n_groups, error))
- goto failed;
-
- i = 0;
- while (i < n_groups)
- {
- DBusList **list;
-
- list = _dbus_hash_table_lookup_uintptr (policy->rules_by_gid,
- groups[i]);
-
- if (list != NULL)
- {
- if (!add_list_to_client (list, client))
- {
- dbus_free (groups);
- goto nomem;
- }
- }
-
- ++i;
- }
-
- dbus_free (groups);
- }
-
- if (dbus_connection_get_unix_user (connection, &uid))
- {
- if (_dbus_hash_table_get_n_entries (policy->rules_by_uid) > 0)
- {
- DBusList **list;
-
- list = _dbus_hash_table_lookup_uintptr (policy->rules_by_uid,
- uid);
-
- if (list != NULL)
- {
- if (!add_list_to_client (list, client))
- goto nomem;
- }
- }
-
- /* Add console rules */
- at_console = _dbus_unix_user_is_at_console (uid, error);
-
- if (at_console)
- {
- if (!add_list_to_client (&policy->at_console_true_rules, client))
- goto nomem;
- }
- else if (dbus_error_is_set (error) == TRUE)
- {
- goto failed;
- }
- else if (!add_list_to_client (&policy->at_console_false_rules, client))
- {
- goto nomem;
- }
- }
-
- if (!add_list_to_client (&policy->mandatory_rules,
- client))
- goto nomem;
-
- bus_client_policy_optimize (client);
-
- return client;
-
- nomem:
- BUS_SET_OOM (error);
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (client)
- bus_client_policy_unref (client);
- return NULL;
-}
-
-static dbus_bool_t
-list_allows_user (dbus_bool_t def,
- DBusList **list,
- unsigned long uid,
- const unsigned long *group_ids,
- int n_group_ids)
-{
- DBusList *link;
- dbus_bool_t allowed;
-
- allowed = def;
-
- link = _dbus_list_get_first_link (list);
- while (link != NULL)
- {
- BusPolicyRule *rule = link->data;
- link = _dbus_list_get_next_link (list, link);
-
- if (rule->type == BUS_POLICY_RULE_USER)
- {
- _dbus_verbose ("List %p user rule uid="DBUS_UID_FORMAT"\n",
- list, rule->d.user.uid);
-
- if (rule->d.user.uid == DBUS_UID_UNSET)
- ; /* '*' wildcard */
- else if (rule->d.user.uid != uid)
- continue;
- }
- else if (rule->type == BUS_POLICY_RULE_GROUP)
- {
- _dbus_verbose ("List %p group rule gid="DBUS_GID_FORMAT"\n",
- list, rule->d.group.gid);
-
- if (rule->d.group.gid == DBUS_GID_UNSET)
- ; /* '*' wildcard */
- else
- {
- int i;
-
- i = 0;
- while (i < n_group_ids)
- {
- if (rule->d.group.gid == group_ids[i])
- break;
- ++i;
- }
-
- if (i == n_group_ids)
- continue;
- }
- }
- else
- continue;
-
- allowed = rule->allow;
- }
-
- return allowed;
-}
-
-dbus_bool_t
-bus_policy_allow_unix_user (BusPolicy *policy,
- unsigned long uid)
-{
- dbus_bool_t allowed;
- unsigned long *group_ids;
- int n_group_ids;
-
- /* On OOM or error we always reject the user */
- if (!_dbus_unix_groups_from_uid (uid, &group_ids, &n_group_ids))
- {
- _dbus_verbose ("Did not get any groups for UID %lu\n",
- uid);
- return FALSE;
- }
-
- /* Default to "user owning bus" can connect */
- allowed = _dbus_unix_user_is_process_owner (uid);
-
- allowed = list_allows_user (allowed,
- &policy->default_rules,
- uid,
- group_ids, n_group_ids);
-
- allowed = list_allows_user (allowed,
- &policy->mandatory_rules,
- uid,
- group_ids, n_group_ids);
-
- dbus_free (group_ids);
-
- _dbus_verbose ("UID %lu allowed = %d\n", uid, allowed);
-
- return allowed;
-}
-
-/* For now this is never actually called because the default
- * DBusConnection behavior of 'same user that owns the bus can
- * connect' is all it would do. Set the windows user function in
- * connection.c if the config file ever supports doing something
- * interesting here.
- */
-dbus_bool_t
-bus_policy_allow_windows_user (BusPolicy *policy,
- const char *windows_sid)
-{
- /* Windows has no policies here since only the session bus
- * is really used for now, so just checking that the
- * connecting person is the same as the bus owner is fine.
- */
- return _dbus_windows_user_is_process_owner (windows_sid);
-}
-
-dbus_bool_t
-bus_policy_append_default_rule (BusPolicy *policy,
- BusPolicyRule *rule)
-{
- if (!_dbus_list_append (&policy->default_rules, rule))
- return FALSE;
-
- bus_policy_rule_ref (rule);
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_policy_append_mandatory_rule (BusPolicy *policy,
- BusPolicyRule *rule)
-{
- if (!_dbus_list_append (&policy->mandatory_rules, rule))
- return FALSE;
-
- bus_policy_rule_ref (rule);
-
- return TRUE;
-}
-
-
-
-static DBusList**
-get_list (DBusHashTable *hash,
- unsigned long key)
-{
- DBusList **list;
-
- list = _dbus_hash_table_lookup_uintptr (hash, key);
-
- if (list == NULL)
- {
- list = dbus_new0 (DBusList*, 1);
- if (list == NULL)
- return NULL;
-
- if (!_dbus_hash_table_insert_uintptr (hash, key, list))
- {
- dbus_free (list);
- return NULL;
- }
- }
-
- return list;
-}
-
-dbus_bool_t
-bus_policy_append_user_rule (BusPolicy *policy,
- dbus_uid_t uid,
- BusPolicyRule *rule)
-{
- DBusList **list;
-
- list = get_list (policy->rules_by_uid, uid);
-
- if (list == NULL)
- return FALSE;
-
- if (!_dbus_list_append (list, rule))
- return FALSE;
-
- bus_policy_rule_ref (rule);
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_policy_append_group_rule (BusPolicy *policy,
- dbus_gid_t gid,
- BusPolicyRule *rule)
-{
- DBusList **list;
-
- list = get_list (policy->rules_by_gid, gid);
-
- if (list == NULL)
- return FALSE;
-
- if (!_dbus_list_append (list, rule))
- return FALSE;
-
- bus_policy_rule_ref (rule);
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_policy_append_console_rule (BusPolicy *policy,
- dbus_bool_t at_console,
- BusPolicyRule *rule)
-{
- if (at_console)
- {
- if (!_dbus_list_append (&policy->at_console_true_rules, rule))
- return FALSE;
- }
- else
- {
- if (!_dbus_list_append (&policy->at_console_false_rules, rule))
- return FALSE;
- }
-
- bus_policy_rule_ref (rule);
-
- return TRUE;
-
-}
-
-static dbus_bool_t
-append_copy_of_policy_list (DBusList **list,
- DBusList **to_append)
-{
- DBusList *link;
- DBusList *tmp_list;
-
- tmp_list = NULL;
-
- /* Preallocate all our links */
- link = _dbus_list_get_first_link (to_append);
- while (link != NULL)
- {
- if (!_dbus_list_append (&tmp_list, link->data))
- {
- _dbus_list_clear (&tmp_list);
- return FALSE;
- }
-
- link = _dbus_list_get_next_link (to_append, link);
- }
-
- /* Now append them */
- while ((link = _dbus_list_pop_first_link (&tmp_list)))
- {
- bus_policy_rule_ref (link->data);
- _dbus_list_append_link (list, link);
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-merge_id_hash (DBusHashTable *dest,
- DBusHashTable *to_absorb)
-{
- DBusHashIter iter;
-
- _dbus_hash_iter_init (to_absorb, &iter);
- while (_dbus_hash_iter_next (&iter))
- {
- unsigned long id = _dbus_hash_iter_get_uintptr_key (&iter);
- DBusList **list = _dbus_hash_iter_get_value (&iter);
- DBusList **target = get_list (dest, id);
-
- if (target == NULL)
- return FALSE;
-
- if (!append_copy_of_policy_list (target, list))
- return FALSE;
- }
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_policy_merge (BusPolicy *policy,
- BusPolicy *to_absorb)
-{
- /* FIXME Not properly atomic, but as used for configuration files we
- * don't rely on it quite so much.
- */
-
- if (!append_copy_of_policy_list (&policy->default_rules,
- &to_absorb->default_rules))
- return FALSE;
-
- if (!append_copy_of_policy_list (&policy->mandatory_rules,
- &to_absorb->mandatory_rules))
- return FALSE;
-
- if (!append_copy_of_policy_list (&policy->at_console_true_rules,
- &to_absorb->at_console_true_rules))
- return FALSE;
-
- if (!append_copy_of_policy_list (&policy->at_console_false_rules,
- &to_absorb->at_console_false_rules))
- return FALSE;
-
- if (!merge_id_hash (policy->rules_by_uid,
- to_absorb->rules_by_uid))
- return FALSE;
-
- if (!merge_id_hash (policy->rules_by_gid,
- to_absorb->rules_by_gid))
- return FALSE;
-
- return TRUE;
-}
-
-struct BusClientPolicy
-{
- int refcount;
-
- DBusList *rules;
-};
-
-BusClientPolicy*
-bus_client_policy_new (void)
-{
- BusClientPolicy *policy;
-
- policy = dbus_new0 (BusClientPolicy, 1);
- if (policy == NULL)
- return NULL;
-
- policy->refcount = 1;
-
- return policy;
-}
-
-BusClientPolicy *
-bus_client_policy_ref (BusClientPolicy *policy)
-{
- _dbus_assert (policy->refcount > 0);
-
- policy->refcount += 1;
-
- return policy;
-}
-
-static void
-rule_unref_foreach (void *data,
- void *user_data)
-{
- BusPolicyRule *rule = data;
-
- bus_policy_rule_unref (rule);
-}
-
-void
-bus_client_policy_unref (BusClientPolicy *policy)
-{
- _dbus_assert (policy->refcount > 0);
-
- policy->refcount -= 1;
-
- if (policy->refcount == 0)
- {
- _dbus_list_foreach (&policy->rules,
- rule_unref_foreach,
- NULL);
-
- _dbus_list_clear (&policy->rules);
-
- dbus_free (policy);
- }
-}
-
-static void
-remove_rules_by_type_up_to (BusClientPolicy *policy,
- BusPolicyRuleType type,
- DBusList *up_to)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (&policy->rules);
- while (link != up_to)
- {
- BusPolicyRule *rule = link->data;
- DBusList *next = _dbus_list_get_next_link (&policy->rules, link);
-
- if (rule->type == type)
- {
- _dbus_list_remove_link (&policy->rules, link);
- bus_policy_rule_unref (rule);
- }
-
- link = next;
- }
-}
-
-void
-bus_client_policy_optimize (BusClientPolicy *policy)
-{
- DBusList *link;
-
- /* The idea here is that if we have:
- *
- * <allow send_interface="foo.bar"/>
- * <deny send_interface="*"/>
- *
- * (for example) the deny will always override the allow. So we
- * delete the allow. Ditto for deny followed by allow, etc. This is
- * a dumb thing to put in a config file, but the <include> feature
- * of files allows for an "inheritance and override" pattern where
- * it could make sense. If an included file wants to "start over"
- * with a blanket deny, no point keeping the rules from the parent
- * file.
- */
-
- _dbus_verbose ("Optimizing policy with %d rules\n",
- _dbus_list_get_length (&policy->rules));
-
- link = _dbus_list_get_first_link (&policy->rules);
- while (link != NULL)
- {
- BusPolicyRule *rule;
- DBusList *next;
- dbus_bool_t remove_preceding;
-
- next = _dbus_list_get_next_link (&policy->rules, link);
- rule = link->data;
-
- remove_preceding = FALSE;
-
- _dbus_assert (rule != NULL);
-
- switch (rule->type)
- {
- case BUS_POLICY_RULE_SEND:
- remove_preceding =
- rule->d.send.message_type == DBUS_MESSAGE_TYPE_INVALID &&
- rule->d.send.path == NULL &&
- rule->d.send.interface == NULL &&
- rule->d.send.member == NULL &&
- rule->d.send.error == NULL &&
- rule->d.send.destination == NULL;
- break;
- case BUS_POLICY_RULE_RECEIVE:
- remove_preceding =
- rule->d.receive.message_type == DBUS_MESSAGE_TYPE_INVALID &&
- rule->d.receive.path == NULL &&
- rule->d.receive.interface == NULL &&
- rule->d.receive.member == NULL &&
- rule->d.receive.error == NULL &&
- rule->d.receive.origin == NULL;
- break;
- case BUS_POLICY_RULE_OWN:
- remove_preceding =
- rule->d.own.service_name == NULL;
- break;
- case BUS_POLICY_RULE_USER:
- case BUS_POLICY_RULE_GROUP:
- _dbus_assert_not_reached ("invalid rule");
- break;
- }
-
- if (remove_preceding)
- remove_rules_by_type_up_to (policy, rule->type,
- link);
-
- link = next;
- }
-
- _dbus_verbose ("After optimization, policy has %d rules\n",
- _dbus_list_get_length (&policy->rules));
-}
-
-dbus_bool_t
-bus_client_policy_append_rule (BusClientPolicy *policy,
- BusPolicyRule *rule)
-{
- _dbus_verbose ("Appending rule %p with type %d to policy %p\n",
- rule, rule->type, policy);
-
- if (!_dbus_list_append (&policy->rules, rule))
- return FALSE;
-
- bus_policy_rule_ref (rule);
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_client_policy_check_can_send (BusClientPolicy *policy,
- BusRegistry *registry,
- dbus_bool_t requested_reply,
- DBusConnection *receiver,
- DBusMessage *message,
- dbus_int32_t *toggles,
- dbus_bool_t *log)
-{
- DBusList *link;
- dbus_bool_t allowed;
-
- /* policy->rules is in the order the rules appeared
- * in the config file, i.e. last rule that applies wins
- */
-
- _dbus_verbose (" (policy) checking send rules\n");
- *toggles = 0;
-
- allowed = FALSE;
- link = _dbus_list_get_first_link (&policy->rules);
- while (link != NULL)
- {
- BusPolicyRule *rule = link->data;
-
- link = _dbus_list_get_next_link (&policy->rules, link);
-
- /* Rule is skipped if it specifies a different
- * message name from the message, or a different
- * destination from the message
- */
-
- if (rule->type != BUS_POLICY_RULE_SEND)
- {
- _dbus_verbose (" (policy) skipping non-send rule\n");
- continue;
- }
-
- if (rule->d.send.message_type != DBUS_MESSAGE_TYPE_INVALID)
- {
- if (dbus_message_get_type (message) != rule->d.send.message_type)
- {
- _dbus_verbose (" (policy) skipping rule for different message type\n");
- continue;
- }
- }
-
- /* If it's a reply, the requested_reply flag kicks in */
- if (dbus_message_get_reply_serial (message) != 0)
- {
- /* for allow, requested_reply=true means the rule applies
- * only when reply was requested. requested_reply=false means
- * always allow.
- */
- if (!requested_reply && rule->allow && rule->d.send.requested_reply && !rule->d.send.eavesdrop)
- {
- _dbus_verbose (" (policy) skipping allow rule since it only applies to requested replies and does not allow eavesdropping\n");
- continue;
- }
-
- /* for deny, requested_reply=false means the rule applies only
- * when the reply was not requested. requested_reply=true means the
- * rule always applies.
- */
- if (requested_reply && !rule->allow && !rule->d.send.requested_reply)
- {
- _dbus_verbose (" (policy) skipping deny rule since it only applies to unrequested replies\n");
- continue;
- }
- }
-
- if (rule->d.send.path != NULL)
- {
- if (dbus_message_get_path (message) != NULL &&
- strcmp (dbus_message_get_path (message),
- rule->d.send.path) != 0)
- {
- _dbus_verbose (" (policy) skipping rule for different path\n");
- continue;
- }
- }
-
- if (rule->d.send.interface != NULL)
- {
- /* The interface is optional in messages. For allow rules, if the message
- * has no interface we want to skip the rule (and thus not allow);
- * for deny rules, if the message has no interface we want to use the
- * rule (and thus deny).
- */
- dbus_bool_t no_interface;
-
- no_interface = dbus_message_get_interface (message) == NULL;
-
- if ((no_interface && rule->allow) ||
- (!no_interface &&
- strcmp (dbus_message_get_interface (message),
- rule->d.send.interface) != 0))
- {
- _dbus_verbose (" (policy) skipping rule for different interface\n");
- continue;
- }
- }
-
- if (rule->d.send.member != NULL)
- {
- if (dbus_message_get_member (message) != NULL &&
- strcmp (dbus_message_get_member (message),
- rule->d.send.member) != 0)
- {
- _dbus_verbose (" (policy) skipping rule for different member\n");
- continue;
- }
- }
-
- if (rule->d.send.error != NULL)
- {
- if (dbus_message_get_error_name (message) != NULL &&
- strcmp (dbus_message_get_error_name (message),
- rule->d.send.error) != 0)
- {
- _dbus_verbose (" (policy) skipping rule for different error name\n");
- continue;
- }
- }
-
- if (rule->d.send.destination != NULL)
- {
- /* receiver can be NULL for messages that are sent to the
- * message bus itself, we check the strings in that case as
- * built-in services don't have a DBusConnection but messages
- * to them have a destination service name.
- */
- if (receiver == NULL)
- {
- if (!dbus_message_has_destination (message,
- rule->d.send.destination))
- {
- _dbus_verbose (" (policy) skipping rule because message dest is not %s\n",
- rule->d.send.destination);
- continue;
- }
- }
- else
- {
- DBusString str;
- BusService *service;
-
- _dbus_string_init_const (&str, rule->d.send.destination);
-
- service = bus_registry_lookup (registry, &str);
- if (service == NULL)
- {
- _dbus_verbose (" (policy) skipping rule because dest %s doesn't exist\n",
- rule->d.send.destination);
- continue;
- }
-
- if (!bus_service_has_owner (service, receiver))
- {
- _dbus_verbose (" (policy) skipping rule because dest %s isn't owned by receiver\n",
- rule->d.send.destination);
- continue;
- }
- }
- }
-
- /* Use this rule */
- allowed = rule->allow;
- *log = rule->d.send.log;
- (*toggles)++;
-
- _dbus_verbose (" (policy) used rule, allow now = %d\n",
- allowed);
- }
-
- return allowed;
-}
-
-/* See docs on what the args mean on bus_context_check_security_policy()
- * comment
- */
-dbus_bool_t
-bus_client_policy_check_can_receive (BusClientPolicy *policy,
- BusRegistry *registry,
- dbus_bool_t requested_reply,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusConnection *proposed_recipient,
- DBusMessage *message,
- dbus_int32_t *toggles)
-{
- DBusList *link;
- dbus_bool_t allowed;
- dbus_bool_t eavesdropping;
-
- eavesdropping =
- addressed_recipient != proposed_recipient &&
- dbus_message_get_destination (message) != NULL;
-
- /* policy->rules is in the order the rules appeared
- * in the config file, i.e. last rule that applies wins
- */
-
- _dbus_verbose (" (policy) checking receive rules, eavesdropping = %d\n", eavesdropping);
- *toggles = 0;
-
- allowed = FALSE;
- link = _dbus_list_get_first_link (&policy->rules);
- while (link != NULL)
- {
- BusPolicyRule *rule = link->data;
-
- link = _dbus_list_get_next_link (&policy->rules, link);
-
- if (rule->type != BUS_POLICY_RULE_RECEIVE)
- {
- _dbus_verbose (" (policy) skipping non-receive rule\n");
- continue;
- }
-
- if (rule->d.receive.message_type != DBUS_MESSAGE_TYPE_INVALID)
- {
- if (dbus_message_get_type (message) != rule->d.receive.message_type)
- {
- _dbus_verbose (" (policy) skipping rule for different message type\n");
- continue;
- }
- }
-
- /* for allow, eavesdrop=false means the rule doesn't apply when
- * eavesdropping. eavesdrop=true means always allow.
- */
- if (eavesdropping && rule->allow && !rule->d.receive.eavesdrop)
- {
- _dbus_verbose (" (policy) skipping allow rule since it doesn't apply to eavesdropping\n");
- continue;
- }
-
- /* for deny, eavesdrop=true means the rule applies only when
- * eavesdropping; eavesdrop=false means always deny.
- */
- if (!eavesdropping && !rule->allow && rule->d.receive.eavesdrop)
- {
- _dbus_verbose (" (policy) skipping deny rule since it only applies to eavesdropping\n");
- continue;
- }
-
- /* If it's a reply, the requested_reply flag kicks in */
- if (dbus_message_get_reply_serial (message) != 0)
- {
- /* for allow, requested_reply=true means the rule applies
- * only when reply was requested. requested_reply=false means
- * always allow.
- */
- if (!requested_reply && rule->allow && rule->d.receive.requested_reply && !rule->d.receive.eavesdrop)
- {
- _dbus_verbose (" (policy) skipping allow rule since it only applies to requested replies and does not allow eavesdropping\n");
- continue;
- }
-
- /* for deny, requested_reply=false means the rule applies only
- * when the reply was not requested. requested_reply=true means the
- * rule always applies.
- */
- if (requested_reply && !rule->allow && !rule->d.receive.requested_reply)
- {
- _dbus_verbose (" (policy) skipping deny rule since it only applies to unrequested replies\n");
- continue;
- }
- }
-
- if (rule->d.receive.path != NULL)
- {
- if (dbus_message_get_path (message) != NULL &&
- strcmp (dbus_message_get_path (message),
- rule->d.receive.path) != 0)
- {
- _dbus_verbose (" (policy) skipping rule for different path\n");
- continue;
- }
- }
-
- if (rule->d.receive.interface != NULL)
- {
- /* The interface is optional in messages. For allow rules, if the message
- * has no interface we want to skip the rule (and thus not allow);
- * for deny rules, if the message has no interface we want to use the
- * rule (and thus deny).
- */
- dbus_bool_t no_interface;
-
- no_interface = dbus_message_get_interface (message) == NULL;
-
- if ((no_interface && rule->allow) ||
- (!no_interface &&
- strcmp (dbus_message_get_interface (message),
- rule->d.receive.interface) != 0))
- {
- _dbus_verbose (" (policy) skipping rule for different interface\n");
- continue;
- }
- }
-
- if (rule->d.receive.member != NULL)
- {
- if (dbus_message_get_member (message) != NULL &&
- strcmp (dbus_message_get_member (message),
- rule->d.receive.member) != 0)
- {
- _dbus_verbose (" (policy) skipping rule for different member\n");
- continue;
- }
- }
-
- if (rule->d.receive.error != NULL)
- {
- if (dbus_message_get_error_name (message) != NULL &&
- strcmp (dbus_message_get_error_name (message),
- rule->d.receive.error) != 0)
- {
- _dbus_verbose (" (policy) skipping rule for different error name\n");
- continue;
- }
- }
-
- if (rule->d.receive.origin != NULL)
- {
- /* sender can be NULL for messages that originate from the
- * message bus itself, we check the strings in that case as
- * built-in services don't have a DBusConnection but will
- * still set the sender on their messages.
- */
- if (sender == NULL)
- {
- if (!dbus_message_has_sender (message,
- rule->d.receive.origin))
- {
- _dbus_verbose (" (policy) skipping rule because message sender is not %s\n",
- rule->d.receive.origin);
- continue;
- }
- }
- else
- {
- BusService *service;
- DBusString str;
-
- _dbus_string_init_const (&str, rule->d.receive.origin);
-
- service = bus_registry_lookup (registry, &str);
-
- if (service == NULL)
- {
- _dbus_verbose (" (policy) skipping rule because origin %s doesn't exist\n",
- rule->d.receive.origin);
- continue;
- }
-
- if (!bus_service_has_owner (service, sender))
- {
- _dbus_verbose (" (policy) skipping rule because origin %s isn't owned by sender\n",
- rule->d.receive.origin);
- continue;
- }
- }
- }
-
- /* Use this rule */
- allowed = rule->allow;
- (*toggles)++;
-
- _dbus_verbose (" (policy) used rule, allow now = %d\n",
- allowed);
- }
-
- return allowed;
-}
-
-
-
-static dbus_bool_t
-bus_rules_check_can_own (DBusList *rules,
- const DBusString *service_name)
-{
- DBusList *link;
- dbus_bool_t allowed;
-
- /* rules is in the order the rules appeared
- * in the config file, i.e. last rule that applies wins
- */
-
- allowed = FALSE;
- link = _dbus_list_get_first_link (&rules);
- while (link != NULL)
- {
- BusPolicyRule *rule = link->data;
-
- link = _dbus_list_get_next_link (&rules, link);
-
- /* Rule is skipped if it specifies a different service name from
- * the desired one.
- */
-
- if (rule->type != BUS_POLICY_RULE_OWN)
- continue;
-
- if (!rule->d.own.prefix && rule->d.own.service_name != NULL)
- {
- if (!_dbus_string_equal_c_str (service_name,
- rule->d.own.service_name))
- continue;
- }
- else if (rule->d.own.prefix)
- {
- const char *data;
- char next_char;
- if (!_dbus_string_starts_with_c_str (service_name,
- rule->d.own.service_name))
- continue;
-
- data = _dbus_string_get_const_data (service_name);
- next_char = data[strlen (rule->d.own.service_name)];
- if (next_char != '\0' && next_char != '.')
- continue;
- }
-
- /* Use this rule */
- allowed = rule->allow;
- }
-
- return allowed;
-}
-
-dbus_bool_t
-bus_client_policy_check_can_own (BusClientPolicy *policy,
- const DBusString *service_name)
-{
- return bus_rules_check_can_own (policy->rules, service_name);
-}
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-dbus_bool_t
-bus_policy_check_can_own (BusPolicy *policy,
- const DBusString *service_name)
-{
- return bus_rules_check_can_own (policy->default_rules, service_name);
-}
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
-
diff --git a/src/3rd_party/dbus-1.7.8/bus/policy.h b/src/3rd_party/dbus-1.7.8/bus/policy.h
deleted file mode 100644
index d1d3e72b7f..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/policy.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* policy.h Bus security policy
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_POLICY_H
-#define BUS_POLICY_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-sysdeps.h>
-#include "bus.h"
-
-typedef enum
-{
- BUS_POLICY_RULE_SEND,
- BUS_POLICY_RULE_RECEIVE,
- BUS_POLICY_RULE_OWN,
- BUS_POLICY_RULE_USER,
- BUS_POLICY_RULE_GROUP
-} BusPolicyRuleType;
-
-/** determines whether the rule affects a connection, or some global item */
-#define BUS_POLICY_RULE_IS_PER_CLIENT(rule) (!((rule)->type == BUS_POLICY_RULE_USER || \
- (rule)->type == BUS_POLICY_RULE_GROUP))
-
-struct BusPolicyRule
-{
- int refcount;
-
- BusPolicyRuleType type;
-
- unsigned int allow : 1; /**< #TRUE if this allows, #FALSE if it denies */
-
- union
- {
- struct
- {
- /* message type can be DBUS_MESSAGE_TYPE_INVALID meaning "any" */
- int message_type;
- /* any of these can be NULL meaning "any" */
- char *path;
- char *interface;
- char *member;
- char *error;
- char *destination;
- unsigned int eavesdrop : 1;
- unsigned int requested_reply : 1;
- unsigned int log : 1;
- } send;
-
- struct
- {
- /* message type can be DBUS_MESSAGE_TYPE_INVALID meaning "any" */
- int message_type;
- /* any of these can be NULL meaning "any" */
- char *path;
- char *interface;
- char *member;
- char *error;
- char *origin;
- unsigned int eavesdrop : 1;
- unsigned int requested_reply : 1;
- } receive;
-
- struct
- {
- /* can be NULL meaning "any" */
- char *service_name;
- /* if prefix is set, any name starting with service_name can be owned */
- unsigned int prefix : 1;
- } own;
-
- struct
- {
- /* can be DBUS_UID_UNSET meaning "any" */
- dbus_uid_t uid;
- } user;
-
- struct
- {
- /* can be DBUS_GID_UNSET meaning "any" */
- dbus_gid_t gid;
- } group;
-
- } d;
-};
-
-BusPolicyRule* bus_policy_rule_new (BusPolicyRuleType type,
- dbus_bool_t allow);
-BusPolicyRule* bus_policy_rule_ref (BusPolicyRule *rule);
-void bus_policy_rule_unref (BusPolicyRule *rule);
-
-BusPolicy* bus_policy_new (void);
-BusPolicy* bus_policy_ref (BusPolicy *policy);
-void bus_policy_unref (BusPolicy *policy);
-BusClientPolicy* bus_policy_create_client_policy (BusPolicy *policy,
- DBusConnection *connection,
- DBusError *error);
-dbus_bool_t bus_policy_allow_unix_user (BusPolicy *policy,
- unsigned long uid);
-dbus_bool_t bus_policy_allow_windows_user (BusPolicy *policy,
- const char *windows_sid);
-dbus_bool_t bus_policy_append_default_rule (BusPolicy *policy,
- BusPolicyRule *rule);
-dbus_bool_t bus_policy_append_mandatory_rule (BusPolicy *policy,
- BusPolicyRule *rule);
-dbus_bool_t bus_policy_append_user_rule (BusPolicy *policy,
- dbus_uid_t uid,
- BusPolicyRule *rule);
-dbus_bool_t bus_policy_append_group_rule (BusPolicy *policy,
- dbus_gid_t gid,
- BusPolicyRule *rule);
-dbus_bool_t bus_policy_append_console_rule (BusPolicy *policy,
- dbus_bool_t at_console,
- BusPolicyRule *rule);
-
-dbus_bool_t bus_policy_merge (BusPolicy *policy,
- BusPolicy *to_absorb);
-
-BusClientPolicy* bus_client_policy_new (void);
-BusClientPolicy* bus_client_policy_ref (BusClientPolicy *policy);
-void bus_client_policy_unref (BusClientPolicy *policy);
-dbus_bool_t bus_client_policy_check_can_send (BusClientPolicy *policy,
- BusRegistry *registry,
- dbus_bool_t requested_reply,
- DBusConnection *receiver,
- DBusMessage *message,
- dbus_int32_t *toggles,
- dbus_bool_t *log);
-dbus_bool_t bus_client_policy_check_can_receive (BusClientPolicy *policy,
- BusRegistry *registry,
- dbus_bool_t requested_reply,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusConnection *proposed_recipient,
- DBusMessage *message,
- dbus_int32_t *toggles);
-dbus_bool_t bus_client_policy_check_can_own (BusClientPolicy *policy,
- const DBusString *service_name);
-dbus_bool_t bus_client_policy_append_rule (BusClientPolicy *policy,
- BusPolicyRule *rule);
-void bus_client_policy_optimize (BusClientPolicy *policy);
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-dbus_bool_t bus_policy_check_can_own (BusPolicy *policy,
- const DBusString *service_name);
-#endif
-
-#endif /* BUS_POLICY_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/rc.messagebus.in b/src/3rd_party/dbus-1.7.8/bus/rc.messagebus.in
deleted file mode 100644
index c52ca77767..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/rc.messagebus.in
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/sh
-#
-# messagebus: The D-BUS systemwide message bus
-#
-# chkconfig: 345 97 03
-# description: This is a daemon which broadcasts notifications of system events \
-# and other messages. See http://www.freedesktop.org/software/dbus/
-#
-# processname: dbus-daemon
-# pidfile: @DBUS_SYSTEM_PID_FILE@
-#
-
-# Sanity checks.
-#[ -x @EXPANDED_BINDIR@/dbus-daemon ] || exit 0
-
-# Source function library.
-#. @EXPANDED_SYSCONFDIR@/rc.d/init.d/functions
-
-# so we can rearrange this easily
-#processname=dbus-daemon
-#servicename=messagebus
-
-#RETVAL=0
-
-start() {
- echo "Starting system message bus"
- if [ -x @EXPANDED_BINDIR@/dbus-uuidgen ] ; then
- @EXPANDED_BINDIR@/dbus-uuidgen --ensure
- fi
-
- if [ -x @EXPANDED_BINDIR@/dbus-daemon ];then
- @EXPANDED_BINDIR@/dbus-daemon --system
- fi
- #daemon --check $servicename $processname --system
- #RETVAL=$?
- #echo
- #[ $RETVAL -eq 0 ] && touch @EXPANDED_LOCALSTATEDIR@/lock/subsys/$servicename
-}
-
-stop() {
- echo "Stopping system message bus"
-
- ## we don't want to kill all the per-user $processname, we want
- ## to use the pid file *only*; because we use the fake nonexistent
- ## program name "$servicename" that should be safe-ish
- killall dbus-daemon
- #RETVAL=$?
- #echo
- #if [ $RETVAL -eq 0 ]; then
- # rm -f @EXPANDED_LOCALSTATEDIR@/lock/subsys/$servicename
- # rm -f @DBUS_SYSTEM_PID_FILE@
- #fi
-}
-
-# See how we were called.
-case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- status)
- status $servicename
- RETVAL=$?
- ;;
- restart)
- stop
- start
- ;;
- reload)
- echo "Message bus can't reload its configuration, you have to restart it"
- RETVAL=$?
- ;;
- *)
- echo $"Usage: $0 {start|stop|status|restart|reload}"
- ;;
-esac
-exit $RETVAL
diff --git a/src/3rd_party/dbus-1.7.8/bus/selinux.c b/src/3rd_party/dbus-1.7.8/bus/selinux.c
deleted file mode 100644
index 768e55ef28..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/selinux.c
+++ /dev/null
@@ -1,1092 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
- * selinux.c SELinux security checks for D-Bus
- *
- * Author: Matthew Rickard <mjricka@epoch.ncsc.mil>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-string.h>
-#ifndef DBUS_WIN
-#include <dbus/dbus-userdb.h>
-#endif
-#include "selinux.h"
-#include "services.h"
-#include "policy.h"
-#include "utils.h"
-#include "config-parser.h"
-
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_SELINUX
-#include <sys/types.h>
-#include <unistd.h>
-#include <limits.h>
-#include <pthread.h>
-#include <syslog.h>
-#include <selinux/selinux.h>
-#include <selinux/avc.h>
-#include <selinux/av_permissions.h>
-#include <selinux/flask.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <grp.h>
-#endif /* HAVE_SELINUX */
-#ifdef HAVE_LIBAUDIT
-#include <cap-ng.h>
-#include <libaudit.h>
-#endif /* HAVE_LIBAUDIT */
-
-#define BUS_SID_FROM_SELINUX(sid) ((BusSELinuxID*) (sid))
-#define SELINUX_SID_FROM_BUS(sid) ((security_id_t) (sid))
-
-#ifdef HAVE_SELINUX
-/* Store the value telling us if SELinux is enabled in the kernel. */
-static dbus_bool_t selinux_enabled = FALSE;
-
-/* Store an avc_entry_ref to speed AVC decisions. */
-static struct avc_entry_ref aeref;
-
-/* Store the SID of the bus itself to use as the default. */
-static security_id_t bus_sid = SECSID_WILD;
-
-/* Thread to listen for SELinux status changes via netlink. */
-static pthread_t avc_notify_thread;
-
-/* Prototypes for AVC callback functions. */
-static void log_callback (const char *fmt, ...);
-static void log_audit_callback (void *data, security_class_t class, char *buf, size_t bufleft);
-static void *avc_create_thread (void (*run) (void));
-static void avc_stop_thread (void *thread);
-static void *avc_alloc_lock (void);
-static void avc_get_lock (void *lock);
-static void avc_release_lock (void *lock);
-static void avc_free_lock (void *lock);
-
-/* AVC callback structures for use in avc_init. */
-static const struct avc_memory_callback mem_cb =
-{
- .func_malloc = dbus_malloc,
- .func_free = dbus_free
-};
-static const struct avc_log_callback log_cb =
-{
- .func_log = log_callback,
- .func_audit = log_audit_callback
-};
-static const struct avc_thread_callback thread_cb =
-{
- .func_create_thread = avc_create_thread,
- .func_stop_thread = avc_stop_thread
-};
-static const struct avc_lock_callback lock_cb =
-{
- .func_alloc_lock = avc_alloc_lock,
- .func_get_lock = avc_get_lock,
- .func_release_lock = avc_release_lock,
- .func_free_lock = avc_free_lock
-};
-#endif /* HAVE_SELINUX */
-
-/**
- * Log callback to log denial messages from the AVC.
- * This is used in avc_init. Logs to both standard
- * error and syslogd.
- *
- * @param fmt the format string
- * @param variable argument list
- */
-#ifdef HAVE_SELINUX
-
-#ifdef HAVE_LIBAUDIT
-static int audit_fd = -1;
-#endif
-
-void
-bus_selinux_audit_init(void)
-{
-#ifdef HAVE_LIBAUDIT
- audit_fd = audit_open ();
-
- if (audit_fd < 0)
- {
- /* If kernel doesn't support audit, bail out */
- if (errno == EINVAL || errno == EPROTONOSUPPORT || errno == EAFNOSUPPORT)
- return;
- /* If user bus, bail out */
- if (errno == EPERM && getuid() != 0)
- return;
- _dbus_warn ("Failed opening connection to the audit subsystem");
- }
-#endif /* HAVE_LIBAUDIT */
-}
-
-static void
-log_callback (const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
-
-#ifdef HAVE_LIBAUDIT
- if (audit_fd >= 0)
- {
- capng_get_caps_process();
- if (capng_have_capability(CAPNG_EFFECTIVE, CAP_AUDIT_WRITE))
- {
- char buf[PATH_MAX*2];
-
- /* FIXME: need to change this to show real user */
- vsnprintf(buf, sizeof(buf), fmt, ap);
- audit_log_user_avc_message(audit_fd, AUDIT_USER_AVC, buf, NULL, NULL,
- NULL, getuid());
- return;
- }
- }
-#endif /* HAVE_LIBAUDIT */
-
- vsyslog (LOG_USER | LOG_INFO, fmt, ap);
- va_end(ap);
-}
-
-/**
- * On a policy reload we need to reparse the SELinux configuration file, since
- * this could have changed. Send a SIGHUP to reload all configs.
- */
-static int
-policy_reload_callback (u_int32_t event, security_id_t ssid,
- security_id_t tsid, security_class_t tclass,
- access_vector_t perms, access_vector_t *out_retained)
-{
- if (event == AVC_CALLBACK_RESET)
- return raise (SIGHUP);
-
- return 0;
-}
-
-/**
- * Log any auxiliary data
- */
-static void
-log_audit_callback (void *data, security_class_t class, char *buf, size_t bufleft)
-{
- DBusString *audmsg = data;
-
- if (bufleft > (size_t) _dbus_string_get_length(audmsg))
- {
- _dbus_string_copy_to_buffer_with_nul (audmsg, buf, bufleft);
- }
- else
- {
- DBusString s;
-
- _dbus_string_init_const(&s, "Buffer too small for audit message");
-
- if (bufleft > (size_t) _dbus_string_get_length(&s))
- _dbus_string_copy_to_buffer_with_nul (&s, buf, bufleft);
- }
-}
-
-/**
- * Create thread to notify the AVC of enforcing and policy reload
- * changes via netlink.
- *
- * @param run the thread run function
- * @return pointer to the thread
- */
-static void *
-avc_create_thread (void (*run) (void))
-{
- int rc;
-
- rc = pthread_create (&avc_notify_thread, NULL, (void *(*) (void *)) run, NULL);
- if (rc != 0)
- {
- _dbus_warn ("Failed to start AVC thread: %s\n", _dbus_strerror (rc));
- exit (1);
- }
- return &avc_notify_thread;
-}
-
-/* Stop AVC netlink thread. */
-static void
-avc_stop_thread (void *thread)
-{
- pthread_cancel (*(pthread_t *) thread);
-}
-
-/* Allocate a new AVC lock. */
-static void *
-avc_alloc_lock (void)
-{
- pthread_mutex_t *avc_mutex;
-
- avc_mutex = dbus_new (pthread_mutex_t, 1);
- if (avc_mutex == NULL)
- {
- _dbus_warn ("Could not create mutex: %s\n", _dbus_strerror (errno));
- exit (1);
- }
- pthread_mutex_init (avc_mutex, NULL);
-
- return avc_mutex;
-}
-
-/* Acquire an AVC lock. */
-static void
-avc_get_lock (void *lock)
-{
- pthread_mutex_lock (lock);
-}
-
-/* Release an AVC lock. */
-static void
-avc_release_lock (void *lock)
-{
- pthread_mutex_unlock (lock);
-}
-
-/* Free an AVC lock. */
-static void
-avc_free_lock (void *lock)
-{
- pthread_mutex_destroy (lock);
- dbus_free (lock);
-}
-#endif /* HAVE_SELINUX */
-
-/**
- * Return whether or not SELinux is enabled; must be
- * called after bus_selinux_init.
- */
-dbus_bool_t
-bus_selinux_enabled (void)
-{
-#ifdef HAVE_SELINUX
- return selinux_enabled;
-#else
- return FALSE;
-#endif /* HAVE_SELINUX */
-}
-
-/**
- * Do early initialization; determine whether SELinux is enabled.
- */
-dbus_bool_t
-bus_selinux_pre_init (void)
-{
-#ifdef HAVE_SELINUX
- int r;
- _dbus_assert (bus_sid == SECSID_WILD);
-
- /* Determine if we are running an SELinux kernel. */
- r = is_selinux_enabled ();
- if (r < 0)
- {
- _dbus_warn ("Could not tell if SELinux is enabled: %s\n",
- _dbus_strerror (errno));
- return FALSE;
- }
-
- selinux_enabled = r != 0;
- return TRUE;
-#else
- return TRUE;
-#endif
-}
-
-/**
- * Initialize the user space access vector cache (AVC) for D-Bus and set up
- * logging callbacks.
- */
-dbus_bool_t
-bus_selinux_full_init (void)
-{
-#ifdef HAVE_SELINUX
- char *bus_context;
-
- _dbus_assert (bus_sid == SECSID_WILD);
-
- if (!selinux_enabled)
- {
- _dbus_verbose ("SELinux not enabled in this kernel.\n");
- return TRUE;
- }
-
- _dbus_verbose ("SELinux is enabled in this kernel.\n");
-
- avc_entry_ref_init (&aeref);
- if (avc_init ("avc", &mem_cb, &log_cb, &thread_cb, &lock_cb) < 0)
- {
- _dbus_warn ("Failed to start Access Vector Cache (AVC).\n");
- return FALSE;
- }
- else
- {
- _dbus_verbose ("Access Vector Cache (AVC) started.\n");
- }
-
- if (avc_add_callback (policy_reload_callback, AVC_CALLBACK_RESET,
- NULL, NULL, 0, 0) < 0)
- {
- _dbus_warn ("Failed to add policy reload callback: %s\n",
- _dbus_strerror (errno));
- avc_destroy ();
- return FALSE;
- }
-
- bus_context = NULL;
- bus_sid = SECSID_WILD;
-
- if (getcon (&bus_context) < 0)
- {
- _dbus_verbose ("Error getting context of bus: %s\n",
- _dbus_strerror (errno));
- return FALSE;
- }
-
- if (avc_context_to_sid (bus_context, &bus_sid) < 0)
- {
- _dbus_verbose ("Error getting SID from bus context: %s\n",
- _dbus_strerror (errno));
- freecon (bus_context);
- return FALSE;
- }
-
- freecon (bus_context);
-
-#endif /* HAVE_SELINUX */
- return TRUE;
-}
-
-/**
- * Decrement SID reference count.
- *
- * @param sid the SID to decrement
- */
-void
-bus_selinux_id_unref (BusSELinuxID *sid)
-{
-#ifdef HAVE_SELINUX
- if (!selinux_enabled)
- return;
-
- _dbus_assert (sid != NULL);
-
- sidput (SELINUX_SID_FROM_BUS (sid));
-#endif /* HAVE_SELINUX */
-}
-
-void
-bus_selinux_id_ref (BusSELinuxID *sid)
-{
-#ifdef HAVE_SELINUX
- if (!selinux_enabled)
- return;
-
- _dbus_assert (sid != NULL);
-
- sidget (SELINUX_SID_FROM_BUS (sid));
-#endif /* HAVE_SELINUX */
-}
-
-/**
- * Determine if the SELinux security policy allows the given sender
- * security context to go to the given recipient security context.
- * This function determines if the requested permissions are to be
- * granted from the connection to the message bus or to another
- * optionally supplied security identifier (e.g. for a service
- * context). Currently these permissions are either send_msg or
- * acquire_svc in the dbus class.
- *
- * @param sender_sid source security context
- * @param override_sid is the target security context. If SECSID_WILD this will
- * use the context of the bus itself (e.g. the default).
- * @param target_class is the target security class.
- * @param requested is the requested permissions.
- * @returns #TRUE if security policy allows the send.
- */
-#ifdef HAVE_SELINUX
-static dbus_bool_t
-bus_selinux_check (BusSELinuxID *sender_sid,
- BusSELinuxID *override_sid,
- security_class_t target_class,
- access_vector_t requested,
- DBusString *auxdata)
-{
- if (!selinux_enabled)
- return TRUE;
-
- /* Make the security check. AVC checks enforcing mode here as well. */
- if (avc_has_perm (SELINUX_SID_FROM_BUS (sender_sid),
- override_sid ?
- SELINUX_SID_FROM_BUS (override_sid) :
- SELINUX_SID_FROM_BUS (bus_sid),
- target_class, requested, &aeref, auxdata) < 0)
- {
- switch (errno)
- {
- case EACCES:
- _dbus_verbose ("SELinux denying due to security policy.\n");
- return FALSE;
- case EINVAL:
- _dbus_verbose ("SELinux denying due to invalid security context.\n");
- return FALSE;
- default:
- _dbus_verbose ("SELinux denying due to: %s\n", _dbus_strerror (errno));
- return FALSE;
- }
- }
- else
- return TRUE;
-}
-#endif /* HAVE_SELINUX */
-
-/**
- * Returns true if the given connection can acquire a service,
- * assuming the given security ID is needed for that service.
- *
- * @param connection connection that wants to own the service
- * @param service_sid the SID of the service from the table
- * @returns #TRUE if acquire is permitted.
- */
-dbus_bool_t
-bus_selinux_allows_acquire_service (DBusConnection *connection,
- BusSELinuxID *service_sid,
- const char *service_name,
- DBusError *error)
-{
-#ifdef HAVE_SELINUX
- BusSELinuxID *connection_sid;
- unsigned long spid;
- DBusString auxdata;
- dbus_bool_t ret;
-
- if (!selinux_enabled)
- return TRUE;
-
- connection_sid = bus_connection_get_selinux_id (connection);
- if (!dbus_connection_get_unix_process_id (connection, &spid))
- spid = 0;
-
- if (!_dbus_string_init (&auxdata))
- goto oom;
-
- if (!_dbus_string_append (&auxdata, "service="))
- goto oom;
-
- if (!_dbus_string_append (&auxdata, service_name))
- goto oom;
-
- if (spid)
- {
- if (!_dbus_string_append (&auxdata, " spid="))
- goto oom;
-
- if (!_dbus_string_append_uint (&auxdata, spid))
- goto oom;
- }
-
- ret = bus_selinux_check (connection_sid,
- service_sid,
- SECCLASS_DBUS,
- DBUS__ACQUIRE_SVC,
- &auxdata);
-
- _dbus_string_free (&auxdata);
- return ret;
-
- oom:
- _dbus_string_free (&auxdata);
- BUS_SET_OOM (error);
- return FALSE;
-
-#else
- return TRUE;
-#endif /* HAVE_SELINUX */
-}
-
-/**
- * Check if SELinux security controls allow the message to be sent to a
- * particular connection based on the security context of the sender and
- * that of the receiver. The destination connection need not be the
- * addressed recipient, it could be an "eavesdropper"
- *
- * @param sender the sender of the message.
- * @param proposed_recipient the connection the message is to be sent to.
- * @returns whether to allow the send
- */
-dbus_bool_t
-bus_selinux_allows_send (DBusConnection *sender,
- DBusConnection *proposed_recipient,
- const char *msgtype,
- const char *interface,
- const char *member,
- const char *error_name,
- const char *destination,
- DBusError *error)
-{
-#ifdef HAVE_SELINUX
- BusSELinuxID *recipient_sid;
- BusSELinuxID *sender_sid;
- unsigned long spid, tpid;
- DBusString auxdata;
- dbus_bool_t ret;
- dbus_bool_t string_alloced;
-
- if (!selinux_enabled)
- return TRUE;
-
- if (!sender || !dbus_connection_get_unix_process_id (sender, &spid))
- spid = 0;
- if (!proposed_recipient || !dbus_connection_get_unix_process_id (proposed_recipient, &tpid))
- tpid = 0;
-
- string_alloced = FALSE;
- if (!_dbus_string_init (&auxdata))
- goto oom;
- string_alloced = TRUE;
-
- if (!_dbus_string_append (&auxdata, "msgtype="))
- goto oom;
-
- if (!_dbus_string_append (&auxdata, msgtype))
- goto oom;
-
- if (interface)
- {
- if (!_dbus_string_append (&auxdata, " interface="))
- goto oom;
- if (!_dbus_string_append (&auxdata, interface))
- goto oom;
- }
-
- if (member)
- {
- if (!_dbus_string_append (&auxdata, " member="))
- goto oom;
- if (!_dbus_string_append (&auxdata, member))
- goto oom;
- }
-
- if (error_name)
- {
- if (!_dbus_string_append (&auxdata, " error_name="))
- goto oom;
- if (!_dbus_string_append (&auxdata, error_name))
- goto oom;
- }
-
- if (destination)
- {
- if (!_dbus_string_append (&auxdata, " dest="))
- goto oom;
- if (!_dbus_string_append (&auxdata, destination))
- goto oom;
- }
-
- if (spid)
- {
- if (!_dbus_string_append (&auxdata, " spid="))
- goto oom;
-
- if (!_dbus_string_append_uint (&auxdata, spid))
- goto oom;
- }
-
- if (tpid)
- {
- if (!_dbus_string_append (&auxdata, " tpid="))
- goto oom;
-
- if (!_dbus_string_append_uint (&auxdata, tpid))
- goto oom;
- }
-
- sender_sid = bus_connection_get_selinux_id (sender);
- /* A NULL proposed_recipient means the bus itself. */
- if (proposed_recipient)
- recipient_sid = bus_connection_get_selinux_id (proposed_recipient);
- else
- recipient_sid = BUS_SID_FROM_SELINUX (bus_sid);
-
- ret = bus_selinux_check (sender_sid,
- recipient_sid,
- SECCLASS_DBUS,
- DBUS__SEND_MSG,
- &auxdata);
-
- _dbus_string_free (&auxdata);
-
- return ret;
-
- oom:
- if (string_alloced)
- _dbus_string_free (&auxdata);
- BUS_SET_OOM (error);
- return FALSE;
-
-#else
- return TRUE;
-#endif /* HAVE_SELINUX */
-}
-
-dbus_bool_t
-bus_selinux_append_context (DBusMessage *message,
- BusSELinuxID *sid,
- DBusError *error)
-{
-#ifdef HAVE_SELINUX
- char *context;
-
- if (avc_sid_to_context (SELINUX_SID_FROM_BUS (sid), &context) < 0)
- {
- if (errno == ENOMEM)
- BUS_SET_OOM (error);
- else
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Error getting context from SID: %s\n",
- _dbus_strerror (errno));
- return FALSE;
- }
- if (!dbus_message_append_args (message,
- DBUS_TYPE_ARRAY,
- DBUS_TYPE_BYTE,
- &context,
- strlen (context),
- DBUS_TYPE_INVALID))
- {
- _DBUS_SET_OOM (error);
- return FALSE;
- }
- freecon (context);
- return TRUE;
-#else
- return TRUE;
-#endif
-}
-
-/**
- * Gets the security context of a connection to the bus. It is up to
- * the caller to freecon() when they are done.
- *
- * @param connection the connection to get the context of.
- * @param con the location to store the security context.
- * @returns #TRUE if context is successfully obtained.
- */
-#ifdef HAVE_SELINUX
-static dbus_bool_t
-bus_connection_read_selinux_context (DBusConnection *connection,
- char **con)
-{
- int fd;
-
- if (!selinux_enabled)
- return FALSE;
-
- _dbus_assert (connection != NULL);
-
- if (!dbus_connection_get_unix_fd (connection, &fd))
- {
- _dbus_verbose ("Failed to get file descriptor of socket.\n");
- return FALSE;
- }
-
- if (getpeercon (fd, con) < 0)
- {
- _dbus_verbose ("Error getting context of socket peer: %s\n",
- _dbus_strerror (errno));
- return FALSE;
- }
-
- _dbus_verbose ("Successfully read connection context.\n");
- return TRUE;
-}
-#endif /* HAVE_SELINUX */
-
-/**
- * Read the SELinux ID from the connection.
- *
- * @param connection the connection to read from
- * @returns the SID if successfully determined, #NULL otherwise.
- */
-BusSELinuxID*
-bus_selinux_init_connection_id (DBusConnection *connection,
- DBusError *error)
-{
-#ifdef HAVE_SELINUX
- char *con;
- security_id_t sid;
-
- if (!selinux_enabled)
- return NULL;
-
- if (!bus_connection_read_selinux_context (connection, &con))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Failed to read an SELinux context from connection");
- _dbus_verbose ("Error getting peer context.\n");
- return NULL;
- }
-
- _dbus_verbose ("Converting context to SID to store on connection\n");
-
- if (avc_context_to_sid (con, &sid) < 0)
- {
- if (errno == ENOMEM)
- BUS_SET_OOM (error);
- else
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Error getting SID from context \"%s\": %s\n",
- con, _dbus_strerror (errno));
-
- _dbus_warn ("Error getting SID from context \"%s\": %s\n",
- con, _dbus_strerror (errno));
-
- freecon (con);
- return NULL;
- }
-
- freecon (con);
- return BUS_SID_FROM_SELINUX (sid);
-#else
- return NULL;
-#endif /* HAVE_SELINUX */
-}
-
-
-/**
- * Function for freeing hash table data. These SIDs
- * should no longer be referenced.
- */
-static void
-bus_selinux_id_table_free_value (BusSELinuxID *sid)
-{
-#ifdef HAVE_SELINUX
- /* NULL sometimes due to how DBusHashTable works */
- if (sid)
- bus_selinux_id_unref (sid);
-#endif /* HAVE_SELINUX */
-}
-
-/**
- * Creates a new table mapping service names to security ID.
- * A security ID is a "compiled" security context, a security
- * context is just a string.
- *
- * @returns the new table or #NULL if no memory
- */
-DBusHashTable*
-bus_selinux_id_table_new (void)
-{
- return _dbus_hash_table_new (DBUS_HASH_STRING,
- (DBusFreeFunction) dbus_free,
- (DBusFreeFunction) bus_selinux_id_table_free_value);
-}
-
-/**
- * Hashes a service name and service context into the service SID
- * table as a string and a SID.
- *
- * @param service_name is the name of the service.
- * @param service_context is the context of the service.
- * @param service_table is the table to hash them into.
- * @return #FALSE if not enough memory
- */
-dbus_bool_t
-bus_selinux_id_table_insert (DBusHashTable *service_table,
- const char *service_name,
- const char *service_context)
-{
-#ifdef HAVE_SELINUX
- dbus_bool_t retval;
- security_id_t sid;
- char *key;
-
- if (!selinux_enabled)
- return TRUE;
-
- sid = SECSID_WILD;
- retval = FALSE;
-
- key = _dbus_strdup (service_name);
- if (key == NULL)
- return retval;
-
- if (avc_context_to_sid ((char *) service_context, &sid) < 0)
- {
- if (errno == ENOMEM)
- {
- dbus_free (key);
- return FALSE;
- }
-
- _dbus_warn ("Error getting SID from context \"%s\": %s\n",
- (char *) service_context,
- _dbus_strerror (errno));
- goto out;
- }
-
- if (!_dbus_hash_table_insert_string (service_table,
- key,
- BUS_SID_FROM_SELINUX (sid)))
- goto out;
-
- _dbus_verbose ("Parsed \tservice: %s \n\t\tcontext: %s\n",
- key,
- sid->ctx);
-
- /* These are owned by the hash, so clear them to avoid unref */
- key = NULL;
- sid = SECSID_WILD;
-
- retval = TRUE;
-
- out:
- if (sid != SECSID_WILD)
- sidput (sid);
-
- if (key)
- dbus_free (key);
-
- return retval;
-#else
- return TRUE;
-#endif /* HAVE_SELINUX */
-}
-
-
-/**
- * Find the security identifier associated with a particular service
- * name. Return a pointer to this SID, or #NULL/SECSID_WILD if the
- * service is not found in the hash table. This should be nearly a
- * constant time operation. If SELinux support is not available,
- * always return NULL.
- *
- * @param service_table the hash table to check for service name.
- * @param service_name the name of the service to look for.
- * @returns the SELinux ID associated with the service
- */
-BusSELinuxID*
-bus_selinux_id_table_lookup (DBusHashTable *service_table,
- const DBusString *service_name)
-{
-#ifdef HAVE_SELINUX
- security_id_t sid;
-
- sid = SECSID_WILD; /* default context */
-
- if (!selinux_enabled)
- return NULL;
-
- _dbus_verbose ("Looking up service SID for %s\n",
- _dbus_string_get_const_data (service_name));
-
- sid = _dbus_hash_table_lookup_string (service_table,
- _dbus_string_get_const_data (service_name));
-
- if (sid == SECSID_WILD)
- _dbus_verbose ("Service %s not found\n",
- _dbus_string_get_const_data (service_name));
- else
- _dbus_verbose ("Service %s found\n",
- _dbus_string_get_const_data (service_name));
-
- return BUS_SID_FROM_SELINUX (sid);
-#endif /* HAVE_SELINUX */
- return NULL;
-}
-
-/**
- * Get the SELinux policy root. This is used to find the D-Bus
- * specific config file within the policy.
- */
-const char *
-bus_selinux_get_policy_root (void)
-{
-#ifdef HAVE_SELINUX
- return selinux_policy_root ();
-#else
- return NULL;
-#endif /* HAVE_SELINUX */
-}
-
-/**
- * For debugging: Print out the current hash table of service SIDs.
- */
-void
-bus_selinux_id_table_print (DBusHashTable *service_table)
-{
-#if defined (DBUS_ENABLE_VERBOSE_MODE) && defined (HAVE_SELINUX)
- DBusHashIter iter;
-
- if (!selinux_enabled)
- return;
-
- _dbus_verbose ("Service SID Table:\n");
- _dbus_hash_iter_init (service_table, &iter);
- while (_dbus_hash_iter_next (&iter))
- {
- const char *key = _dbus_hash_iter_get_string_key (&iter);
- security_id_t sid = _dbus_hash_iter_get_value (&iter);
- _dbus_verbose ("The key is %s\n", key);
- _dbus_verbose ("The context is %s\n", sid->ctx);
- _dbus_verbose ("The refcount is %d\n", sid->refcnt);
- }
-#endif /* DBUS_ENABLE_VERBOSE_MODE && HAVE_SELINUX */
-}
-
-
-/**
- * Print out some AVC statistics.
- */
-#ifdef HAVE_SELINUX
-static void
-bus_avc_print_stats (void)
-{
-#ifdef DBUS_ENABLE_VERBOSE_MODE
- struct avc_cache_stats cstats;
-
- if (!selinux_enabled)
- return;
-
- _dbus_verbose ("AVC Statistics:\n");
- avc_cache_stats (&cstats);
- avc_av_stats ();
- _dbus_verbose ("AVC Cache Statistics:\n");
- _dbus_verbose ("Entry lookups: %d\n", cstats.entry_lookups);
- _dbus_verbose ("Entry hits: %d\n", cstats.entry_hits);
- _dbus_verbose ("Entry misses %d\n", cstats.entry_misses);
- _dbus_verbose ("Entry discards: %d\n", cstats.entry_discards);
- _dbus_verbose ("CAV lookups: %d\n", cstats.cav_lookups);
- _dbus_verbose ("CAV hits: %d\n", cstats.cav_hits);
- _dbus_verbose ("CAV probes: %d\n", cstats.cav_probes);
- _dbus_verbose ("CAV misses: %d\n", cstats.cav_misses);
-#endif /* DBUS_ENABLE_VERBOSE_MODE */
-}
-#endif /* HAVE_SELINUX */
-
-/**
- * Destroy the AVC before we terminate.
- */
-void
-bus_selinux_shutdown (void)
-{
-#ifdef HAVE_SELINUX
- if (!selinux_enabled)
- return;
-
- _dbus_verbose ("AVC shutdown\n");
-
- if (bus_sid != SECSID_WILD)
- {
- sidput (bus_sid);
- bus_sid = SECSID_WILD;
-
- bus_avc_print_stats ();
-
- avc_destroy ();
-#ifdef HAVE_LIBAUDIT
- audit_close (audit_fd);
-#endif /* HAVE_LIBAUDIT */
- }
-#endif /* HAVE_SELINUX */
-}
-
-/* The !HAVE_LIBAUDIT case lives in dbus-sysdeps-util-unix.c */
-#ifdef HAVE_LIBAUDIT
-/**
- * Changes the user and group the bus is running as.
- *
- * @param user the user to become
- * @param error return location for errors
- * @returns #FALSE on failure
- */
-dbus_bool_t
-_dbus_change_to_daemon_user (const char *user,
- DBusError *error)
-{
- dbus_uid_t uid;
- dbus_gid_t gid;
- DBusString u;
-
- _dbus_string_init_const (&u, user);
-
- if (!_dbus_get_user_id_and_primary_group (&u, &uid, &gid))
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "User '%s' does not appear to exist?",
- user);
- return FALSE;
- }
-
- /* If we were root */
- if (_dbus_geteuid () == 0)
- {
- int rc;
- int have_audit_write;
-
- have_audit_write = capng_have_capability (CAPNG_PERMITTED, CAP_AUDIT_WRITE);
- capng_clear (CAPNG_SELECT_BOTH);
- /* Only attempt to retain CAP_AUDIT_WRITE if we had it when
- * starting. See:
- * https://bugs.freedesktop.org/show_bug.cgi?id=49062#c9
- */
- if (have_audit_write)
- capng_update (CAPNG_ADD, CAPNG_EFFECTIVE | CAPNG_PERMITTED,
- CAP_AUDIT_WRITE);
- rc = capng_change_id (uid, gid, CAPNG_DROP_SUPP_GRP);
- if (rc)
- {
- switch (rc) {
- default:
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Failed to drop capabilities: %s\n",
- _dbus_strerror (errno));
- break;
- case -4:
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to set GID to %lu: %s", gid,
- _dbus_strerror (errno));
- break;
- case -5:
- _dbus_warn ("Failed to drop supplementary groups: %s\n",
- _dbus_strerror (errno));
- break;
- case -6:
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to set UID to %lu: %s", uid,
- _dbus_strerror (errno));
- break;
- case -7:
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to unset keep-capabilities: %s\n",
- _dbus_strerror (errno));
- break;
- }
- return FALSE;
- }
- }
-
- return TRUE;
-}
-#endif
diff --git a/src/3rd_party/dbus-1.7.8/bus/selinux.h b/src/3rd_party/dbus-1.7.8/bus/selinux.h
deleted file mode 100644
index 3bab36de48..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/selinux.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* selinux.h SELinux security check headers for D-BUS
- *
- * Author: Matthew Rickard <mjricka@epoch.ncsc.mil>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_SELINUX_H
-#define BUS_SELINUX_H
-
-#include <dbus/dbus-hash.h>
-#include <dbus/dbus-connection.h>
-#include "services.h"
-
-dbus_bool_t bus_selinux_pre_init (void);
-dbus_bool_t bus_selinux_full_init(void);
-void bus_selinux_shutdown (void);
-
-dbus_bool_t bus_selinux_enabled (void);
-
-void bus_selinux_id_ref (BusSELinuxID *sid);
-void bus_selinux_id_unref (BusSELinuxID *sid);
-
-DBusHashTable* bus_selinux_id_table_new (void);
-BusSELinuxID* bus_selinux_id_table_lookup (DBusHashTable *service_table,
- const DBusString *service_name);
-dbus_bool_t bus_selinux_id_table_insert (DBusHashTable *service_table,
- const char *service_name,
- const char *service_context);
-void bus_selinux_id_table_print (DBusHashTable *service_table);
-const char* bus_selinux_get_policy_root (void);
-
-dbus_bool_t bus_selinux_append_context (DBusMessage *message,
- BusSELinuxID *context,
- DBusError *error);
-
-dbus_bool_t bus_selinux_allows_acquire_service (DBusConnection *connection,
- BusSELinuxID *service_sid,
- const char *service_name,
- DBusError *error);
-
-dbus_bool_t bus_selinux_allows_send (DBusConnection *sender,
- DBusConnection *proposed_recipient,
- const char *msgtype, /* Supplementary audit data */
- const char *interface,
- const char *member,
- const char *error_name,
- const char *destination,
- DBusError *error);
-
-BusSELinuxID* bus_selinux_init_connection_id (DBusConnection *connection,
- DBusError *error);
-
-
-void bus_selinux_audit_init(void);
-
-#endif /* BUS_SELINUX_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/services.c b/src/3rd_party/dbus-1.7.8/bus/services.c
deleted file mode 100644
index 6f380fac7d..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/services.c
+++ /dev/null
@@ -1,1304 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* services.c Service management
- *
- * Copyright (C) 2003 Red Hat, Inc.
- * Copyright (C) 2003 CodeFactory AB
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include <dbus/dbus-hash.h>
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-mempool.h>
-#include <dbus/dbus-marshal-validate.h>
-
-#include "driver.h"
-#include "services.h"
-#include "connection.h"
-#include "utils.h"
-#include "activation.h"
-#include "policy.h"
-#include "bus.h"
-#include "selinux.h"
-
-struct BusService
-{
- int refcount;
-
- BusRegistry *registry;
- char *name;
- DBusList *owners;
-};
-
-struct BusOwner
-{
- int refcount;
-
- BusService *service;
- DBusConnection *conn;
-
- unsigned int allow_replacement : 1;
- unsigned int do_not_queue : 1;
-};
-
-struct BusRegistry
-{
- int refcount;
-
- BusContext *context;
-
- DBusHashTable *service_hash;
- DBusMemPool *service_pool;
- DBusMemPool *owner_pool;
-
- DBusHashTable *service_sid_table;
-};
-
-BusRegistry*
-bus_registry_new (BusContext *context)
-{
- BusRegistry *registry;
-
- registry = dbus_new0 (BusRegistry, 1);
- if (registry == NULL)
- return NULL;
-
- registry->refcount = 1;
- registry->context = context;
-
- registry->service_hash = _dbus_hash_table_new (DBUS_HASH_STRING,
- NULL, NULL);
- if (registry->service_hash == NULL)
- goto failed;
-
- registry->service_pool = _dbus_mem_pool_new (sizeof (BusService),
- TRUE);
-
- if (registry->service_pool == NULL)
- goto failed;
-
- registry->owner_pool = _dbus_mem_pool_new (sizeof (BusOwner),
- TRUE);
-
- if (registry->owner_pool == NULL)
- goto failed;
-
- registry->service_sid_table = NULL;
-
- return registry;
-
- failed:
- bus_registry_unref (registry);
- return NULL;
-}
-
-BusRegistry *
-bus_registry_ref (BusRegistry *registry)
-{
- _dbus_assert (registry->refcount > 0);
- registry->refcount += 1;
-
- return registry;
-}
-
-void
-bus_registry_unref (BusRegistry *registry)
-{
- _dbus_assert (registry->refcount > 0);
- registry->refcount -= 1;
-
- if (registry->refcount == 0)
- {
- if (registry->service_hash)
- _dbus_hash_table_unref (registry->service_hash);
- if (registry->service_pool)
- _dbus_mem_pool_free (registry->service_pool);
- if (registry->owner_pool)
- _dbus_mem_pool_free (registry->owner_pool);
- if (registry->service_sid_table)
- _dbus_hash_table_unref (registry->service_sid_table);
-
- dbus_free (registry);
- }
-}
-
-BusService*
-bus_registry_lookup (BusRegistry *registry,
- const DBusString *service_name)
-{
- BusService *service;
-
- service = _dbus_hash_table_lookup_string (registry->service_hash,
- _dbus_string_get_const_data (service_name));
-
- return service;
-}
-
-static DBusList *
-_bus_service_find_owner_link (BusService *service,
- DBusConnection *connection)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (&service->owners);
-
- while (link != NULL)
- {
- BusOwner *bus_owner;
-
- bus_owner = (BusOwner *) link->data;
- if (bus_owner->conn == connection)
- break;
-
- link = _dbus_list_get_next_link (&service->owners, link);
- }
-
- return link;
-}
-
-static void
-bus_owner_set_flags (BusOwner *owner,
- dbus_uint32_t flags)
-{
- owner->allow_replacement =
- (flags & DBUS_NAME_FLAG_ALLOW_REPLACEMENT) != FALSE;
-
- owner->do_not_queue =
- (flags & DBUS_NAME_FLAG_DO_NOT_QUEUE) != FALSE;
-}
-
-static BusOwner *
-bus_owner_new (BusService *service,
- DBusConnection *conn,
- dbus_uint32_t flags)
-{
- BusOwner *result;
-
- result = _dbus_mem_pool_alloc (service->registry->owner_pool);
- if (result != NULL)
- {
- result->refcount = 1;
- /* don't ref the connection because we don't want
- to block the connection from going away.
- transactions take care of reffing the connection
- but we need to use refcounting on the owner
- so that the owner does not get freed before
- we can deref the connection in the transaction
- */
- result->conn = conn;
- result->service = service;
-
- if (!bus_connection_add_owned_service (conn, service))
- {
- _dbus_mem_pool_dealloc (service->registry->owner_pool, result);
- return NULL;
- }
-
- bus_owner_set_flags (result, flags);
- }
- return result;
-}
-
-static BusOwner *
-bus_owner_ref (BusOwner *owner)
-{
- _dbus_assert (owner->refcount > 0);
- owner->refcount += 1;
-
- return owner;
-}
-
-static void
-bus_owner_unref (BusOwner *owner)
-{
- _dbus_assert (owner->refcount > 0);
- owner->refcount -= 1;
-
- if (owner->refcount == 0)
- {
- bus_connection_remove_owned_service (owner->conn, owner->service);
- _dbus_mem_pool_dealloc (owner->service->registry->owner_pool, owner);
- }
-}
-
-BusService*
-bus_registry_ensure (BusRegistry *registry,
- const DBusString *service_name,
- DBusConnection *owner_connection_if_created,
- dbus_uint32_t flags,
- BusTransaction *transaction,
- DBusError *error)
-{
- BusService *service;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- _dbus_assert (owner_connection_if_created != NULL);
- _dbus_assert (transaction != NULL);
-
- service = _dbus_hash_table_lookup_string (registry->service_hash,
- _dbus_string_get_const_data (service_name));
- if (service != NULL)
- return service;
-
- service = _dbus_mem_pool_alloc (registry->service_pool);
- if (service == NULL)
- {
- BUS_SET_OOM (error);
- return NULL;
- }
-
- service->registry = registry;
- service->refcount = 1;
-
- _dbus_verbose ("copying string %p '%s' to service->name\n",
- service_name, _dbus_string_get_const_data (service_name));
- if (!_dbus_string_copy_data (service_name, &service->name))
- {
- _dbus_mem_pool_dealloc (registry->service_pool, service);
- BUS_SET_OOM (error);
- return NULL;
- }
- _dbus_verbose ("copied string %p '%s' to '%s'\n",
- service_name, _dbus_string_get_const_data (service_name),
- service->name);
-
- if (!bus_driver_send_service_owner_changed (service->name,
- NULL,
- bus_connection_get_name (owner_connection_if_created),
- transaction, error))
- {
- bus_service_unref (service);
- return NULL;
- }
-
- if (!bus_activation_service_created (bus_context_get_activation (registry->context),
- service->name, transaction, error))
- {
- bus_service_unref (service);
- return NULL;
- }
-
- if (!bus_service_add_owner (service, owner_connection_if_created, flags,
- transaction, error))
- {
- bus_service_unref (service);
- return NULL;
- }
-
- if (!_dbus_hash_table_insert_string (registry->service_hash,
- service->name,
- service))
- {
- /* The add_owner gets reverted on transaction cancel */
- BUS_SET_OOM (error);
- return NULL;
- }
-
- return service;
-}
-
-void
-bus_registry_foreach (BusRegistry *registry,
- BusServiceForeachFunction function,
- void *data)
-{
- DBusHashIter iter;
-
- _dbus_hash_iter_init (registry->service_hash, &iter);
- while (_dbus_hash_iter_next (&iter))
- {
- BusService *service = _dbus_hash_iter_get_value (&iter);
-
- (* function) (service, data);
- }
-}
-
-dbus_bool_t
-bus_registry_list_services (BusRegistry *registry,
- char ***listp,
- int *array_len)
-{
- int i, j, len;
- char **retval;
- DBusHashIter iter;
-
- len = _dbus_hash_table_get_n_entries (registry->service_hash);
- retval = dbus_new (char *, len + 1);
-
- if (retval == NULL)
- return FALSE;
-
- _dbus_hash_iter_init (registry->service_hash, &iter);
- i = 0;
- while (_dbus_hash_iter_next (&iter))
- {
- BusService *service = _dbus_hash_iter_get_value (&iter);
-
- retval[i] = _dbus_strdup (service->name);
- if (retval[i] == NULL)
- goto error;
-
- i++;
- }
-
- retval[i] = NULL;
-
- if (array_len)
- *array_len = len;
-
- *listp = retval;
- return TRUE;
-
- error:
- for (j = 0; j < i; j++)
- dbus_free (retval[i]);
- dbus_free (retval);
-
- return FALSE;
-}
-
-dbus_bool_t
-bus_registry_acquire_service (BusRegistry *registry,
- DBusConnection *connection,
- const DBusString *service_name,
- dbus_uint32_t flags,
- dbus_uint32_t *result,
- BusTransaction *transaction,
- DBusError *error)
-{
- dbus_bool_t retval;
- DBusConnection *old_owner_conn;
- BusClientPolicy *policy;
- BusService *service;
- BusActivation *activation;
- BusSELinuxID *sid;
- BusOwner *primary_owner;
-
- retval = FALSE;
-
- if (!_dbus_validate_bus_name (service_name, 0,
- _dbus_string_get_length (service_name)))
- {
- dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
- "Requested bus name \"%s\" is not valid",
- _dbus_string_get_const_data (service_name));
-
- _dbus_verbose ("Attempt to acquire invalid service name\n");
-
- goto out;
- }
-
- if (_dbus_string_get_byte (service_name, 0) == ':')
- {
- /* Not allowed; only base services can start with ':' */
- dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
- "Cannot acquire a service starting with ':' such as \"%s\"",
- _dbus_string_get_const_data (service_name));
-
- _dbus_verbose ("Attempt to acquire invalid base service name \"%s\"",
- _dbus_string_get_const_data (service_name));
-
- goto out;
- }
-
- if (_dbus_string_equal_c_str (service_name, DBUS_SERVICE_DBUS))
- {
- dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
- "Connection \"%s\" is not allowed to own the service \"%s\"because "
- "it is reserved for D-Bus' use only",
- bus_connection_is_active (connection) ?
- bus_connection_get_name (connection) :
- "(inactive)",
- DBUS_SERVICE_DBUS);
- goto out;
- }
-
- policy = bus_connection_get_policy (connection);
- _dbus_assert (policy != NULL);
-
- /* Note that if sid is #NULL then the bus's own context gets used
- * in bus_connection_selinux_allows_acquire_service()
- */
- sid = bus_selinux_id_table_lookup (registry->service_sid_table,
- service_name);
-
- if (!bus_selinux_allows_acquire_service (connection, sid,
- _dbus_string_get_const_data (service_name), error))
- {
-
- if (dbus_error_is_set (error) &&
- dbus_error_has_name (error, DBUS_ERROR_NO_MEMORY))
- {
- goto out;
- }
-
- dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
- "Connection \"%s\" is not allowed to own the service \"%s\" due "
- "to SELinux policy",
- bus_connection_is_active (connection) ?
- bus_connection_get_name (connection) :
- "(inactive)",
- _dbus_string_get_const_data (service_name));
- goto out;
- }
-
- if (!bus_client_policy_check_can_own (policy, service_name))
- {
- dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
- "Connection \"%s\" is not allowed to own the service \"%s\" due "
- "to security policies in the configuration file",
- bus_connection_is_active (connection) ?
- bus_connection_get_name (connection) :
- "(inactive)",
- _dbus_string_get_const_data (service_name));
- goto out;
- }
-
- if (bus_connection_get_n_services_owned (connection) >=
- bus_context_get_max_services_per_connection (registry->context))
- {
- dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
- "Connection \"%s\" is not allowed to own more services "
- "(increase limits in configuration file if required)",
- bus_connection_is_active (connection) ?
- bus_connection_get_name (connection) :
- "(inactive)");
- goto out;
- }
-
- service = bus_registry_lookup (registry, service_name);
-
- if (service != NULL)
- {
- primary_owner = bus_service_get_primary_owner (service);
- if (primary_owner != NULL)
- old_owner_conn = primary_owner->conn;
- else
- old_owner_conn = NULL;
- }
- else
- old_owner_conn = NULL;
-
- if (service == NULL)
- {
- service = bus_registry_ensure (registry,
- service_name, connection, flags,
- transaction, error);
- if (service == NULL)
- goto out;
- }
-
- primary_owner = bus_service_get_primary_owner (service);
- if (primary_owner == NULL)
- goto out;
-
- if (old_owner_conn == NULL)
- {
- _dbus_assert (primary_owner->conn == connection);
-
- *result = DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER;
- }
- else if (old_owner_conn == connection)
- {
- bus_owner_set_flags (primary_owner, flags);
- *result = DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER;
- }
- else if (((flags & DBUS_NAME_FLAG_DO_NOT_QUEUE) &&
- !(bus_service_get_allow_replacement (service))) ||
- ((flags & DBUS_NAME_FLAG_DO_NOT_QUEUE) &&
- !(flags & DBUS_NAME_FLAG_REPLACE_EXISTING)))
- {
- DBusList *link;
- BusOwner *temp_owner;
- /* Since we can't be queued if we are already in the queue
- remove us */
-
- link = _bus_service_find_owner_link (service, connection);
- if (link != NULL)
- {
- _dbus_list_unlink (&service->owners, link);
- temp_owner = (BusOwner *)link->data;
- bus_owner_unref (temp_owner);
- _dbus_list_free_link (link);
- }
-
- *result = DBUS_REQUEST_NAME_REPLY_EXISTS;
- }
- else if (!(flags & DBUS_NAME_FLAG_DO_NOT_QUEUE) &&
- (!(flags & DBUS_NAME_FLAG_REPLACE_EXISTING) ||
- !(bus_service_get_allow_replacement (service))))
- {
- /* Queue the connection */
- if (!bus_service_add_owner (service, connection,
- flags,
- transaction, error))
- goto out;
-
- *result = DBUS_REQUEST_NAME_REPLY_IN_QUEUE;
- }
- else
- {
- /* Replace the current owner */
-
- /* We enqueue the new owner and remove the first one because
- * that will cause NameAcquired and NameLost messages to
- * be sent.
- */
-
- if (!bus_service_add_owner (service, connection,
- flags,
- transaction, error))
- goto out;
-
- if (primary_owner->do_not_queue)
- {
- if (!bus_service_remove_owner (service, old_owner_conn,
- transaction, error))
- goto out;
- }
- else
- {
- if (!bus_service_swap_owner (service, old_owner_conn,
- transaction, error))
- goto out;
- }
-
-
- _dbus_assert (connection == bus_service_get_primary_owner (service)->conn);
- *result = DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER;
- }
-
- activation = bus_context_get_activation (registry->context);
- retval = bus_activation_send_pending_auto_activation_messages (activation,
- service,
- transaction,
- error);
-
- out:
- return retval;
-}
-
-dbus_bool_t
-bus_registry_release_service (BusRegistry *registry,
- DBusConnection *connection,
- const DBusString *service_name,
- dbus_uint32_t *result,
- BusTransaction *transaction,
- DBusError *error)
-{
- dbus_bool_t retval;
- BusService *service;
-
- retval = FALSE;
-
- if (!_dbus_validate_bus_name (service_name, 0,
- _dbus_string_get_length (service_name)))
- {
- dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
- "Given bus name \"%s\" is not valid",
- _dbus_string_get_const_data (service_name));
-
- _dbus_verbose ("Attempt to release invalid service name\n");
-
- goto out;
- }
-
- if (_dbus_string_get_byte (service_name, 0) == ':')
- {
- /* Not allowed; the base service name cannot be created or released */
- dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
- "Cannot release a service starting with ':' such as \"%s\"",
- _dbus_string_get_const_data (service_name));
-
- _dbus_verbose ("Attempt to release invalid base service name \"%s\"",
- _dbus_string_get_const_data (service_name));
-
- goto out;
- }
-
- if (_dbus_string_equal_c_str (service_name, DBUS_SERVICE_DBUS))
- {
- /* Not allowed; the base service name cannot be created or released */
- dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
- "Cannot release the %s service because it is owned by the bus",
- DBUS_SERVICE_DBUS);
-
- _dbus_verbose ("Attempt to release service name \"%s\"",
- DBUS_SERVICE_DBUS);
-
- goto out;
- }
-
- service = bus_registry_lookup (registry, service_name);
-
- if (service == NULL)
- {
- *result = DBUS_RELEASE_NAME_REPLY_NON_EXISTENT;
- }
- else if (!bus_service_has_owner (service, connection))
- {
- *result = DBUS_RELEASE_NAME_REPLY_NOT_OWNER;
- }
- else
- {
- if (!bus_service_remove_owner (service, connection,
- transaction, error))
- goto out;
-
- _dbus_assert (!bus_service_has_owner (service, connection));
- *result = DBUS_RELEASE_NAME_REPLY_RELEASED;
- }
-
- retval = TRUE;
-
- out:
- return retval;
-}
-
-dbus_bool_t
-bus_registry_set_service_context_table (BusRegistry *registry,
- DBusHashTable *table)
-{
- DBusHashTable *new_table;
- DBusHashIter iter;
-
- new_table = bus_selinux_id_table_new ();
- if (!new_table)
- return FALSE;
-
- _dbus_hash_iter_init (table, &iter);
- while (_dbus_hash_iter_next (&iter))
- {
- const char *service = _dbus_hash_iter_get_string_key (&iter);
- const char *context = _dbus_hash_iter_get_value (&iter);
-
- if (!bus_selinux_id_table_insert (new_table,
- service,
- context))
- return FALSE;
- }
-
- if (registry->service_sid_table)
- _dbus_hash_table_unref (registry->service_sid_table);
- registry->service_sid_table = new_table;
- return TRUE;
-}
-
-static void
-bus_service_unlink_owner (BusService *service,
- BusOwner *owner)
-{
- _dbus_list_remove_last (&service->owners, owner);
- bus_owner_unref (owner);
-}
-
-static void
-bus_service_unlink (BusService *service)
-{
- _dbus_assert (service->owners == NULL);
-
- /* the service may not be in the hash, if
- * the failure causing transaction cancel
- * was in the right place, but that's OK
- */
- _dbus_hash_table_remove_string (service->registry->service_hash,
- service->name);
-
- bus_service_unref (service);
-}
-
-static void
-bus_service_relink (BusService *service,
- DBusPreallocatedHash *preallocated)
-{
- _dbus_assert (service->owners == NULL);
- _dbus_assert (preallocated != NULL);
-
- _dbus_hash_table_insert_string_preallocated (service->registry->service_hash,
- preallocated,
- service->name,
- service);
-
- bus_service_ref (service);
-}
-
-/**
- * Data used to represent an ownership cancellation in
- * a bus transaction.
- */
-typedef struct
-{
- BusOwner *owner; /**< the owner */
- BusService *service; /**< service to cancel ownership of */
-} OwnershipCancelData;
-
-static void
-cancel_ownership (void *data)
-{
- OwnershipCancelData *d = data;
-
- /* We don't need to send messages notifying of these
- * changes, since we're reverting something that was
- * cancelled (effectively never really happened)
- */
- bus_service_unlink_owner (d->service, d->owner);
-
- if (d->service->owners == NULL)
- bus_service_unlink (d->service);
-}
-
-static void
-free_ownership_cancel_data (void *data)
-{
- OwnershipCancelData *d = data;
-
- dbus_connection_unref (d->owner->conn);
- bus_owner_unref (d->owner);
- bus_service_unref (d->service);
-
- dbus_free (d);
-}
-
-static dbus_bool_t
-add_cancel_ownership_to_transaction (BusTransaction *transaction,
- BusService *service,
- BusOwner *owner)
-{
- OwnershipCancelData *d;
-
- d = dbus_new (OwnershipCancelData, 1);
- if (d == NULL)
- return FALSE;
-
- d->service = service;
- d->owner = owner;
-
- if (!bus_transaction_add_cancel_hook (transaction, cancel_ownership, d,
- free_ownership_cancel_data))
- {
- dbus_free (d);
- return FALSE;
- }
-
- bus_service_ref (d->service);
- bus_owner_ref (owner);
- dbus_connection_ref (d->owner->conn);
-
- return TRUE;
-}
-
-/* this function is self-cancelling if you cancel the transaction */
-dbus_bool_t
-bus_service_add_owner (BusService *service,
- DBusConnection *connection,
- dbus_uint32_t flags,
- BusTransaction *transaction,
- DBusError *error)
-{
- BusOwner *bus_owner;
- DBusList *bus_owner_link;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* Send service acquired message first, OOM will result
- * in cancelling the transaction
- */
- if (service->owners == NULL)
- {
- if (!bus_driver_send_service_acquired (connection, service->name, transaction, error))
- return FALSE;
- }
-
- bus_owner_link = _bus_service_find_owner_link (service, connection);
-
- if (bus_owner_link == NULL)
- {
- bus_owner = bus_owner_new (service, connection, flags);
- if (bus_owner == NULL)
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- bus_owner_set_flags (bus_owner, flags);
- if (!(flags & DBUS_NAME_FLAG_REPLACE_EXISTING) || service->owners == NULL)
- {
- if (!_dbus_list_append (&service->owners,
- bus_owner))
- {
- bus_owner_unref (bus_owner);
- BUS_SET_OOM (error);
- return FALSE;
- }
- }
- else
- {
- if (!_dbus_list_insert_after (&service->owners,
- _dbus_list_get_first_link (&service->owners),
- bus_owner))
- {
- bus_owner_unref (bus_owner);
- BUS_SET_OOM (error);
- return FALSE;
- }
- }
- }
- else
- {
- /* Update the link since we are already in the queue
- * No need for operations that can produce OOM
- */
-
- bus_owner = (BusOwner *) bus_owner_link->data;
- if (flags & DBUS_NAME_FLAG_REPLACE_EXISTING)
- {
- DBusList *link;
- _dbus_list_unlink (&service->owners, bus_owner_link);
- link = _dbus_list_get_first_link (&service->owners);
- _dbus_assert (link != NULL);
-
- _dbus_list_insert_after_link (&service->owners, link, bus_owner_link);
- }
-
- bus_owner_set_flags (bus_owner, flags);
- return TRUE;
- }
-
- if (!add_cancel_ownership_to_transaction (transaction,
- service,
- bus_owner))
- {
- bus_service_unlink_owner (service, bus_owner);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- return TRUE;
-}
-
-typedef struct
-{
- BusOwner *owner;
- BusService *service;
- BusOwner *before_owner; /* restore to position before this connection in owners list */
- DBusList *owner_link;
- DBusList *service_link;
- DBusPreallocatedHash *hash_entry;
-} OwnershipRestoreData;
-
-static void
-restore_ownership (void *data)
-{
- OwnershipRestoreData *d = data;
- DBusList *link;
-
- _dbus_assert (d->service_link != NULL);
- _dbus_assert (d->owner_link != NULL);
-
- if (d->service->owners == NULL)
- {
- _dbus_assert (d->hash_entry != NULL);
- bus_service_relink (d->service, d->hash_entry);
- }
- else
- {
- _dbus_assert (d->hash_entry == NULL);
- }
-
- /* We don't need to send messages notifying of these
- * changes, since we're reverting something that was
- * cancelled (effectively never really happened)
- */
- link = _dbus_list_get_first_link (&d->service->owners);
- while (link != NULL)
- {
- if (link->data == d->before_owner)
- break;
-
- link = _dbus_list_get_next_link (&d->service->owners, link);
- }
-
- _dbus_list_insert_before_link (&d->service->owners, link, d->owner_link);
-
- /* Note that removing then restoring this changes the order in which
- * ServiceDeleted messages are sent on destruction of the
- * connection. This should be OK as the only guarantee there is
- * that the base service is destroyed last, and we never even
- * tentatively remove the base service.
- */
- bus_connection_add_owned_service_link (d->owner->conn, d->service_link);
-
- d->hash_entry = NULL;
- d->service_link = NULL;
- d->owner_link = NULL;
-}
-
-static void
-free_ownership_restore_data (void *data)
-{
- OwnershipRestoreData *d = data;
-
- if (d->service_link)
- _dbus_list_free_link (d->service_link);
- if (d->owner_link)
- _dbus_list_free_link (d->owner_link);
- if (d->hash_entry)
- _dbus_hash_table_free_preallocated_entry (d->service->registry->service_hash,
- d->hash_entry);
-
- dbus_connection_unref (d->owner->conn);
- bus_owner_unref (d->owner);
- bus_service_unref (d->service);
-
- dbus_free (d);
-}
-
-static dbus_bool_t
-add_restore_ownership_to_transaction (BusTransaction *transaction,
- BusService *service,
- BusOwner *owner)
-{
- OwnershipRestoreData *d;
- DBusList *link;
-
- d = dbus_new (OwnershipRestoreData, 1);
- if (d == NULL)
- return FALSE;
-
- d->service = service;
- d->owner = owner;
- d->service_link = _dbus_list_alloc_link (service);
- d->owner_link = _dbus_list_alloc_link (owner);
- d->hash_entry = _dbus_hash_table_preallocate_entry (service->registry->service_hash);
-
- bus_service_ref (d->service);
- bus_owner_ref (d->owner);
- dbus_connection_ref (d->owner->conn);
-
- d->before_owner = NULL;
- link = _dbus_list_get_first_link (&service->owners);
- while (link != NULL)
- {
- if (link->data == owner)
- {
- link = _dbus_list_get_next_link (&service->owners, link);
-
- if (link)
- d->before_owner = link->data;
-
- break;
- }
-
- link = _dbus_list_get_next_link (&service->owners, link);
- }
-
- if (d->service_link == NULL ||
- d->owner_link == NULL ||
- d->hash_entry == NULL ||
- !bus_transaction_add_cancel_hook (transaction, restore_ownership, d,
- free_ownership_restore_data))
- {
- free_ownership_restore_data (d);
- return FALSE;
- }
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_service_swap_owner (BusService *service,
- DBusConnection *connection,
- BusTransaction *transaction,
- DBusError *error)
-{
- DBusList *swap_link;
- BusOwner *primary_owner;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* We send out notifications before we do any work we
- * might have to undo if the notification-sending failed
- */
-
- /* Send service lost message */
- primary_owner = bus_service_get_primary_owner (service);
- if (primary_owner == NULL || primary_owner->conn != connection)
- _dbus_assert_not_reached ("Tried to swap a non primary owner");
-
-
- if (!bus_driver_send_service_lost (connection, service->name,
- transaction, error))
- return FALSE;
-
- if (service->owners == NULL)
- {
- _dbus_assert_not_reached ("Tried to swap owner of a service that has no owners");
- }
- else if (_dbus_list_length_is_one (&service->owners))
- {
- _dbus_assert_not_reached ("Tried to swap owner of a service that has no other owners in the queue");
- }
- else
- {
- DBusList *link;
- BusOwner *new_owner;
- DBusConnection *new_owner_conn;
- link = _dbus_list_get_first_link (&service->owners);
- _dbus_assert (link != NULL);
- link = _dbus_list_get_next_link (&service->owners, link);
- _dbus_assert (link != NULL);
-
- new_owner = (BusOwner *)link->data;
- new_owner_conn = new_owner->conn;
-
- if (!bus_driver_send_service_owner_changed (service->name,
- bus_connection_get_name (connection),
- bus_connection_get_name (new_owner_conn),
- transaction, error))
- return FALSE;
-
- /* This will be our new owner */
- if (!bus_driver_send_service_acquired (new_owner_conn,
- service->name,
- transaction,
- error))
- return FALSE;
- }
-
- if (!add_restore_ownership_to_transaction (transaction, service, primary_owner))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- /* unlink the primary and make it the second link */
- swap_link = _dbus_list_get_first_link (&service->owners);
- _dbus_list_unlink (&service->owners, swap_link);
-
- _dbus_list_insert_after_link (&service->owners,
- _dbus_list_get_first_link (&service->owners),
- swap_link);
-
- return TRUE;
-}
-
-/* this function is self-cancelling if you cancel the transaction */
-dbus_bool_t
-bus_service_remove_owner (BusService *service,
- DBusConnection *connection,
- BusTransaction *transaction,
- DBusError *error)
-{
- BusOwner *primary_owner;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* We send out notifications before we do any work we
- * might have to undo if the notification-sending failed
- */
-
- /* Send service lost message */
- primary_owner = bus_service_get_primary_owner (service);
- if (primary_owner != NULL && primary_owner->conn == connection)
- {
- if (!bus_driver_send_service_lost (connection, service->name,
- transaction, error))
- return FALSE;
- }
- else
- {
- /* if we are not the primary owner then just remove us from the queue */
- DBusList *link;
- BusOwner *temp_owner;
-
- link = _bus_service_find_owner_link (service, connection);
- _dbus_list_unlink (&service->owners, link);
- temp_owner = (BusOwner *)link->data;
- bus_owner_unref (temp_owner);
- _dbus_list_free_link (link);
-
- return TRUE;
- }
-
- if (service->owners == NULL)
- {
- _dbus_assert_not_reached ("Tried to remove owner of a service that has no owners");
- }
- else if (_dbus_list_length_is_one (&service->owners))
- {
- if (!bus_driver_send_service_owner_changed (service->name,
- bus_connection_get_name (connection),
- NULL,
- transaction, error))
- return FALSE;
- }
- else
- {
- DBusList *link;
- BusOwner *new_owner;
- DBusConnection *new_owner_conn;
- link = _dbus_list_get_first_link (&service->owners);
- _dbus_assert (link != NULL);
- link = _dbus_list_get_next_link (&service->owners, link);
- _dbus_assert (link != NULL);
-
- new_owner = (BusOwner *)link->data;
- new_owner_conn = new_owner->conn;
-
- if (!bus_driver_send_service_owner_changed (service->name,
- bus_connection_get_name (connection),
- bus_connection_get_name (new_owner_conn),
- transaction, error))
- return FALSE;
-
- /* This will be our new owner */
- if (!bus_driver_send_service_acquired (new_owner_conn,
- service->name,
- transaction,
- error))
- return FALSE;
- }
-
- if (!add_restore_ownership_to_transaction (transaction, service, primary_owner))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- bus_service_unlink_owner (service, primary_owner);
-
- if (service->owners == NULL)
- bus_service_unlink (service);
-
- return TRUE;
-}
-
-BusService *
-bus_service_ref (BusService *service)
-{
- _dbus_assert (service->refcount > 0);
-
- service->refcount += 1;
-
- return service;
-}
-
-void
-bus_service_unref (BusService *service)
-{
- _dbus_assert (service->refcount > 0);
-
- service->refcount -= 1;
-
- if (service->refcount == 0)
- {
- _dbus_assert (service->owners == NULL);
-
- dbus_free (service->name);
- _dbus_mem_pool_dealloc (service->registry->service_pool, service);
- }
-}
-
-DBusConnection *
-bus_service_get_primary_owners_connection (BusService *service)
-{
- BusOwner *owner;
-
- owner = bus_service_get_primary_owner (service);
-
- if (owner != NULL)
- return owner->conn;
- else
- return NULL;
-}
-
-BusOwner*
-bus_service_get_primary_owner (BusService *service)
-{
- return _dbus_list_get_first (&service->owners);
-}
-
-const char*
-bus_service_get_name (BusService *service)
-{
- return service->name;
-}
-
-dbus_bool_t
-bus_service_get_allow_replacement (BusService *service)
-{
- BusOwner *owner;
- DBusList *link;
-
- _dbus_assert (service->owners != NULL);
-
- link = _dbus_list_get_first_link (&service->owners);
- owner = (BusOwner *) link->data;
-
- return owner->allow_replacement;
-}
-
-dbus_bool_t
-bus_service_has_owner (BusService *service,
- DBusConnection *connection)
-{
- DBusList *link;
-
- link = _bus_service_find_owner_link (service, connection);
-
- if (link == NULL)
- return FALSE;
- else
- return TRUE;
-}
-
-dbus_bool_t
-bus_service_list_queued_owners (BusService *service,
- DBusList **return_list,
- DBusError *error)
-{
- DBusList *link;
-
- _dbus_assert (*return_list == NULL);
-
- link = _dbus_list_get_first_link (&service->owners);
- _dbus_assert (link != NULL);
-
- while (link != NULL)
- {
- BusOwner *owner;
- const char *uname;
-
- owner = (BusOwner *) link->data;
- uname = bus_connection_get_name (owner->conn);
-
- if (!_dbus_list_append (return_list, (char *)uname))
- goto oom;
-
- link = _dbus_list_get_next_link (&service->owners, link);
- }
-
- return TRUE;
-
- oom:
- _dbus_list_clear (return_list);
- BUS_SET_OOM (error);
- return FALSE;
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/services.h b/src/3rd_party/dbus-1.7.8/bus/services.h
deleted file mode 100644
index 056dd9faa4..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/services.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* services.h Service management
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_SERVICES_H
-#define BUS_SERVICES_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-hash.h>
-#include "connection.h"
-#include "bus.h"
-
-typedef void (* BusServiceForeachFunction) (BusService *service,
- void *data);
-
-BusRegistry* bus_registry_new (BusContext *context);
-BusRegistry* bus_registry_ref (BusRegistry *registry);
-void bus_registry_unref (BusRegistry *registry);
-BusService* bus_registry_lookup (BusRegistry *registry,
- const DBusString *service_name);
-BusService* bus_registry_ensure (BusRegistry *registry,
- const DBusString *service_name,
- DBusConnection *owner_connection_if_created,
- dbus_uint32_t flags,
- BusTransaction *transaction,
- DBusError *error);
-void bus_registry_foreach (BusRegistry *registry,
- BusServiceForeachFunction function,
- void *data);
-dbus_bool_t bus_registry_list_services (BusRegistry *registry,
- char ***listp,
- int *array_len);
-dbus_bool_t bus_registry_acquire_service (BusRegistry *registry,
- DBusConnection *connection,
- const DBusString *service_name,
- dbus_uint32_t flags,
- dbus_uint32_t *result,
- BusTransaction *transaction,
- DBusError *error);
-dbus_bool_t bus_registry_release_service (BusRegistry *registry,
- DBusConnection *connection,
- const DBusString *service_name,
- dbus_uint32_t *result,
- BusTransaction *transaction,
- DBusError *error);
-dbus_bool_t bus_registry_set_service_context_table (BusRegistry *registry,
- DBusHashTable *table);
-
-BusService* bus_service_ref (BusService *service);
-void bus_service_unref (BusService *service);
-dbus_bool_t bus_service_add_owner (BusService *service,
- DBusConnection *connection,
- dbus_uint32_t flags,
- BusTransaction *transaction,
- DBusError *error);
-dbus_bool_t bus_service_swap_owner (BusService *service,
- DBusConnection *connection,
- BusTransaction *transaction,
- DBusError *error);
-dbus_bool_t bus_service_remove_owner (BusService *service,
- DBusConnection *connection,
- BusTransaction *transaction,
- DBusError *error);
-dbus_bool_t bus_service_has_owner (BusService *service,
- DBusConnection *connection);
-BusOwner* bus_service_get_primary_owner (BusService *service);
-dbus_bool_t bus_service_get_allow_replacement (BusService *service);
-const char* bus_service_get_name (BusService *service);
-dbus_bool_t bus_service_list_queued_owners (BusService *service,
- DBusList **return_list,
- DBusError *error);
-
-DBusConnection* bus_service_get_primary_owners_connection (BusService *service);
-#endif /* BUS_SERVICES_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/session.conf.in b/src/3rd_party/dbus-1.7.8/bus/session.conf.in
deleted file mode 100644
index 74d9d1fd5b..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/session.conf.in
+++ /dev/null
@@ -1,63 +0,0 @@
-<!-- This configuration file controls the per-user-login-session message bus.
- Add a session-local.conf and edit that rather than changing this
- file directly. -->
-
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
- <!-- Our well-known bus type, don't change this -->
- <type>session</type>
-
- <!-- If we fork, keep the user's original umask to avoid affecting
- the behavior of child processes. -->
- <keep_umask/>
-
- <listen>@DBUS_SESSION_BUS_LISTEN_ADDRESS@</listen>
-
- <standard_session_servicedirs />
-
- <policy context="default">
- <!-- Allow everything to be sent -->
- <allow send_destination="*" eavesdrop="true"/>
- <!-- Allow everything to be received -->
- <allow eavesdrop="true"/>
- <!-- Allow anyone to own anything -->
- <allow own="*"/>
- </policy>
-
- <!-- Config files are placed here that among other things,
- further restrict the above policy for specific services. -->
- <includedir>session.d</includedir>
-
- <!-- This is included last so local configuration can override what's
- in this standard file -->
- <include ignore_missing="yes">session-local.conf</include>
-
- <include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_contexts</include>
-
- <!-- For the session bus, override the default relatively-low limits
- with essentially infinite limits, since the bus is just running
- as the user anyway, using up bus resources is not something we need
- to worry about. In some cases, we do set the limits lower than
- "all available memory" if exceeding the limit is almost certainly a bug,
- having the bus enforce a limit is nicer than a huge memory leak. But the
- intent is that these limits should never be hit. -->
-
- <!-- the memory limits are 1G instead of say 4G because they can't exceed 32-bit signed int max -->
- <limit name="max_incoming_bytes">1000000000</limit>
- <limit name="max_incoming_unix_fds">250000000</limit>
- <limit name="max_outgoing_bytes">1000000000</limit>
- <limit name="max_outgoing_unix_fds">250000000</limit>
- <limit name="max_message_size">1000000000</limit>
- <limit name="max_message_unix_fds">@DEFAULT_MESSAGE_UNIX_FDS@</limit>
- <limit name="service_start_timeout">120000</limit>
- <limit name="auth_timeout">240000</limit>
- <limit name="max_completed_connections">100000</limit>
- <limit name="max_incomplete_connections">10000</limit>
- <limit name="max_connections_per_user">100000</limit>
- <limit name="max_pending_service_starts">10000</limit>
- <limit name="max_names_per_connection">50000</limit>
- <limit name="max_match_rules_per_connection">50000</limit>
- <limit name="max_replies_per_connection">50000</limit>
-
-</busconfig>
diff --git a/src/3rd_party/dbus-1.7.8/bus/signals.c b/src/3rd_party/dbus-1.7.8/bus/signals.c
deleted file mode 100644
index 4c500c67fd..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/signals.c
+++ /dev/null
@@ -1,2841 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* signals.c Bus signal connection implementation
- *
- * Copyright (C) 2003, 2005 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "signals.h"
-#include "services.h"
-#include "utils.h"
-#include <dbus/dbus-marshal-validate.h>
-
-struct BusMatchRule
-{
- int refcount; /**< reference count */
-
- DBusConnection *matches_go_to; /**< Owner of the rule */
-
- unsigned int flags; /**< BusMatchFlags */
-
- int message_type;
- char *interface;
- char *member;
- char *sender;
- char *destination;
- char *path;
-
- unsigned int *arg_lens;
- char **args;
- int args_len;
-};
-
-#define BUS_MATCH_ARG_NAMESPACE 0x4000000u
-#define BUS_MATCH_ARG_IS_PATH 0x8000000u
-
-#define BUS_MATCH_ARG_FLAGS (BUS_MATCH_ARG_NAMESPACE | BUS_MATCH_ARG_IS_PATH)
-
-BusMatchRule*
-bus_match_rule_new (DBusConnection *matches_go_to)
-{
- BusMatchRule *rule;
-
- rule = dbus_new0 (BusMatchRule, 1);
- if (rule == NULL)
- return NULL;
-
- rule->refcount = 1;
- rule->matches_go_to = matches_go_to;
-
-#ifndef DBUS_ENABLE_EMBEDDED_TESTS
- _dbus_assert (rule->matches_go_to != NULL);
-#endif
-
- return rule;
-}
-
-BusMatchRule *
-bus_match_rule_ref (BusMatchRule *rule)
-{
- _dbus_assert (rule->refcount > 0);
-
- rule->refcount += 1;
-
- return rule;
-}
-
-void
-bus_match_rule_unref (BusMatchRule *rule)
-{
- _dbus_assert (rule->refcount > 0);
-
- rule->refcount -= 1;
- if (rule->refcount == 0)
- {
- dbus_free (rule->interface);
- dbus_free (rule->member);
- dbus_free (rule->sender);
- dbus_free (rule->destination);
- dbus_free (rule->path);
- dbus_free (rule->arg_lens);
-
- /* can't use dbus_free_string_array() since there
- * are embedded NULL
- */
- if (rule->args)
- {
- int i;
-
- i = 0;
- while (i < rule->args_len)
- {
- if (rule->args[i])
- dbus_free (rule->args[i]);
- ++i;
- }
-
- dbus_free (rule->args);
- }
-
- dbus_free (rule);
- }
-}
-
-#ifdef DBUS_ENABLE_VERBOSE_MODE
-/* Note this function does not do escaping, so it's only
- * good for debug spew at the moment
- */
-static char*
-match_rule_to_string (BusMatchRule *rule)
-{
- DBusString str;
- char *ret;
-
- if (!_dbus_string_init (&str))
- {
- char *s;
- while ((s = _dbus_strdup ("nomem")) == NULL)
- ; /* only OK for debug spew... */
- return s;
- }
-
- if (rule->flags & BUS_MATCH_MESSAGE_TYPE)
- {
- if (!_dbus_string_append_printf (&str, "type='%s'",
- dbus_message_type_to_string (rule->message_type)))
- goto nomem;
- }
-
- if (rule->flags & BUS_MATCH_INTERFACE)
- {
- if (_dbus_string_get_length (&str) > 0)
- {
- if (!_dbus_string_append (&str, ","))
- goto nomem;
- }
-
- if (!_dbus_string_append_printf (&str, "interface='%s'", rule->interface))
- goto nomem;
- }
-
- if (rule->flags & BUS_MATCH_MEMBER)
- {
- if (_dbus_string_get_length (&str) > 0)
- {
- if (!_dbus_string_append (&str, ","))
- goto nomem;
- }
-
- if (!_dbus_string_append_printf (&str, "member='%s'", rule->member))
- goto nomem;
- }
-
- if (rule->flags & BUS_MATCH_PATH)
- {
- if (_dbus_string_get_length (&str) > 0)
- {
- if (!_dbus_string_append (&str, ","))
- goto nomem;
- }
-
- if (!_dbus_string_append_printf (&str, "path='%s'", rule->path))
- goto nomem;
- }
-
- if (rule->flags & BUS_MATCH_PATH_NAMESPACE)
- {
- if (_dbus_string_get_length (&str) > 0)
- {
- if (!_dbus_string_append (&str, ","))
- goto nomem;
- }
-
- if (!_dbus_string_append_printf (&str, "path_namespace='%s'", rule->path))
- goto nomem;
- }
-
- if (rule->flags & BUS_MATCH_SENDER)
- {
- if (_dbus_string_get_length (&str) > 0)
- {
- if (!_dbus_string_append (&str, ","))
- goto nomem;
- }
-
- if (!_dbus_string_append_printf (&str, "sender='%s'", rule->sender))
- goto nomem;
- }
-
- if (rule->flags & BUS_MATCH_DESTINATION)
- {
- if (_dbus_string_get_length (&str) > 0)
- {
- if (!_dbus_string_append (&str, ","))
- goto nomem;
- }
-
- if (!_dbus_string_append_printf (&str, "destination='%s'", rule->destination))
- goto nomem;
- }
-
- if (rule->flags & BUS_MATCH_CLIENT_IS_EAVESDROPPING)
- {
- if (_dbus_string_get_length (&str) > 0)
- {
- if (!_dbus_string_append (&str, ","))
- goto nomem;
- }
-
- if (!_dbus_string_append_printf (&str, "eavesdrop='%s'",
- (rule->flags & BUS_MATCH_CLIENT_IS_EAVESDROPPING) ?
- "true" : "false"))
- goto nomem;
- }
-
- if (rule->flags & BUS_MATCH_ARGS)
- {
- int i;
-
- _dbus_assert (rule->args != NULL);
-
- i = 0;
- while (i < rule->args_len)
- {
- if (rule->args[i] != NULL)
- {
- dbus_bool_t is_path, is_namespace;
-
- if (_dbus_string_get_length (&str) > 0)
- {
- if (!_dbus_string_append (&str, ","))
- goto nomem;
- }
-
- is_path = (rule->arg_lens[i] & BUS_MATCH_ARG_IS_PATH) != 0;
- is_namespace = (rule->arg_lens[i] & BUS_MATCH_ARG_NAMESPACE) != 0;
-
- if (!_dbus_string_append_printf (&str,
- "arg%d%s='%s'",
- i,
- is_path ? "path" :
- is_namespace ? "namespace" : "",
- rule->args[i]))
- goto nomem;
- }
-
- ++i;
- }
- }
-
- if (!_dbus_string_steal_data (&str, &ret))
- goto nomem;
-
- _dbus_string_free (&str);
- return ret;
-
- nomem:
- _dbus_string_free (&str);
- {
- char *s;
- while ((s = _dbus_strdup ("nomem")) == NULL)
- ; /* only OK for debug spew... */
- return s;
- }
-}
-#endif /* DBUS_ENABLE_VERBOSE_MODE */
-
-dbus_bool_t
-bus_match_rule_set_message_type (BusMatchRule *rule,
- int type)
-{
- rule->flags |= BUS_MATCH_MESSAGE_TYPE;
-
- rule->message_type = type;
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_match_rule_set_interface (BusMatchRule *rule,
- const char *interface)
-{
- char *new;
-
- _dbus_assert (interface != NULL);
-
- new = _dbus_strdup (interface);
- if (new == NULL)
- return FALSE;
-
- rule->flags |= BUS_MATCH_INTERFACE;
- dbus_free (rule->interface);
- rule->interface = new;
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_match_rule_set_member (BusMatchRule *rule,
- const char *member)
-{
- char *new;
-
- _dbus_assert (member != NULL);
-
- new = _dbus_strdup (member);
- if (new == NULL)
- return FALSE;
-
- rule->flags |= BUS_MATCH_MEMBER;
- dbus_free (rule->member);
- rule->member = new;
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_match_rule_set_sender (BusMatchRule *rule,
- const char *sender)
-{
- char *new;
-
- _dbus_assert (sender != NULL);
-
- new = _dbus_strdup (sender);
- if (new == NULL)
- return FALSE;
-
- rule->flags |= BUS_MATCH_SENDER;
- dbus_free (rule->sender);
- rule->sender = new;
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_match_rule_set_destination (BusMatchRule *rule,
- const char *destination)
-{
- char *new;
-
- _dbus_assert (destination != NULL);
-
- new = _dbus_strdup (destination);
- if (new == NULL)
- return FALSE;
-
- rule->flags |= BUS_MATCH_DESTINATION;
- dbus_free (rule->destination);
- rule->destination = new;
-
- return TRUE;
-}
-
-void
-bus_match_rule_set_client_is_eavesdropping (BusMatchRule *rule,
- dbus_bool_t is_eavesdropping)
-{
- if (is_eavesdropping)
- rule->flags |= BUS_MATCH_CLIENT_IS_EAVESDROPPING;
- else
- rule->flags &= ~(BUS_MATCH_CLIENT_IS_EAVESDROPPING);
-}
-
-dbus_bool_t
-bus_match_rule_set_path (BusMatchRule *rule,
- const char *path,
- dbus_bool_t is_namespace)
-{
- char *new;
-
- _dbus_assert (path != NULL);
-
- new = _dbus_strdup (path);
- if (new == NULL)
- return FALSE;
-
- rule->flags &= ~(BUS_MATCH_PATH|BUS_MATCH_PATH_NAMESPACE);
-
- if (is_namespace)
- rule->flags |= BUS_MATCH_PATH_NAMESPACE;
- else
- rule->flags |= BUS_MATCH_PATH;
-
- dbus_free (rule->path);
- rule->path = new;
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_match_rule_set_arg (BusMatchRule *rule,
- int arg,
- const DBusString *value,
- dbus_bool_t is_path,
- dbus_bool_t is_namespace)
-{
- int length;
- char *new;
-
- _dbus_assert (value != NULL);
-
- /* args_len is the number of args not including null termination
- * in the char**
- */
- if (arg >= rule->args_len)
- {
- unsigned int *new_arg_lens;
- char **new_args;
- int new_args_len;
- int i;
-
- new_args_len = arg + 1;
-
- /* add another + 1 here for null termination */
- new_args = dbus_realloc (rule->args,
- sizeof (char *) * (new_args_len + 1));
- if (new_args == NULL)
- return FALSE;
-
- /* NULL the new slots */
- i = rule->args_len;
- while (i <= new_args_len) /* <= for null termination */
- {
- new_args[i] = NULL;
- ++i;
- }
-
- rule->args = new_args;
-
- /* and now add to the lengths */
- new_arg_lens = dbus_realloc (rule->arg_lens,
- sizeof (int) * (new_args_len + 1));
-
- if (new_arg_lens == NULL)
- return FALSE;
-
- /* zero the new slots */
- i = rule->args_len;
- while (i <= new_args_len) /* <= for null termination */
- {
- new_arg_lens[i] = 0;
- ++i;
- }
-
- rule->arg_lens = new_arg_lens;
- rule->args_len = new_args_len;
- }
-
- length = _dbus_string_get_length (value);
- if (!_dbus_string_copy_data (value, &new))
- return FALSE;
-
- rule->flags |= BUS_MATCH_ARGS;
-
- dbus_free (rule->args[arg]);
- rule->arg_lens[arg] = length;
- rule->args[arg] = new;
-
- if (is_path)
- rule->arg_lens[arg] |= BUS_MATCH_ARG_IS_PATH;
-
- if (is_namespace)
- rule->arg_lens[arg] |= BUS_MATCH_ARG_NAMESPACE;
-
- /* NULL termination didn't get busted */
- _dbus_assert (rule->args[rule->args_len] == NULL);
- _dbus_assert (rule->arg_lens[rule->args_len] == 0);
-
- return TRUE;
-}
-
-#define ISWHITE(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || ((c) == '\r'))
-
-static dbus_bool_t
-find_key (const DBusString *str,
- int start,
- DBusString *key,
- int *value_pos,
- DBusError *error)
-{
- const char *p;
- const char *s;
- const char *key_start;
- const char *key_end;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- s = _dbus_string_get_const_data (str);
-
- p = s + start;
-
- while (*p && ISWHITE (*p))
- ++p;
-
- key_start = p;
-
- while (*p && *p != '=' && !ISWHITE (*p))
- ++p;
-
- key_end = p;
-
- while (*p && ISWHITE (*p))
- ++p;
-
- if (key_start == key_end)
- {
- /* Empty match rules or trailing whitespace are OK */
- *value_pos = p - s;
- return TRUE;
- }
-
- if (*p != '=')
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Match rule has a key with no subsequent '=' character");
- return FALSE;
- }
- ++p;
-
- if (!_dbus_string_append_len (key, key_start, key_end - key_start))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- *value_pos = p - s;
-
- return TRUE;
-}
-
-static dbus_bool_t
-find_value (const DBusString *str,
- int start,
- const char *key,
- DBusString *value,
- int *value_end,
- DBusError *error)
-{
- const char *p;
- const char *s;
- char quote_char;
- int orig_len;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- orig_len = _dbus_string_get_length (value);
-
- s = _dbus_string_get_const_data (str);
-
- p = s + start;
-
- quote_char = '\0';
-
- while (*p)
- {
- if (quote_char == '\0')
- {
- switch (*p)
- {
- case '\0':
- goto done;
-
- case '\'':
- quote_char = '\'';
- goto next;
-
- case ',':
- ++p;
- goto done;
-
- case '\\':
- quote_char = '\\';
- goto next;
-
- default:
- if (!_dbus_string_append_byte (value, *p))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
- }
- else if (quote_char == '\\')
- {
- /* \ only counts as an escape if escaping a quote mark */
- if (*p != '\'')
- {
- if (!_dbus_string_append_byte (value, '\\'))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
-
- if (!_dbus_string_append_byte (value, *p))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- quote_char = '\0';
- }
- else
- {
- _dbus_assert (quote_char == '\'');
-
- if (*p == '\'')
- {
- quote_char = '\0';
- }
- else
- {
- if (!_dbus_string_append_byte (value, *p))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
- }
-
- next:
- ++p;
- }
-
- done:
-
- if (quote_char == '\\')
- {
- if (!_dbus_string_append_byte (value, '\\'))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
- else if (quote_char == '\'')
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Unbalanced quotation marks in match rule");
- goto failed;
- }
- else
- _dbus_assert (quote_char == '\0');
-
- /* Zero-length values are allowed */
-
- *value_end = p - s;
-
- return TRUE;
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- _dbus_string_set_length (value, orig_len);
- return FALSE;
-}
-
-/* duplicates aren't allowed so the real legitimate max is only 6 or
- * so. Leaving extra so we don't have to bother to update it.
- * FIXME this is sort of busted now with arg matching, but we let
- * you match on up to 10 args for now
- */
-#define MAX_RULE_TOKENS 16
-
-/* this is slightly too high level to be termed a "token"
- * but let's not be pedantic.
- */
-typedef struct
-{
- char *key;
- char *value;
-} RuleToken;
-
-static dbus_bool_t
-tokenize_rule (const DBusString *rule_text,
- RuleToken tokens[MAX_RULE_TOKENS],
- DBusError *error)
-{
- int i;
- int pos;
- DBusString key;
- DBusString value;
- dbus_bool_t retval;
-
- retval = FALSE;
-
- if (!_dbus_string_init (&key))
- {
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_string_init (&value))
- {
- _dbus_string_free (&key);
- BUS_SET_OOM (error);
- return FALSE;
- }
-
- i = 0;
- pos = 0;
- while (i < MAX_RULE_TOKENS &&
- pos < _dbus_string_get_length (rule_text))
- {
- _dbus_assert (tokens[i].key == NULL);
- _dbus_assert (tokens[i].value == NULL);
-
- if (!find_key (rule_text, pos, &key, &pos, error))
- goto out;
-
- if (_dbus_string_get_length (&key) == 0)
- goto next;
-
- if (!_dbus_string_steal_data (&key, &tokens[i].key))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- if (!find_value (rule_text, pos, tokens[i].key, &value, &pos, error))
- goto out;
-
- if (!_dbus_string_steal_data (&value, &tokens[i].value))
- {
- BUS_SET_OOM (error);
- goto out;
- }
-
- next:
- ++i;
- }
-
- retval = TRUE;
-
- out:
- if (!retval)
- {
- i = 0;
- while (tokens[i].key || tokens[i].value)
- {
- dbus_free (tokens[i].key);
- dbus_free (tokens[i].value);
- tokens[i].key = NULL;
- tokens[i].value = NULL;
- ++i;
- }
- }
-
- _dbus_string_free (&key);
- _dbus_string_free (&value);
-
- return retval;
-}
-
-static dbus_bool_t
-bus_match_rule_parse_arg_match (BusMatchRule *rule,
- const char *key,
- const DBusString *value,
- DBusError *error)
-{
- dbus_bool_t is_path = FALSE;
- dbus_bool_t is_namespace = FALSE;
- DBusString key_str;
- unsigned long arg;
- int length;
- int end;
-
- /* For now, arg0='foo' always implies that 'foo' is a
- * DBUS_TYPE_STRING. Someday we could add an arg0type='int32' thing
- * if we wanted, which would specify another type, in which case
- * arg0='5' would have the 5 parsed as an int rather than string.
- */
-
- /* First we need to parse arg0 = 0, arg27 = 27 */
-
- _dbus_string_init_const (&key_str, key);
- length = _dbus_string_get_length (&key_str);
-
- if (_dbus_string_get_length (&key_str) < 4)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Key '%s' in match rule starts with 'arg' but lacks an arg number. Should be 'arg0' or 'arg7' for example.\n", key);
- goto failed;
- }
-
- if (!_dbus_string_parse_uint (&key_str, 3, &arg, &end))
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Key '%s' in match rule starts with 'arg' but could not parse arg number. Should be 'arg0' or 'arg7' for example.\n", key);
- goto failed;
- }
-
- if (end != length)
- {
- if ((end + strlen ("path")) == length &&
- _dbus_string_ends_with_c_str (&key_str, "path"))
- {
- is_path = TRUE;
- }
- else if (_dbus_string_equal_c_str (&key_str, "arg0namespace"))
- {
- int value_len = _dbus_string_get_length (value);
-
- is_namespace = TRUE;
-
- if (!_dbus_validate_bus_namespace (value, 0, value_len))
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "arg0namespace='%s' is not a valid prefix of a bus name",
- _dbus_string_get_const_data (value));
- goto failed;
- }
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Key '%s' in match rule contains junk after argument number (%u). Only 'arg%upath' (for example) or 'arg0namespace' are valid", key, arg, arg);
- goto failed;
- }
- }
-
- /* If we didn't check this we could allocate a huge amount of RAM */
- if (arg > DBUS_MAXIMUM_MATCH_RULE_ARG_NUMBER)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Key '%s' in match rule has arg number %lu but the maximum is %d.\n", key, (unsigned long) arg, DBUS_MAXIMUM_MATCH_RULE_ARG_NUMBER);
- goto failed;
- }
-
- if ((rule->flags & BUS_MATCH_ARGS) &&
- rule->args_len > (int) arg &&
- rule->args[arg] != NULL)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Argument %d matched more than once in match rule\n", key);
- goto failed;
- }
-
- if (!bus_match_rule_set_arg (rule, arg, value, is_path, is_namespace))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- return TRUE;
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- return FALSE;
-}
-
-/*
- * The format is comma-separated with strings quoted with single quotes
- * as for the shell (to escape a literal single quote, use '\'').
- *
- * type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='Foo',
- * path='/bar/foo',destination=':452345.34'
- *
- */
-BusMatchRule*
-bus_match_rule_parse (DBusConnection *matches_go_to,
- const DBusString *rule_text,
- DBusError *error)
-{
- BusMatchRule *rule;
- RuleToken tokens[MAX_RULE_TOKENS+1]; /* NULL termination + 1 */
- int i;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- if (_dbus_string_get_length (rule_text) > DBUS_MAXIMUM_MATCH_RULE_LENGTH)
- {
- dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
- "Match rule text is %d bytes, maximum is %d",
- _dbus_string_get_length (rule_text),
- DBUS_MAXIMUM_MATCH_RULE_LENGTH);
- return NULL;
- }
-
- memset (tokens, '\0', sizeof (tokens));
-
- rule = bus_match_rule_new (matches_go_to);
- if (rule == NULL)
- {
- BUS_SET_OOM (error);
- goto failed;
- }
-
- if (!tokenize_rule (rule_text, tokens, error))
- goto failed;
-
- i = 0;
- while (tokens[i].key != NULL)
- {
- DBusString tmp_str;
- int len;
- const char *key = tokens[i].key;
- const char *value = tokens[i].value;
-
- _dbus_string_init_const (&tmp_str, value);
- len = _dbus_string_get_length (&tmp_str);
-
- if (strcmp (key, "type") == 0)
- {
- int t;
-
- if (rule->flags & BUS_MATCH_MESSAGE_TYPE)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Key %s specified twice in match rule\n", key);
- goto failed;
- }
-
- t = dbus_message_type_from_string (value);
-
- if (t == DBUS_MESSAGE_TYPE_INVALID)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Invalid message type (%s) in match rule\n", value);
- goto failed;
- }
-
- if (!bus_match_rule_set_message_type (rule, t))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
- else if (strcmp (key, "sender") == 0)
- {
- if (rule->flags & BUS_MATCH_SENDER)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Key %s specified twice in match rule\n", key);
- goto failed;
- }
-
- if (!_dbus_validate_bus_name (&tmp_str, 0, len))
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Sender name '%s' is invalid\n", value);
- goto failed;
- }
-
- if (!bus_match_rule_set_sender (rule, value))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
- else if (strcmp (key, "interface") == 0)
- {
- if (rule->flags & BUS_MATCH_INTERFACE)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Key %s specified twice in match rule\n", key);
- goto failed;
- }
-
- if (!_dbus_validate_interface (&tmp_str, 0, len))
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Interface name '%s' is invalid\n", value);
- goto failed;
- }
-
- if (!bus_match_rule_set_interface (rule, value))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
- else if (strcmp (key, "member") == 0)
- {
- if (rule->flags & BUS_MATCH_MEMBER)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Key %s specified twice in match rule\n", key);
- goto failed;
- }
-
- if (!_dbus_validate_member (&tmp_str, 0, len))
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Member name '%s' is invalid\n", value);
- goto failed;
- }
-
- if (!bus_match_rule_set_member (rule, value))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
- else if (strcmp (key, "path") == 0 ||
- strcmp (key, "path_namespace") == 0)
- {
- dbus_bool_t is_namespace = (strcmp (key, "path_namespace") == 0);
-
- if (rule->flags & (BUS_MATCH_PATH | BUS_MATCH_PATH_NAMESPACE))
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "path or path_namespace specified twice in match rule\n");
- goto failed;
- }
-
- if (!_dbus_validate_path (&tmp_str, 0, len))
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Path '%s' is invalid\n", value);
- goto failed;
- }
-
- if (!bus_match_rule_set_path (rule, value, is_namespace))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
- else if (strcmp (key, "destination") == 0)
- {
- if (rule->flags & BUS_MATCH_DESTINATION)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Key %s specified twice in match rule\n", key);
- goto failed;
- }
-
- if (!_dbus_validate_bus_name (&tmp_str, 0, len))
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Destination name '%s' is invalid\n", value);
- goto failed;
- }
-
- if (!bus_match_rule_set_destination (rule, value))
- {
- BUS_SET_OOM (error);
- goto failed;
- }
- }
- else if (strcmp (key, "eavesdrop") == 0)
- {
- /* do not detect "eavesdrop" being used more than once in rule:
- * 1) it's not possible, it's only in the flags
- * 2) it might be used twice to disable eavesdropping when it's
- * automatically added (eg dbus-monitor/bustle) */
-
- /* we accept only "true|false" as possible values */
- if ((strcmp (value, "true") == 0))
- {
- bus_match_rule_set_client_is_eavesdropping (rule, TRUE);
- }
- else if (strcmp (value, "false") == 0)
- {
- bus_match_rule_set_client_is_eavesdropping (rule, FALSE);
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "eavesdrop='%s' is invalid, "
- "it should be 'true' or 'false'\n",
- value);
- goto failed;
- }
- }
- else if (strncmp (key, "arg", 3) == 0)
- {
- if (!bus_match_rule_parse_arg_match (rule, key, &tmp_str, error))
- goto failed;
- }
- else
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID,
- "Unknown key \"%s\" in match rule",
- key);
- goto failed;
- }
-
- ++i;
- }
-
-
- goto out;
-
- failed:
- _DBUS_ASSERT_ERROR_IS_SET (error);
- if (rule)
- {
- bus_match_rule_unref (rule);
- rule = NULL;
- }
-
- out:
-
- i = 0;
- while (tokens[i].key || tokens[i].value)
- {
- _dbus_assert (i < MAX_RULE_TOKENS);
- dbus_free (tokens[i].key);
- dbus_free (tokens[i].value);
- ++i;
- }
-
- return rule;
-}
-
-typedef struct RulePool RulePool;
-struct RulePool
-{
- /* Maps non-NULL interface names to non-NULL (DBusList **)s */
- DBusHashTable *rules_by_iface;
-
- /* List of BusMatchRules which don't specify an interface */
- DBusList *rules_without_iface;
-};
-
-struct BusMatchmaker
-{
- int refcount;
-
- /* Pools of rules, grouped by the type of message they match. 0
- * (DBUS_MESSAGE_TYPE_INVALID) represents rules that do not specify a message
- * type.
- */
- RulePool rules_by_type[DBUS_NUM_MESSAGE_TYPES];
-};
-
-static void
-rule_list_free (DBusList **rules)
-{
- while (*rules != NULL)
- {
- BusMatchRule *rule;
-
- rule = (*rules)->data;
- bus_match_rule_unref (rule);
- _dbus_list_remove_link (rules, *rules);
- }
-}
-
-static void
-rule_list_ptr_free (DBusList **list)
-{
- /* We have to cope with NULL because the hash table frees the "existing"
- * value (which is NULL) when creating a new table entry...
- */
- if (list != NULL)
- {
- rule_list_free (list);
- dbus_free (list);
- }
-}
-
-BusMatchmaker*
-bus_matchmaker_new (void)
-{
- BusMatchmaker *matchmaker;
- int i;
-
- matchmaker = dbus_new0 (BusMatchmaker, 1);
- if (matchmaker == NULL)
- return NULL;
-
- matchmaker->refcount = 1;
-
- for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
- {
- RulePool *p = matchmaker->rules_by_type + i;
-
- p->rules_by_iface = _dbus_hash_table_new (DBUS_HASH_STRING,
- dbus_free, (DBusFreeFunction) rule_list_ptr_free);
-
- if (p->rules_by_iface == NULL)
- goto nomem;
- }
-
- return matchmaker;
-
- nomem:
- for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
- {
- RulePool *p = matchmaker->rules_by_type + i;
-
- if (p->rules_by_iface == NULL)
- break;
- else
- _dbus_hash_table_unref (p->rules_by_iface);
- }
- dbus_free (matchmaker);
-
- return NULL;
-}
-
-static DBusList **
-bus_matchmaker_get_rules (BusMatchmaker *matchmaker,
- int message_type,
- const char *interface,
- dbus_bool_t create)
-{
- RulePool *p;
-
- _dbus_assert (message_type >= 0);
- _dbus_assert (message_type < DBUS_NUM_MESSAGE_TYPES);
-
- _dbus_verbose ("Looking up rules for message_type %d, interface %s\n",
- message_type,
- interface != NULL ? interface : "<null>");
-
- p = matchmaker->rules_by_type + message_type;
-
- if (interface == NULL)
- {
- return &p->rules_without_iface;
- }
- else
- {
- DBusList **list;
-
- list = _dbus_hash_table_lookup_string (p->rules_by_iface, interface);
-
- if (list == NULL && create)
- {
- char *dupped_interface;
-
- list = dbus_new0 (DBusList *, 1);
- if (list == NULL)
- return NULL;
-
- dupped_interface = _dbus_strdup (interface);
- if (dupped_interface == NULL)
- {
- dbus_free (list);
- return NULL;
- }
-
- _dbus_verbose ("Adding list for type %d, iface %s\n", message_type,
- interface);
-
- if (!_dbus_hash_table_insert_string (p->rules_by_iface,
- dupped_interface, list))
- {
- dbus_free (list);
- dbus_free (dupped_interface);
- return NULL;
- }
- }
-
- return list;
- }
-}
-
-static void
-bus_matchmaker_gc_rules (BusMatchmaker *matchmaker,
- int message_type,
- const char *interface,
- DBusList **rules)
-{
- RulePool *p;
-
- if (interface == NULL)
- return;
-
- if (*rules != NULL)
- return;
-
- _dbus_verbose ("GCing HT entry for message_type %u, interface %s\n",
- message_type, interface);
-
- p = matchmaker->rules_by_type + message_type;
-
- _dbus_assert (_dbus_hash_table_lookup_string (p->rules_by_iface, interface)
- == rules);
-
- _dbus_hash_table_remove_string (p->rules_by_iface, interface);
-}
-
-BusMatchmaker *
-bus_matchmaker_ref (BusMatchmaker *matchmaker)
-{
- _dbus_assert (matchmaker->refcount > 0);
-
- matchmaker->refcount += 1;
-
- return matchmaker;
-}
-
-void
-bus_matchmaker_unref (BusMatchmaker *matchmaker)
-{
- _dbus_assert (matchmaker->refcount > 0);
-
- matchmaker->refcount -= 1;
- if (matchmaker->refcount == 0)
- {
- int i;
-
- for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
- {
- RulePool *p = matchmaker->rules_by_type + i;
-
- _dbus_hash_table_unref (p->rules_by_iface);
- rule_list_free (&p->rules_without_iface);
- }
-
- dbus_free (matchmaker);
- }
-}
-
-/* The rule can't be modified after it's added. */
-dbus_bool_t
-bus_matchmaker_add_rule (BusMatchmaker *matchmaker,
- BusMatchRule *rule)
-{
- DBusList **rules;
-
- _dbus_assert (bus_connection_is_active (rule->matches_go_to));
-
- _dbus_verbose ("Adding rule with message_type %d, interface %s\n",
- rule->message_type,
- rule->interface != NULL ? rule->interface : "<null>");
-
- rules = bus_matchmaker_get_rules (matchmaker, rule->message_type,
- rule->interface, TRUE);
-
- if (rules == NULL)
- return FALSE;
-
- if (!_dbus_list_append (rules, rule))
- return FALSE;
-
- if (!bus_connection_add_match_rule (rule->matches_go_to, rule))
- {
- _dbus_list_remove_last (rules, rule);
- bus_matchmaker_gc_rules (matchmaker, rule->message_type,
- rule->interface, rules);
- return FALSE;
- }
-
- bus_match_rule_ref (rule);
-
-#ifdef DBUS_ENABLE_VERBOSE_MODE
- {
- char *s = match_rule_to_string (rule);
-
- _dbus_verbose ("Added match rule %s to connection %p\n",
- s, rule->matches_go_to);
- dbus_free (s);
- }
-#endif
-
- return TRUE;
-}
-
-static dbus_bool_t
-match_rule_equal (BusMatchRule *a,
- BusMatchRule *b)
-{
- if (a->flags != b->flags)
- return FALSE;
-
- if (a->matches_go_to != b->matches_go_to)
- return FALSE;
-
- if ((a->flags & BUS_MATCH_MESSAGE_TYPE) &&
- a->message_type != b->message_type)
- return FALSE;
-
- if ((a->flags & BUS_MATCH_MEMBER) &&
- strcmp (a->member, b->member) != 0)
- return FALSE;
-
- if ((a->flags & BUS_MATCH_PATH) &&
- strcmp (a->path, b->path) != 0)
- return FALSE;
-
- if ((a->flags & BUS_MATCH_INTERFACE) &&
- strcmp (a->interface, b->interface) != 0)
- return FALSE;
-
- if ((a->flags & BUS_MATCH_SENDER) &&
- strcmp (a->sender, b->sender) != 0)
- return FALSE;
-
- if ((a->flags & BUS_MATCH_DESTINATION) &&
- strcmp (a->destination, b->destination) != 0)
- return FALSE;
-
- /* we already compared the value of flags, and
- * BUS_MATCH_CLIENT_IS_EAVESDROPPING does not have another struct member */
-
- if (a->flags & BUS_MATCH_ARGS)
- {
- int i;
-
- if (a->args_len != b->args_len)
- return FALSE;
-
- i = 0;
- while (i < a->args_len)
- {
- int length;
-
- if ((a->args[i] != NULL) != (b->args[i] != NULL))
- return FALSE;
-
- if (a->arg_lens[i] != b->arg_lens[i])
- return FALSE;
-
- length = a->arg_lens[i] & ~BUS_MATCH_ARG_FLAGS;
-
- if (a->args[i] != NULL)
- {
- _dbus_assert (b->args[i] != NULL);
- if (memcmp (a->args[i], b->args[i], length) != 0)
- return FALSE;
- }
-
- ++i;
- }
- }
-
- return TRUE;
-}
-
-static void
-bus_matchmaker_remove_rule_link (DBusList **rules,
- DBusList *link)
-{
- BusMatchRule *rule = link->data;
-
- bus_connection_remove_match_rule (rule->matches_go_to, rule);
- _dbus_list_remove_link (rules, link);
-
-#ifdef DBUS_ENABLE_VERBOSE_MODE
- {
- char *s = match_rule_to_string (rule);
-
- _dbus_verbose ("Removed match rule %s for connection %p\n",
- s, rule->matches_go_to);
- dbus_free (s);
- }
-#endif
-
- bus_match_rule_unref (rule);
-}
-
-void
-bus_matchmaker_remove_rule (BusMatchmaker *matchmaker,
- BusMatchRule *rule)
-{
- DBusList **rules;
-
- _dbus_verbose ("Removing rule with message_type %d, interface %s\n",
- rule->message_type,
- rule->interface != NULL ? rule->interface : "<null>");
-
- bus_connection_remove_match_rule (rule->matches_go_to, rule);
-
- rules = bus_matchmaker_get_rules (matchmaker, rule->message_type,
- rule->interface, FALSE);
-
- /* We should only be asked to remove a rule by identity right after it was
- * added, so there should be a list for it.
- */
- _dbus_assert (rules != NULL);
-
- _dbus_list_remove (rules, rule);
- bus_matchmaker_gc_rules (matchmaker, rule->message_type, rule->interface,
- rules);
-
-#ifdef DBUS_ENABLE_VERBOSE_MODE
- {
- char *s = match_rule_to_string (rule);
-
- _dbus_verbose ("Removed match rule %s for connection %p\n",
- s, rule->matches_go_to);
- dbus_free (s);
- }
-#endif
-
- bus_match_rule_unref (rule);
-}
-
-/* Remove a single rule which is equal to the given rule by value */
-dbus_bool_t
-bus_matchmaker_remove_rule_by_value (BusMatchmaker *matchmaker,
- BusMatchRule *value,
- DBusError *error)
-{
- DBusList **rules;
- DBusList *link = NULL;
-
- _dbus_verbose ("Removing rule by value with message_type %d, interface %s\n",
- value->message_type,
- value->interface != NULL ? value->interface : "<null>");
-
- rules = bus_matchmaker_get_rules (matchmaker, value->message_type,
- value->interface, FALSE);
-
- if (rules != NULL)
- {
- /* we traverse backward because bus_connection_remove_match_rule()
- * removes the most-recently-added rule
- */
- link = _dbus_list_get_last_link (rules);
- while (link != NULL)
- {
- BusMatchRule *rule;
- DBusList *prev;
-
- rule = link->data;
- prev = _dbus_list_get_prev_link (rules, link);
-
- if (match_rule_equal (rule, value))
- {
- bus_matchmaker_remove_rule_link (rules, link);
- break;
- }
-
- link = prev;
- }
- }
-
- if (link == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_MATCH_RULE_NOT_FOUND,
- "The given match rule wasn't found and can't be removed");
- return FALSE;
- }
-
- bus_matchmaker_gc_rules (matchmaker, value->message_type, value->interface,
- rules);
-
- return TRUE;
-}
-
-static void
-rule_list_remove_by_connection (DBusList **rules,
- DBusConnection *connection)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (rules);
- while (link != NULL)
- {
- BusMatchRule *rule;
- DBusList *next;
-
- rule = link->data;
- next = _dbus_list_get_next_link (rules, link);
-
- if (rule->matches_go_to == connection)
- {
- bus_matchmaker_remove_rule_link (rules, link);
- }
- else if (((rule->flags & BUS_MATCH_SENDER) && *rule->sender == ':') ||
- ((rule->flags & BUS_MATCH_DESTINATION) && *rule->destination == ':'))
- {
- /* The rule matches to/from a base service, see if it's the
- * one being disconnected, since we know this service name
- * will never be recycled.
- */
- const char *name;
-
- name = bus_connection_get_name (connection);
- _dbus_assert (name != NULL); /* because we're an active connection */
-
- if (((rule->flags & BUS_MATCH_SENDER) &&
- strcmp (rule->sender, name) == 0) ||
- ((rule->flags & BUS_MATCH_DESTINATION) &&
- strcmp (rule->destination, name) == 0))
- {
- bus_matchmaker_remove_rule_link (rules, link);
- }
- }
-
- link = next;
- }
-}
-
-void
-bus_matchmaker_disconnected (BusMatchmaker *matchmaker,
- DBusConnection *connection)
-{
- int i;
-
- /* FIXME
- *
- * This scans all match rules on the bus. We could avoid that
- * for the rules belonging to the connection, since we keep
- * a list of those; but for the rules that just refer to
- * the connection we'd need to do something more elaborate.
- */
-
- _dbus_assert (bus_connection_is_active (connection));
-
- _dbus_verbose ("Removing all rules for connection %p\n", connection);
-
- for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
- {
- RulePool *p = matchmaker->rules_by_type + i;
- DBusHashIter iter;
-
- rule_list_remove_by_connection (&p->rules_without_iface, connection);
-
- _dbus_hash_iter_init (p->rules_by_iface, &iter);
- while (_dbus_hash_iter_next (&iter))
- {
- DBusList **items = _dbus_hash_iter_get_value (&iter);
-
- rule_list_remove_by_connection (items, connection);
-
- if (*items == NULL)
- _dbus_hash_iter_remove_entry (&iter);
- }
- }
-}
-
-static dbus_bool_t
-connection_is_primary_owner (DBusConnection *connection,
- const char *service_name)
-{
- BusService *service;
- DBusString str;
- BusRegistry *registry;
-
- _dbus_assert (connection != NULL);
-
- registry = bus_connection_get_registry (connection);
-
- _dbus_string_init_const (&str, service_name);
- service = bus_registry_lookup (registry, &str);
-
- if (service == NULL)
- return FALSE; /* Service doesn't exist so connection can't own it. */
-
- return bus_service_get_primary_owners_connection (service) == connection;
-}
-
-static dbus_bool_t
-str_has_prefix (const char *str, const char *prefix)
-{
- size_t prefix_len;
- prefix_len = strlen (prefix);
- if (strncmp (str, prefix, prefix_len) == 0)
- return TRUE;
- else
- return FALSE;
-}
-
-static dbus_bool_t
-match_rule_matches (BusMatchRule *rule,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusMessage *message,
- BusMatchFlags already_matched)
-{
- dbus_bool_t wants_to_eavesdrop = FALSE;
- int flags;
-
- /* All features of the match rule are AND'd together,
- * so FALSE if any of them don't match.
- */
-
- /* sender/addressed_recipient of #NULL may mean bus driver,
- * or for addressed_recipient may mean a message with no
- * specific recipient (i.e. a signal)
- */
-
- /* Don't bother re-matching features we've already checked implicitly. */
- flags = rule->flags & (~already_matched);
-
- if (flags & BUS_MATCH_CLIENT_IS_EAVESDROPPING)
- wants_to_eavesdrop = TRUE;
-
- if (flags & BUS_MATCH_MESSAGE_TYPE)
- {
- _dbus_assert (rule->message_type != DBUS_MESSAGE_TYPE_INVALID);
-
- if (rule->message_type != dbus_message_get_type (message))
- return FALSE;
- }
-
- if (flags & BUS_MATCH_INTERFACE)
- {
- const char *iface;
-
- _dbus_assert (rule->interface != NULL);
-
- iface = dbus_message_get_interface (message);
- if (iface == NULL)
- return FALSE;
-
- if (strcmp (iface, rule->interface) != 0)
- return FALSE;
- }
-
- if (flags & BUS_MATCH_MEMBER)
- {
- const char *member;
-
- _dbus_assert (rule->member != NULL);
-
- member = dbus_message_get_member (message);
- if (member == NULL)
- return FALSE;
-
- if (strcmp (member, rule->member) != 0)
- return FALSE;
- }
-
- if (flags & BUS_MATCH_SENDER)
- {
- _dbus_assert (rule->sender != NULL);
-
- if (sender == NULL)
- {
- if (strcmp (rule->sender,
- DBUS_SERVICE_DBUS) != 0)
- return FALSE;
- }
- else
- {
- if (!connection_is_primary_owner (sender, rule->sender))
- return FALSE;
- }
- }
-
- /* Note: this part is relevant for eavesdropper rules:
- * Two cases:
- * 1) rule has a destination to be matched
- * (flag BUS_MATCH_DESTINATION present). Rule will match if:
- * - rule->destination matches the addressed_recipient
- * AND
- * - wants_to_eavesdrop=TRUE
- *
- * Note: (the case in which addressed_recipient is the actual rule owner
- * is handled elsewere in dispatch.c:bus_dispatch_matches().
- *
- * 2) rule has no destination. Rule will match if:
- * - message has no specified destination (ie broadcasts)
- * (Note: this will rule out unicast method calls and unicast signals,
- * fixing FDO#269748)
- * OR
- * - wants_to_eavesdrop=TRUE (destination-catch-all situation)
- */
- if (flags & BUS_MATCH_DESTINATION)
- {
- const char *destination;
-
- _dbus_assert (rule->destination != NULL);
-
- destination = dbus_message_get_destination (message);
- if (destination == NULL)
- /* broadcast, but this rule specified a destination: no match */
- return FALSE;
-
- /* rule owner does not intend to eavesdrop: we'll deliver only msgs
- * directed to it, NOT MATCHING */
- if (!wants_to_eavesdrop)
- return FALSE;
-
- if (addressed_recipient == NULL)
- {
- if (strcmp (rule->destination,
- DBUS_SERVICE_DBUS) != 0)
- return FALSE;
- }
- else
- {
- if (!connection_is_primary_owner (addressed_recipient, rule->destination))
- return FALSE;
- }
- } else { /* no destination in rule */
- dbus_bool_t msg_is_broadcast;
-
- _dbus_assert (rule->destination == NULL);
-
- msg_is_broadcast = (dbus_message_get_destination (message) == NULL);
-
- if (!wants_to_eavesdrop && !msg_is_broadcast)
- return FALSE;
-
- /* if we are here rule owner intends to eavesdrop
- * OR
- * message is being broadcasted */
- }
-
- if (flags & BUS_MATCH_PATH)
- {
- const char *path;
-
- _dbus_assert (rule->path != NULL);
-
- path = dbus_message_get_path (message);
- if (path == NULL)
- return FALSE;
-
- if (strcmp (path, rule->path) != 0)
- return FALSE;
- }
-
- if (flags & BUS_MATCH_PATH_NAMESPACE)
- {
- const char *path;
- int len;
-
- _dbus_assert (rule->path != NULL);
-
- path = dbus_message_get_path (message);
- if (path == NULL)
- return FALSE;
-
- if (!str_has_prefix (path, rule->path))
- return FALSE;
-
- len = strlen (rule->path);
-
- /* Check that the actual argument is within the expected
- * namespace, rather than just starting with that string,
- * by checking that the matched prefix is followed by a '/'
- * or the end of the path.
- *
- * Special case: the only valid path of length 1, "/",
- * matches everything.
- */
- if (len > 1 && path[len] != '\0' && path[len] != '/')
- return FALSE;
- }
-
- if (flags & BUS_MATCH_ARGS)
- {
- int i;
- DBusMessageIter iter;
-
- _dbus_assert (rule->args != NULL);
-
- dbus_message_iter_init (message, &iter);
-
- i = 0;
- while (i < rule->args_len)
- {
- int current_type;
- const char *expected_arg;
- int expected_length;
- dbus_bool_t is_path, is_namespace;
-
- expected_arg = rule->args[i];
- expected_length = rule->arg_lens[i] & ~BUS_MATCH_ARG_FLAGS;
- is_path = (rule->arg_lens[i] & BUS_MATCH_ARG_IS_PATH) != 0;
- is_namespace = (rule->arg_lens[i] & BUS_MATCH_ARG_NAMESPACE) != 0;
-
- current_type = dbus_message_iter_get_arg_type (&iter);
-
- if (expected_arg != NULL)
- {
- const char *actual_arg;
- int actual_length;
-
- if (current_type != DBUS_TYPE_STRING &&
- (!is_path || current_type != DBUS_TYPE_OBJECT_PATH))
- return FALSE;
-
- actual_arg = NULL;
- dbus_message_iter_get_basic (&iter, &actual_arg);
- _dbus_assert (actual_arg != NULL);
-
- actual_length = strlen (actual_arg);
-
- if (is_path)
- {
- if (actual_length < expected_length &&
- actual_arg[actual_length - 1] != '/')
- return FALSE;
-
- if (expected_length < actual_length &&
- expected_arg[expected_length - 1] != '/')
- return FALSE;
-
- if (memcmp (actual_arg, expected_arg,
- MIN (actual_length, expected_length)) != 0)
- return FALSE;
- }
- else if (is_namespace)
- {
- if (expected_length > actual_length)
- return FALSE;
-
- /* If the actual argument doesn't start with the expected
- * namespace, then we don't match.
- */
- if (memcmp (expected_arg, actual_arg, expected_length) != 0)
- return FALSE;
-
- if (expected_length < actual_length)
- {
- /* Check that the actual argument is within the expected
- * namespace, rather than just starting with that string,
- * by checking that the matched prefix ends in a '.'.
- *
- * This doesn't stop "foo.bar." matching "foo.bar..baz"
- * which is an invalid namespace, but at some point the
- * daemon can't cover up for broken services.
- */
- if (actual_arg[expected_length] != '.')
- return FALSE;
- }
- /* otherwise we had an exact match. */
- }
- else
- {
- if (expected_length != actual_length ||
- memcmp (expected_arg, actual_arg, expected_length) != 0)
- return FALSE;
- }
-
- }
-
- if (current_type != DBUS_TYPE_INVALID)
- dbus_message_iter_next (&iter);
-
- ++i;
- }
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-get_recipients_from_list (DBusList **rules,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusMessage *message,
- DBusList **recipients_p)
-{
- DBusList *link;
-
- if (rules == NULL)
- return TRUE;
-
- link = _dbus_list_get_first_link (rules);
- while (link != NULL)
- {
- BusMatchRule *rule;
-
- rule = link->data;
-
-#ifdef DBUS_ENABLE_VERBOSE_MODE
- {
- char *s = match_rule_to_string (rule);
-
- _dbus_verbose ("Checking whether message matches rule %s for connection %p\n",
- s, rule->matches_go_to);
- dbus_free (s);
- }
-#endif
-
- if (match_rule_matches (rule,
- sender, addressed_recipient, message,
- BUS_MATCH_MESSAGE_TYPE | BUS_MATCH_INTERFACE))
- {
- _dbus_verbose ("Rule matched\n");
-
- /* Append to the list if we haven't already */
- if (bus_connection_mark_stamp (rule->matches_go_to))
- {
- if (!_dbus_list_append (recipients_p, rule->matches_go_to))
- return FALSE;
- }
- else
- {
- _dbus_verbose ("Connection already receiving this message, so not adding again\n");
- }
- }
-
- link = _dbus_list_get_next_link (rules, link);
- }
-
- return TRUE;
-}
-
-dbus_bool_t
-bus_matchmaker_get_recipients (BusMatchmaker *matchmaker,
- BusConnections *connections,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusMessage *message,
- DBusList **recipients_p)
-{
- int type;
- const char *interface;
- DBusList **neither, **just_type, **just_iface, **both;
-
- _dbus_assert (*recipients_p == NULL);
-
- /* This avoids sending same message to the same connection twice.
- * Purpose of the stamp instead of a bool is to avoid iterating over
- * all connections resetting the bool each time.
- */
- bus_connections_increment_stamp (connections);
-
- /* addressed_recipient is already receiving the message, don't add to list.
- * NULL addressed_recipient means either bus driver, or this is a signal
- * and thus lacks a specific addressed_recipient.
- */
- if (addressed_recipient != NULL)
- bus_connection_mark_stamp (addressed_recipient);
-
- type = dbus_message_get_type (message);
- interface = dbus_message_get_interface (message);
-
- neither = bus_matchmaker_get_rules (matchmaker, DBUS_MESSAGE_TYPE_INVALID,
- NULL, FALSE);
- just_type = just_iface = both = NULL;
-
- if (interface != NULL)
- just_iface = bus_matchmaker_get_rules (matchmaker,
- DBUS_MESSAGE_TYPE_INVALID, interface, FALSE);
-
- if (type > DBUS_MESSAGE_TYPE_INVALID && type < DBUS_NUM_MESSAGE_TYPES)
- {
- just_type = bus_matchmaker_get_rules (matchmaker, type, NULL, FALSE);
-
- if (interface != NULL)
- both = bus_matchmaker_get_rules (matchmaker, type, interface, FALSE);
- }
-
- if (!(get_recipients_from_list (neither, sender, addressed_recipient,
- message, recipients_p) &&
- get_recipients_from_list (just_iface, sender, addressed_recipient,
- message, recipients_p) &&
- get_recipients_from_list (just_type, sender, addressed_recipient,
- message, recipients_p) &&
- get_recipients_from_list (both, sender, addressed_recipient,
- message, recipients_p)))
- {
- _dbus_list_clear (recipients_p);
- return FALSE;
- }
-
- return TRUE;
-}
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-#include "test.h"
-#include <stdlib.h>
-
-static BusMatchRule*
-check_parse (dbus_bool_t should_succeed,
- const char *text)
-{
- BusMatchRule *rule;
- DBusString str;
- DBusError error;
-
- dbus_error_init (&error);
-
- _dbus_string_init_const (&str, text);
-
- rule = bus_match_rule_parse (NULL, &str, &error);
- if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- dbus_error_free (&error);
- return NULL;
- }
-
- if (should_succeed && rule == NULL)
- {
- _dbus_warn ("Failed to parse: %s: %s: \"%s\"\n",
- error.name, error.message,
- _dbus_string_get_const_data (&str));
- exit (1);
- }
-
- if (!should_succeed && rule != NULL)
- {
- _dbus_warn ("Failed to fail to parse: \"%s\"\n",
- _dbus_string_get_const_data (&str));
- exit (1);
- }
-
- dbus_error_free (&error);
-
- return rule;
-}
-
-static void
-assert_large_rule (BusMatchRule *rule)
-{
- _dbus_assert (rule->flags & BUS_MATCH_MESSAGE_TYPE);
- _dbus_assert (rule->flags & BUS_MATCH_SENDER);
- _dbus_assert (rule->flags & BUS_MATCH_INTERFACE);
- _dbus_assert (rule->flags & BUS_MATCH_MEMBER);
- _dbus_assert (rule->flags & BUS_MATCH_DESTINATION);
- _dbus_assert (rule->flags & BUS_MATCH_PATH);
-
- _dbus_assert (rule->message_type == DBUS_MESSAGE_TYPE_SIGNAL);
- _dbus_assert (rule->interface != NULL);
- _dbus_assert (rule->member != NULL);
- _dbus_assert (rule->sender != NULL);
- _dbus_assert (rule->destination != NULL);
- _dbus_assert (rule->path != NULL);
-
- _dbus_assert (strcmp (rule->interface, "org.freedesktop.DBusInterface") == 0);
- _dbus_assert (strcmp (rule->sender, "org.freedesktop.DBusSender") == 0);
- _dbus_assert (strcmp (rule->member, "Foo") == 0);
- _dbus_assert (strcmp (rule->path, "/bar/foo") == 0);
- _dbus_assert (strcmp (rule->destination, ":452345.34") == 0);
-}
-
-static dbus_bool_t
-test_parsing (void *data)
-{
- BusMatchRule *rule;
-
- rule = check_parse (TRUE, "type='signal',sender='org.freedesktop.DBusSender',interface='org.freedesktop.DBusInterface',member='Foo',path='/bar/foo',destination=':452345.34'");
- if (rule != NULL)
- {
- assert_large_rule (rule);
- bus_match_rule_unref (rule);
- }
-
- /* With extra whitespace and useless quotes */
- rule = check_parse (TRUE, " type='signal', \tsender='org.freedes''ktop.DBusSender', interface='org.freedesktop.DBusInterface''''', \tmember='Foo',path='/bar/foo',destination=':452345.34'''''");
- if (rule != NULL)
- {
- assert_large_rule (rule);
- bus_match_rule_unref (rule);
- }
-
-
- /* A simple signal connection */
- rule = check_parse (TRUE, "type='signal',path='/foo',interface='org.Bar'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags & BUS_MATCH_MESSAGE_TYPE);
- _dbus_assert (rule->flags & BUS_MATCH_INTERFACE);
- _dbus_assert (rule->flags & BUS_MATCH_PATH);
-
- _dbus_assert (rule->message_type == DBUS_MESSAGE_TYPE_SIGNAL);
- _dbus_assert (rule->interface != NULL);
- _dbus_assert (rule->path != NULL);
-
- _dbus_assert (strcmp (rule->interface, "org.Bar") == 0);
- _dbus_assert (strcmp (rule->path, "/foo") == 0);
-
- bus_match_rule_unref (rule);
- }
-
- /* argN */
- rule = check_parse (TRUE, "arg0='foo'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == BUS_MATCH_ARGS);
- _dbus_assert (rule->args != NULL);
- _dbus_assert (rule->args_len == 1);
- _dbus_assert (rule->args[0] != NULL);
- _dbus_assert (rule->args[1] == NULL);
- _dbus_assert (strcmp (rule->args[0], "foo") == 0);
-
- bus_match_rule_unref (rule);
- }
-
- rule = check_parse (TRUE, "arg1='foo'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == BUS_MATCH_ARGS);
- _dbus_assert (rule->args != NULL);
- _dbus_assert (rule->args_len == 2);
- _dbus_assert (rule->args[0] == NULL);
- _dbus_assert (rule->args[1] != NULL);
- _dbus_assert (rule->args[2] == NULL);
- _dbus_assert (strcmp (rule->args[1], "foo") == 0);
-
- bus_match_rule_unref (rule);
- }
-
- rule = check_parse (TRUE, "arg2='foo'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == BUS_MATCH_ARGS);
- _dbus_assert (rule->args != NULL);
- _dbus_assert (rule->args_len == 3);
- _dbus_assert (rule->args[0] == NULL);
- _dbus_assert (rule->args[1] == NULL);
- _dbus_assert (rule->args[2] != NULL);
- _dbus_assert (rule->args[3] == NULL);
- _dbus_assert (strcmp (rule->args[2], "foo") == 0);
-
- bus_match_rule_unref (rule);
- }
-
- rule = check_parse (TRUE, "arg40='foo'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == BUS_MATCH_ARGS);
- _dbus_assert (rule->args != NULL);
- _dbus_assert (rule->args_len == 41);
- _dbus_assert (rule->args[0] == NULL);
- _dbus_assert (rule->args[1] == NULL);
- _dbus_assert (rule->args[40] != NULL);
- _dbus_assert (rule->args[41] == NULL);
- _dbus_assert (strcmp (rule->args[40], "foo") == 0);
-
- bus_match_rule_unref (rule);
- }
-
- rule = check_parse (TRUE, "arg63='foo'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == BUS_MATCH_ARGS);
- _dbus_assert (rule->args != NULL);
- _dbus_assert (rule->args_len == 64);
- _dbus_assert (rule->args[0] == NULL);
- _dbus_assert (rule->args[1] == NULL);
- _dbus_assert (rule->args[63] != NULL);
- _dbus_assert (rule->args[64] == NULL);
- _dbus_assert (strcmp (rule->args[63], "foo") == 0);
-
- bus_match_rule_unref (rule);
- }
-
- rule = check_parse (TRUE, "arg7path='/foo'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags = BUS_MATCH_ARGS);
- _dbus_assert (rule->args != NULL);
- _dbus_assert (rule->args_len == 8);
- _dbus_assert (rule->args[7] != NULL);
- _dbus_assert (rule->args[8] == NULL);
- _dbus_assert (strcmp (rule->args[7], "/foo") == 0);
- _dbus_assert ((rule->arg_lens[7] & BUS_MATCH_ARG_IS_PATH)
- == BUS_MATCH_ARG_IS_PATH);
-
- bus_match_rule_unref (rule);
- }
-
- /* Arg 0 namespace matches */
- rule = check_parse (TRUE, "arg0namespace='foo'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == BUS_MATCH_ARGS);
- _dbus_assert (rule->args != NULL);
- _dbus_assert (rule->args_len == 1);
- _dbus_assert (strcmp (rule->args[0], "foo") == 0);
- _dbus_assert ((rule->arg_lens[0] & BUS_MATCH_ARG_NAMESPACE)
- == BUS_MATCH_ARG_NAMESPACE);
-
- bus_match_rule_unref (rule);
- }
-
- rule = check_parse (TRUE, "arg0namespace='foo.bar'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == BUS_MATCH_ARGS);
- _dbus_assert (rule->args != NULL);
- _dbus_assert (rule->args_len == 1);
- _dbus_assert (strcmp (rule->args[0], "foo.bar") == 0);
- _dbus_assert ((rule->arg_lens[0] & BUS_MATCH_ARG_NAMESPACE)
- == BUS_MATCH_ARG_NAMESPACE);
-
- bus_match_rule_unref (rule);
- }
-
- /* Only arg0namespace is supported. */
- rule = check_parse (FALSE, "arg1namespace='foo'");
- _dbus_assert (rule == NULL);
-
- /* An empty string isn't a valid namespace prefix (you should just not
- * specify this key at all).
- */
- rule = check_parse (FALSE, "arg0namespace=''");
- _dbus_assert (rule == NULL);
-
- /* Trailing periods aren't allowed (earlier versions of the arg0namespace
- * spec allowed a single trailing period, which altered the semantics) */
- rule = check_parse (FALSE, "arg0namespace='foo.'");
- _dbus_assert (rule == NULL);
-
- rule = check_parse (FALSE, "arg0namespace='foo.bar.'");
- _dbus_assert (rule == NULL);
-
- rule = check_parse (FALSE, "arg0namespace='foo..'");
- _dbus_assert (rule == NULL);
-
- rule = check_parse (FALSE, "arg0namespace='foo.bar..'");
- _dbus_assert (rule == NULL);
-
- /* Too-large argN */
- rule = check_parse (FALSE, "arg300='foo'");
- _dbus_assert (rule == NULL);
- rule = check_parse (FALSE, "arg64='foo'");
- _dbus_assert (rule == NULL);
-
- /* No N in argN */
- rule = check_parse (FALSE, "arg='foo'");
- _dbus_assert (rule == NULL);
- rule = check_parse (FALSE, "argv='foo'");
- _dbus_assert (rule == NULL);
- rule = check_parse (FALSE, "arg3junk='foo'");
- _dbus_assert (rule == NULL);
- rule = check_parse (FALSE, "argument='foo'");
- _dbus_assert (rule == NULL);
-
- /* Reject duplicates */
- rule = check_parse (FALSE, "type='signal',type='method_call'");
- _dbus_assert (rule == NULL);
-
- rule = check_parse (TRUE, "path_namespace='/foo/bar'");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == BUS_MATCH_PATH_NAMESPACE);
- _dbus_assert (rule->path != NULL);
- _dbus_assert (strcmp (rule->path, "/foo/bar") == 0);
-
- bus_match_rule_unref (rule);
- }
-
- /* Almost a duplicate */
- rule = check_parse (FALSE, "path='/foo',path_namespace='/foo'");
- _dbus_assert (rule == NULL);
-
- /* Trailing / was supported in the initial proposal, but now isn't */
- rule = check_parse (FALSE, "path_namespace='/foo/'");
- _dbus_assert (rule == NULL);
-
- /* Duplicates with the argN code */
- rule = check_parse (FALSE, "arg0='foo',arg0='bar'");
- _dbus_assert (rule == NULL);
- rule = check_parse (FALSE, "arg3='foo',arg3='bar'");
- _dbus_assert (rule == NULL);
- rule = check_parse (FALSE, "arg30='foo',arg30='bar'");
- _dbus_assert (rule == NULL);
-
- /* Reject broken keys */
- rule = check_parse (FALSE, "blah='signal'");
- _dbus_assert (rule == NULL);
-
- /* Reject broken values */
- rule = check_parse (FALSE, "type='chouin'");
- _dbus_assert (rule == NULL);
- rule = check_parse (FALSE, "interface='abc@def++'");
- _dbus_assert (rule == NULL);
- rule = check_parse (FALSE, "service='youpi'");
- _dbus_assert (rule == NULL);
-
- /* Allow empty rule */
- rule = check_parse (TRUE, "");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == 0);
-
- bus_match_rule_unref (rule);
- }
-
- /* All-whitespace rule is the same as empty */
- rule = check_parse (TRUE, " \t");
- if (rule != NULL)
- {
- _dbus_assert (rule->flags == 0);
-
- bus_match_rule_unref (rule);
- }
-
- /* But with non-whitespace chars and no =value, it's not OK */
- rule = check_parse (FALSE, "type");
- _dbus_assert (rule == NULL);
-
- return TRUE;
-}
-
-static struct {
- const char *first;
- const char *second;
-} equality_tests[] = {
- { "type='signal'", "type='signal'" },
- { "type='signal',interface='foo.bar'", "interface='foo.bar',type='signal'" },
- { "type='signal',member='bar'", "member='bar',type='signal'" },
- { "type='method_call',sender=':1.0'", "sender=':1.0',type='method_call'" },
- { "type='method_call',destination=':1.0'", "destination=':1.0',type='method_call'" },
- { "type='method_call',path='/foo/bar'", "path='/foo/bar',type='method_call'" },
- { "type='method_call',arg0='blah'", "arg0='blah',type='method_call'" },
- { "type='method_call',arg0='boo'", "arg0='boo',type='method_call'" },
- { "type='method_call',arg0='blah',arg1='baz'", "arg0='blah',arg1='baz',type='method_call'" },
- { "type='method_call',arg3='foosh'", "arg3='foosh',type='method_call'" },
- { "arg3='fool'", "arg3='fool'" },
- { "arg0namespace='fool'", "arg0namespace='fool'" },
- { "member='food'", "member='food'" }
-};
-
-static void
-test_equality (void)
-{
- int i;
-
- i = 0;
- while (i < _DBUS_N_ELEMENTS (equality_tests))
- {
- BusMatchRule *first;
- BusMatchRule *second;
- int j;
-
- first = check_parse (TRUE, equality_tests[i].first);
- _dbus_assert (first != NULL);
- second = check_parse (TRUE, equality_tests[i].second);
- _dbus_assert (second != NULL);
-
- if (!match_rule_equal (first, second))
- {
- _dbus_warn ("rule %s and %s should have been equal\n",
- equality_tests[i].first,
- equality_tests[i].second);
- exit (1);
- }
-
- bus_match_rule_unref (second);
-
- /* Check that the rule is not equal to any of the
- * others besides its pair match
- */
- j = 0;
- while (j < _DBUS_N_ELEMENTS (equality_tests))
- {
- if (i != j)
- {
- second = check_parse (TRUE, equality_tests[j].second);
-
- if (match_rule_equal (first, second))
- {
- _dbus_warn ("rule %s and %s should not have been equal\n",
- equality_tests[i].first,
- equality_tests[j].second);
- exit (1);
- }
-
- bus_match_rule_unref (second);
- }
-
- ++j;
- }
-
- bus_match_rule_unref (first);
-
- ++i;
- }
-}
-
-static const char*
-should_match_message_1[] = {
- "type='signal'",
- "member='Frobated'",
- "arg0='foobar'",
- "type='signal',member='Frobated'",
- "type='signal',member='Frobated',arg0='foobar'",
- "member='Frobated',arg0='foobar'",
- "type='signal',arg0='foobar'",
- /* The definition of argXpath matches says: "As with normal argument matches,
- * if the argument is exactly equal to the string given in the match rule
- * then the rule is satisfied." So this should match (even though the
- * argument is not a valid path)!
- */
- "arg0path='foobar'",
- "arg0namespace='foobar'",
- NULL
-};
-
-static const char*
-should_not_match_message_1[] = {
- "type='method_call'",
- "type='error'",
- "type='method_return'",
- "type='signal',member='Oopsed'",
- "arg0='blah'",
- "arg1='foobar'",
- "arg2='foobar'",
- "arg3='foobar'",
- "arg0='3'",
- "arg1='3'",
- "arg0='foobar',arg1='abcdef'",
- "arg0='foobar',arg1='abcdef',arg2='abcdefghi',arg3='abcdefghi',arg4='abcdefghi'",
- "arg0='foobar',arg1='abcdef',arg4='abcdefghi',arg3='abcdefghi',arg2='abcdefghi'",
- "arg0path='foo'",
- "arg0path='foobar/'",
- "arg1path='3'",
- "arg0namespace='foo'",
- "arg0namespace='foo',arg1='abcdef'",
- "arg0namespace='moo'",
- NULL
-};
-
-#define EXAMPLE_NAME "com.example.backend.foo"
-
-static const char *
-should_match_message_2[] = {
- /* EXAMPLE_NAME is in all of these namespaces */
- "arg0namespace='com.example.backend'",
- "arg0namespace='com.example'",
- "arg0namespace='com'",
-
- /* If the client specifies the name exactly, with no trailing period, then
- * it should match.
- */
- "arg0namespace='com.example.backend.foo'",
-
- NULL
-};
-
-static const char *
-should_not_match_message_2[] = {
- /* These are not even prefixes */
- "arg0namespace='com.example.backend.foo.bar'",
- "arg0namespace='com.example.backend.foobar'",
-
- /* These are prefixes, but they're not parent namespaces. */
- "arg0namespace='com.example.backend.fo'",
- "arg0namespace='com.example.backen'",
- "arg0namespace='com.exampl'",
- "arg0namespace='co'",
-
- NULL
-};
-
-static void
-check_matches (dbus_bool_t expected_to_match,
- int number,
- DBusMessage *message,
- const char *rule_text)
-{
- BusMatchRule *rule;
- dbus_bool_t matched;
-
- rule = check_parse (TRUE, rule_text);
- _dbus_assert (rule != NULL);
-
- /* We can't test sender/destination rules since we pass NULL here */
- matched = match_rule_matches (rule, NULL, NULL, message, 0);
-
- if (matched != expected_to_match)
- {
- _dbus_warn ("Expected rule %s to %s message %d, failed\n",
- rule_text, expected_to_match ?
- "match" : "not match", number);
- exit (1);
- }
-
- bus_match_rule_unref (rule);
-}
-
-static void
-check_matching (DBusMessage *message,
- int number,
- const char **should_match,
- const char **should_not_match)
-{
- int i;
-
- i = 0;
- while (should_match[i] != NULL)
- {
- check_matches (TRUE, number, message, should_match[i]);
- ++i;
- }
-
- i = 0;
- while (should_not_match[i] != NULL)
- {
- check_matches (FALSE, number, message, should_not_match[i]);
- ++i;
- }
-}
-
-static void
-test_matching (void)
-{
- DBusMessage *message1, *message2;
- const char *v_STRING;
- dbus_int32_t v_INT32;
-
- message1 = dbus_message_new (DBUS_MESSAGE_TYPE_SIGNAL);
- _dbus_assert (message1 != NULL);
- if (!dbus_message_set_member (message1, "Frobated"))
- _dbus_assert_not_reached ("oom");
-
- v_STRING = "foobar";
- v_INT32 = 3;
- if (!dbus_message_append_args (message1,
- DBUS_TYPE_STRING, &v_STRING,
- DBUS_TYPE_INT32, &v_INT32,
- NULL))
- _dbus_assert_not_reached ("oom");
-
- check_matching (message1, 1,
- should_match_message_1,
- should_not_match_message_1);
-
- dbus_message_unref (message1);
-
- message2 = dbus_message_new (DBUS_MESSAGE_TYPE_SIGNAL);
- _dbus_assert (message2 != NULL);
- if (!dbus_message_set_member (message2, "NameOwnerChanged"))
- _dbus_assert_not_reached ("oom");
-
- /* Obviously this isn't really a NameOwnerChanged signal. */
- v_STRING = EXAMPLE_NAME;
- if (!dbus_message_append_args (message2,
- DBUS_TYPE_STRING, &v_STRING,
- NULL))
- _dbus_assert_not_reached ("oom");
-
- check_matching (message2, 2,
- should_match_message_2,
- should_not_match_message_2);
-
- dbus_message_unref (message2);
-}
-
-#define PATH_MATCH_RULE "arg0path='/aa/bb/'"
-
-/* This is a list of paths that should be matched by PATH_MATCH_RULE, taken
- * from the specification. Notice that not all of them are actually legal D-Bus
- * paths.
- *
- * The author of this test takes no responsibility for the semantics of
- * this match rule key.
- */
-static const char *paths_that_should_be_matched[] = {
- "/aa/",
- "/aa/bb/",
- "/aa/bb/cc/",
-#define FIRST_VALID_PATH_WHICH_SHOULD_MATCH 3
- "/",
- "/aa/bb/cc",
- NULL
-};
-
-/* These paths should not be matched by PATH_MATCH_RULE. */
-static const char *paths_that_should_not_be_matched[] = {
- "/aa/b",
- "/aa",
- /* or even... */
- "/aa/bb",
- NULL
-};
-
-static void
-test_path_match (int type,
- const char *path,
- const char *rule_text,
- BusMatchRule *rule,
- dbus_bool_t should_match)
-{
- DBusMessage *message = dbus_message_new (DBUS_MESSAGE_TYPE_SIGNAL);
- dbus_bool_t matched;
-
- _dbus_assert (message != NULL);
- if (!dbus_message_set_member (message, "Foo"))
- _dbus_assert_not_reached ("oom");
-
- if (!dbus_message_append_args (message,
- type, &path,
- NULL))
- _dbus_assert_not_reached ("oom");
-
- matched = match_rule_matches (rule, NULL, NULL, message, 0);
-
- if (matched != should_match)
- {
- _dbus_warn ("Expected rule %s to %s message "
- "with first arg %s of type '%c', failed\n",
- rule_text,
- should_match ? "match" : "not match",
- path,
- (char) type);
- exit (1);
- }
-
- dbus_message_unref (message);
-}
-
-static void
-test_path_matching (void)
-{
- BusMatchRule *rule;
- const char **s;
-
- rule = check_parse (TRUE, PATH_MATCH_RULE);
- _dbus_assert (rule != NULL);
-
- for (s = paths_that_should_be_matched; *s != NULL; s++)
- test_path_match (DBUS_TYPE_STRING, *s, PATH_MATCH_RULE, rule, TRUE);
-
- for (s = paths_that_should_be_matched + FIRST_VALID_PATH_WHICH_SHOULD_MATCH;
- *s != NULL; s++)
- test_path_match (DBUS_TYPE_OBJECT_PATH, *s, PATH_MATCH_RULE, rule, TRUE);
-
- for (s = paths_that_should_not_be_matched; *s != NULL; s++)
- {
- test_path_match (DBUS_TYPE_STRING, *s, PATH_MATCH_RULE, rule, FALSE);
- test_path_match (DBUS_TYPE_OBJECT_PATH, *s, PATH_MATCH_RULE, rule, FALSE);
- }
-
- bus_match_rule_unref (rule);
-}
-
-static const char*
-path_namespace_should_match_message_1[] = {
- "type='signal',path_namespace='/'",
- "type='signal',path_namespace='/foo'",
- "type='signal',path_namespace='/foo/TheObjectManager'",
- NULL
-};
-
-static const char*
-path_namespace_should_not_match_message_1[] = {
- "type='signal',path_namespace='/bar'",
- "type='signal',path_namespace='/bar/TheObjectManager'",
- NULL
-};
-
-static const char*
-path_namespace_should_match_message_2[] = {
- "type='signal',path_namespace='/'",
- "type='signal',path_namespace='/foo/TheObjectManager'",
- NULL
-};
-
-static const char*
-path_namespace_should_not_match_message_2[] = {
- NULL
-};
-
-static const char*
-path_namespace_should_match_message_3[] = {
- "type='signal',path_namespace='/'",
- NULL
-};
-
-static const char*
-path_namespace_should_not_match_message_3[] = {
- "type='signal',path_namespace='/foo/TheObjectManager'",
- NULL
-};
-
-static const char*
-path_namespace_should_match_message_4[] = {
- "type='signal',path_namespace='/'",
- NULL
-};
-
-static const char*
-path_namespace_should_not_match_message_4[] = {
- "type='signal',path_namespace='/foo/TheObjectManager'",
- NULL
-};
-
-static void
-test_matching_path_namespace (void)
-{
- DBusMessage *message1;
- DBusMessage *message2;
- DBusMessage *message3;
- DBusMessage *message4;
-
- message1 = dbus_message_new (DBUS_MESSAGE_TYPE_SIGNAL);
- _dbus_assert (message1 != NULL);
- if (!dbus_message_set_path (message1, "/foo/TheObjectManager"))
- _dbus_assert_not_reached ("oom");
-
- message2 = dbus_message_new (DBUS_MESSAGE_TYPE_SIGNAL);
- _dbus_assert (message2 != NULL);
- if (!dbus_message_set_path (message2, "/foo/TheObjectManager/child_object"))
- _dbus_assert_not_reached ("oom");
-
- message3 = dbus_message_new (DBUS_MESSAGE_TYPE_SIGNAL);
- _dbus_assert (message3 != NULL);
- if (!dbus_message_set_path (message3, "/foo/TheObjectManagerOther"))
- _dbus_assert_not_reached ("oom");
-
- message4 = dbus_message_new (DBUS_MESSAGE_TYPE_SIGNAL);
- _dbus_assert (message4 != NULL);
- if (!dbus_message_set_path (message4, "/"))
- _dbus_assert_not_reached ("oom");
-
- check_matching (message1, 1,
- path_namespace_should_match_message_1,
- path_namespace_should_not_match_message_1);
- check_matching (message2, 2,
- path_namespace_should_match_message_2,
- path_namespace_should_not_match_message_2);
- check_matching (message3, 3,
- path_namespace_should_match_message_3,
- path_namespace_should_not_match_message_3);
- check_matching (message4, 4,
- path_namespace_should_match_message_4,
- path_namespace_should_not_match_message_4);
-
- dbus_message_unref (message4);
- dbus_message_unref (message3);
- dbus_message_unref (message2);
- dbus_message_unref (message1);
-}
-
-dbus_bool_t
-bus_signals_test (const DBusString *test_data_dir)
-{
- BusMatchmaker *matchmaker;
-
- matchmaker = bus_matchmaker_new ();
- bus_matchmaker_ref (matchmaker);
- bus_matchmaker_unref (matchmaker);
- bus_matchmaker_unref (matchmaker);
-
- if (!_dbus_test_oom_handling ("parsing match rules", test_parsing, NULL))
- _dbus_assert_not_reached ("Parsing match rules test failed");
-
- test_equality ();
- test_matching ();
- test_path_matching ();
- test_matching_path_namespace ();
-
- return TRUE;
-}
-
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
-
diff --git a/src/3rd_party/dbus-1.7.8/bus/signals.h b/src/3rd_party/dbus-1.7.8/bus/signals.h
deleted file mode 100644
index a71d2e45e3..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/signals.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* signals.h Bus signal connection implementation
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_SIGNALS_H
-#define BUS_SIGNALS_H
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-sysdeps.h>
-#include "connection.h"
-
-typedef enum
-{
- BUS_MATCH_MESSAGE_TYPE = 1 << 0,
- BUS_MATCH_INTERFACE = 1 << 1,
- BUS_MATCH_MEMBER = 1 << 2,
- BUS_MATCH_SENDER = 1 << 3,
- BUS_MATCH_DESTINATION = 1 << 4,
- BUS_MATCH_PATH = 1 << 5,
- BUS_MATCH_ARGS = 1 << 6,
- BUS_MATCH_PATH_NAMESPACE = 1 << 7,
- BUS_MATCH_CLIENT_IS_EAVESDROPPING = 1 << 8
-} BusMatchFlags;
-
-BusMatchRule* bus_match_rule_new (DBusConnection *matches_go_to);
-BusMatchRule* bus_match_rule_ref (BusMatchRule *rule);
-void bus_match_rule_unref (BusMatchRule *rule);
-
-dbus_bool_t bus_match_rule_set_message_type (BusMatchRule *rule,
- int type);
-dbus_bool_t bus_match_rule_set_interface (BusMatchRule *rule,
- const char *interface);
-dbus_bool_t bus_match_rule_set_member (BusMatchRule *rule,
- const char *member);
-dbus_bool_t bus_match_rule_set_sender (BusMatchRule *rule,
- const char *sender);
-dbus_bool_t bus_match_rule_set_destination (BusMatchRule *rule,
- const char *destination);
-dbus_bool_t bus_match_rule_set_path (BusMatchRule *rule,
- const char *path,
- dbus_bool_t is_namespace);
-dbus_bool_t bus_match_rule_set_arg (BusMatchRule *rule,
- int arg,
- const DBusString *value,
- dbus_bool_t is_path,
- dbus_bool_t is_namespace);
-
-/* Calling this methods a client declares that it is creating a rule which
- * needs to eavesdrop (e.g., dbus-monitor), any other created rules not
- * setting themselves as eavesdropping won't receive any message not addressed
- * to them, when eavedrop is enabled in the policy. On the other hand, when
- * eavedrop is not enabled in policy, this method won't have any effect */
-void bus_match_rule_set_client_is_eavesdropping (BusMatchRule *rule,
- dbus_bool_t is_eavesdropping);
-
-BusMatchRule* bus_match_rule_parse (DBusConnection *matches_go_to,
- const DBusString *rule_text,
- DBusError *error);
-
-BusMatchmaker* bus_matchmaker_new (void);
-BusMatchmaker* bus_matchmaker_ref (BusMatchmaker *matchmaker);
-void bus_matchmaker_unref (BusMatchmaker *matchmaker);
-
-dbus_bool_t bus_matchmaker_add_rule (BusMatchmaker *matchmaker,
- BusMatchRule *rule);
-dbus_bool_t bus_matchmaker_remove_rule_by_value (BusMatchmaker *matchmaker,
- BusMatchRule *value,
- DBusError *error);
-void bus_matchmaker_remove_rule (BusMatchmaker *matchmaker,
- BusMatchRule *rule);
-void bus_matchmaker_disconnected (BusMatchmaker *matchmaker,
- DBusConnection *connection);
-dbus_bool_t bus_matchmaker_get_recipients (BusMatchmaker *matchmaker,
- BusConnections *connections,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
- DBusMessage *message,
- DBusList **recipients_p);
-
-#endif /* BUS_SIGNALS_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/stats.c b/src/3rd_party/dbus-1.7.8/bus/stats.c
deleted file mode 100644
index ec768ec79f..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/stats.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/* stats.c - statistics from the bus driver
- *
- * Copyright © 2011-2012 Nokia Corporation
- * Copyright © 2012-2013 Collabora Ltd.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#include <config.h>
-#include "stats.h"
-
-#include <dbus/dbus-asv-util.h>
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-connection-internal.h>
-
-#include "connection.h"
-#include "services.h"
-#include "utils.h"
-
-#ifdef DBUS_ENABLE_STATS
-
-dbus_bool_t
-bus_stats_handle_get_stats (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- BusConnections *connections;
- DBusMessage *reply = NULL;
- DBusMessageIter iter, arr_iter;
- static dbus_uint32_t stats_serial = 0;
- dbus_uint32_t in_use, in_free_list, allocated;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- connections = bus_transaction_get_connections (transaction);
-
- reply = _dbus_asv_new_method_return (message, &iter, &arr_iter);
-
- if (reply == NULL)
- goto oom;
-
- /* Globals */
-
- _dbus_list_get_stats (&in_use, &in_free_list, &allocated);
-
- if (!_dbus_asv_add_uint32 (&arr_iter, "Serial", stats_serial++) ||
- !_dbus_asv_add_uint32 (&arr_iter, "ListMemPoolUsedBytes", in_use) ||
- !_dbus_asv_add_uint32 (&arr_iter, "ListMemPoolCachedBytes", in_free_list) ||
- !_dbus_asv_add_uint32 (&arr_iter, "ListMemPoolAllocatedBytes", allocated))
- {
- _dbus_asv_abandon (&iter, &arr_iter);
- goto oom;
- }
-
- /* Connections */
-
- if (!_dbus_asv_add_uint32 (&arr_iter, "ActiveConnections",
- bus_connections_get_n_active (connections)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "IncompleteConnections",
- bus_connections_get_n_incomplete (connections)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "MatchRules",
- bus_connections_get_total_match_rules (connections)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakMatchRules",
- bus_connections_get_peak_match_rules (connections)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakMatchRulesPerConnection",
- bus_connections_get_peak_match_rules_per_conn (connections)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "BusNames",
- bus_connections_get_total_bus_names (connections)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakBusNames",
- bus_connections_get_peak_bus_names (connections)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakBusNamesPerConnection",
- bus_connections_get_peak_bus_names_per_conn (connections)))
- {
- _dbus_asv_abandon (&iter, &arr_iter);
- goto oom;
- }
-
- /* end */
-
- if (!_dbus_asv_close (&iter, &arr_iter))
- goto oom;
-
- if (!bus_transaction_send_from_driver (transaction, connection, reply))
- goto oom;
-
- dbus_message_unref (reply);
- return TRUE;
-
-oom:
- if (reply != NULL)
- dbus_message_unref (reply);
-
- BUS_SET_OOM (error);
- return FALSE;
-}
-
-dbus_bool_t
-bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
-{
- const char *bus_name = NULL;
- DBusString bus_name_str;
- DBusMessage *reply = NULL;
- DBusMessageIter iter, arr_iter;
- static dbus_uint32_t stats_serial = 0;
- dbus_uint32_t in_messages, in_bytes, in_fds, in_peak_bytes, in_peak_fds;
- dbus_uint32_t out_messages, out_bytes, out_fds, out_peak_bytes, out_peak_fds;
- BusRegistry *registry;
- BusService *service;
- DBusConnection *stats_connection;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- registry = bus_connection_get_registry (caller_connection);
-
- if (! dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &bus_name,
- DBUS_TYPE_INVALID))
- return FALSE;
-
- _dbus_string_init_const (&bus_name_str, bus_name);
- service = bus_registry_lookup (registry, &bus_name_str);
-
- if (service == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_NAME_HAS_NO_OWNER,
- "Bus name '%s' has no owner", bus_name);
- return FALSE;
- }
-
- stats_connection = bus_service_get_primary_owners_connection (service);
- _dbus_assert (stats_connection != NULL);
-
- reply = _dbus_asv_new_method_return (message, &iter, &arr_iter);
-
- if (reply == NULL)
- goto oom;
-
- /* Bus daemon per-connection stats */
-
- if (!_dbus_asv_add_uint32 (&arr_iter, "Serial", stats_serial++) ||
- !_dbus_asv_add_uint32 (&arr_iter, "MatchRules",
- bus_connection_get_n_match_rules (stats_connection)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakMatchRules",
- bus_connection_get_peak_match_rules (stats_connection)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "BusNames",
- bus_connection_get_n_services_owned (stats_connection)) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakBusNames",
- bus_connection_get_peak_bus_names (stats_connection)) ||
- !_dbus_asv_add_string (&arr_iter, "UniqueName",
- bus_connection_get_name (stats_connection)))
- {
- _dbus_asv_abandon (&iter, &arr_iter);
- goto oom;
- }
-
- /* DBusConnection per-connection stats */
-
- _dbus_connection_get_stats (stats_connection,
- &in_messages, &in_bytes, &in_fds,
- &in_peak_bytes, &in_peak_fds,
- &out_messages, &out_bytes, &out_fds,
- &out_peak_bytes, &out_peak_fds);
-
- if (!_dbus_asv_add_uint32 (&arr_iter, "IncomingMessages", in_messages) ||
- !_dbus_asv_add_uint32 (&arr_iter, "IncomingBytes", in_bytes) ||
- !_dbus_asv_add_uint32 (&arr_iter, "IncomingFDs", in_fds) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakIncomingBytes", in_peak_bytes) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakIncomingFDs", in_peak_fds) ||
- !_dbus_asv_add_uint32 (&arr_iter, "OutgoingMessages", out_messages) ||
- !_dbus_asv_add_uint32 (&arr_iter, "OutgoingBytes", out_bytes) ||
- !_dbus_asv_add_uint32 (&arr_iter, "OutgoingFDs", out_fds) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakOutgoingBytes", out_peak_bytes) ||
- !_dbus_asv_add_uint32 (&arr_iter, "PeakOutgoingFDs", out_peak_fds))
- {
- _dbus_asv_abandon (&iter, &arr_iter);
- goto oom;
- }
-
- /* end */
-
- if (!_dbus_asv_close (&iter, &arr_iter))
- goto oom;
-
- if (!bus_transaction_send_from_driver (transaction, caller_connection,
- reply))
- goto oom;
-
- dbus_message_unref (reply);
- return TRUE;
-
-oom:
- if (reply != NULL)
- dbus_message_unref (reply);
-
- BUS_SET_OOM (error);
- return FALSE;
-}
-
-#endif
diff --git a/src/3rd_party/dbus-1.7.8/bus/stats.h b/src/3rd_party/dbus-1.7.8/bus/stats.h
deleted file mode 100644
index 0f843db59e..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/stats.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* stats.h - statistics from the bus driver
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#ifndef BUS_STATS_H
-#define BUS_STATS_H
-
-#include "bus.h"
-
-#define BUS_INTERFACE_STATS "org.freedesktop.DBus.Debug.Stats"
-
-dbus_bool_t bus_stats_handle_get_stats (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error);
-
-dbus_bool_t bus_stats_handle_get_connection_stats (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error);
-
-#endif /* multiple-inclusion guard */
diff --git a/src/3rd_party/dbus-1.7.8/bus/system.conf.in b/src/3rd_party/dbus-1.7.8/bus/system.conf.in
deleted file mode 100644
index 92f4cc420f..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/system.conf.in
+++ /dev/null
@@ -1,83 +0,0 @@
-<!-- This configuration file controls the systemwide message bus.
- Add a system-local.conf and edit that rather than changing this
- file directly. -->
-
-<!-- Note that there are any number of ways you can hose yourself
- security-wise by screwing up this file; in particular, you
- probably don't want to listen on any more addresses, add any more
- auth mechanisms, run as a different user, etc. -->
-
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
-
- <!-- Our well-known bus type, do not change this -->
- <type>system</type>
-
- <!-- Run as special user -->
- <user>@DBUS_USER@</user>
-
- <!-- Fork into daemon mode -->
- <fork/>
-
- <!-- We use system service launching using a helper -->
- <standard_system_servicedirs/>
-
- <!-- This is a setuid helper that is used to launch system services -->
- <servicehelper>@DBUS_LIBEXECDIR@/dbus-daemon-launch-helper</servicehelper>
-
- <!-- Write a pid file -->
- <pidfile>@DBUS_SYSTEM_PID_FILE@</pidfile>
-
- <!-- Enable logging to syslog -->
- <syslog/>
-
- <!-- Only allow socket-credentials-based authentication -->
- <auth>EXTERNAL</auth>
-
- <!-- Only listen on a local socket. (abstract=/path/to/socket
- means use abstract namespace, don't really create filesystem
- file; only Linux supports this. Use path=/whatever on other
- systems.) -->
- <listen>@DBUS_SYSTEM_BUS_DEFAULT_ADDRESS@</listen>
-
- <policy context="default">
- <!-- All users can connect to system bus -->
- <allow user="*"/>
-
- <!-- Holes must be punched in service configuration files for
- name ownership and sending method calls -->
- <deny own="*"/>
- <deny send_type="method_call"/>
-
- <!-- Signals and reply messages (method returns, errors) are allowed
- by default -->
- <allow send_type="signal"/>
- <allow send_requested_reply="true" send_type="method_return"/>
- <allow send_requested_reply="true" send_type="error"/>
-
- <!-- All messages may be received by default -->
- <allow receive_type="method_call"/>
- <allow receive_type="method_return"/>
- <allow receive_type="error"/>
- <allow receive_type="signal"/>
-
- <!-- Allow anyone to talk to the message bus -->
- <allow send_destination="org.freedesktop.DBus"/>
- <!-- But disallow some specific bus services -->
- <deny send_destination="org.freedesktop.DBus"
- send_interface="org.freedesktop.DBus"
- send_member="UpdateActivationEnvironment"/>
- </policy>
-
- <!-- Config files are placed here that among other things, punch
- holes in the above policy for specific services. -->
- <includedir>system.d</includedir>
-
- <!-- This is included last so local configuration can override what's
- in this standard file -->
- <include ignore_missing="yes">system-local.conf</include>
-
- <include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_contexts</include>
-
-</busconfig>
diff --git a/src/3rd_party/dbus-1.7.8/bus/test-launch-helper.c b/src/3rd_party/dbus-1.7.8/bus/test-launch-helper.c
deleted file mode 100644
index e9ba412ac3..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/test-launch-helper.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* test-main.c main() for the OOM check of the launch helper
- *
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "test.h"
-#include "activation-helper.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-misc.h>
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-static void
-die (const char *failure)
-{
- fprintf (stderr, "Unit test failed: %s\n", failure);
- exit (1);
-}
-
-static void
-check_memleaks (const char *name)
-{
- dbus_shutdown ();
-
- printf ("%s: checking for memleaks\n", name);
- if (_dbus_get_malloc_blocks_outstanding () != 0)
- {
- _dbus_warn ("%d dbus_malloc blocks were not freed\n",
- _dbus_get_malloc_blocks_outstanding ());
- die ("memleaks");
- }
-}
-
-static void
-test_post_hook (const char *name)
-{
- check_memleaks (name);
-}
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
-
-
-#ifdef ACTIVATION_LAUNCHER_DO_OOM
-
-/* returns true if good things happen, or if we get OOM */
-static dbus_bool_t
-bus_activation_helper_oom_test (void *data)
-{
- const char *service;
- DBusError error;
- dbus_bool_t retval;
-
- service = (const char *) data;
- retval = TRUE;
-
- dbus_error_init (&error);
- if (!run_launch_helper (service, &error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (&error);
- /* we failed, but a OOM is good */
- if (!dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
- {
- _dbus_warn ("FAILED SELF TEST: Error: %s\n", error.message);
- retval = FALSE;
- }
- dbus_error_free (&error);
- }
- else
- {
- /* we succeeded, yay! */
- _DBUS_ASSERT_ERROR_IS_CLEAR (&error);
- }
- return retval;
-}
-
-#endif
-
-int
-main (int argc, char **argv)
-{
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
- const char *dir;
- DBusString config_file;
-
- if (argc > 1)
- dir = argv[1];
- else
- dir = _dbus_getenv ("DBUS_TEST_DATA");
-
- if (dir == NULL)
- {
- fprintf (stderr, "Must specify test data directory as argv[1] or in DBUS_TEST_DATA env variable\n");
- return 1;
- }
-
- printf ("%s: Running launch helper OOM checks\n", argv[0]);
-
- if (!_dbus_string_init (&config_file))
- return 1;
- if (!_dbus_string_append (&config_file, dir))
- return 1;
- if (!_dbus_string_append (&config_file, "/valid-config-files-system/debug-allow-all-pass.conf"))
- return 1;
-
- /* use a config file that will actually work... */
- dbus_setenv ("TEST_LAUNCH_HELPER_CONFIG",
- _dbus_string_get_const_data (&config_file));
-
- _dbus_string_free (&config_file);
-
- if (!_dbus_test_oom_handling ("dbus-daemon-launch-helper",
- bus_activation_helper_oom_test,
- "org.freedesktop.DBus.TestSuiteEchoService"))
- die ("OOM failed");
-
- test_post_hook (argv[0]);
-
- printf ("%s: Success\n", argv[0]);
-
- return 0;
-#else /* DBUS_ENABLE_EMBEDDED_TESTS */
-
- printf ("Not compiled with test support\n");
-
- return 0;
-#endif
-}
-
diff --git a/src/3rd_party/dbus-1.7.8/bus/test-main.c b/src/3rd_party/dbus-1.7.8/bus/test-main.c
deleted file mode 100644
index 01d228704c..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/test-main.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* test-main.c main() for make check
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "test.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-sysdeps.h>
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-message-internal.h>
-#include "selinux.h"
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-static void
-die (const char *failure)
-{
- fprintf (stderr, "Unit test failed: %s\n", failure);
- exit (1);
-}
-
-static void
-check_memleaks (const char *name)
-{
- dbus_shutdown ();
-
- printf ("%s: checking for memleaks\n", name);
- if (_dbus_get_malloc_blocks_outstanding () != 0)
- {
- _dbus_warn ("%d dbus_malloc blocks were not freed\n",
- _dbus_get_malloc_blocks_outstanding ());
- die ("memleaks");
- }
-}
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
-
-static DBusInitialFDs *initial_fds = NULL;
-
-static void
-test_pre_hook (void)
-{
-
- if (_dbus_getenv ("DBUS_TEST_SELINUX")
- && (!bus_selinux_pre_init ()
- || !bus_selinux_full_init ()))
- die ("could not init selinux support");
-
- initial_fds = _dbus_check_fdleaks_enter ();
-}
-
-static char *progname = "";
-
-static void
-test_post_hook (void)
-{
- if (_dbus_getenv ("DBUS_TEST_SELINUX"))
- bus_selinux_shutdown ();
- check_memleaks (progname);
-
- _dbus_check_fdleaks_leave (initial_fds);
- initial_fds = NULL;
-}
-
-int
-main (int argc, char **argv)
-{
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
- const char *dir;
- const char *only;
- DBusString test_data_dir;
-
- progname = argv[0];
-
- if (argc > 1)
- dir = argv[1];
- else
- dir = _dbus_getenv ("DBUS_TEST_DATA");
-
- if (argc > 2)
- only = argv[2];
- else
- only = NULL;
-
- if (dir == NULL)
- {
- fprintf (stderr, "Must specify test data directory as argv[1] or in DBUS_TEST_DATA env variable\n");
- return 1;
- }
-
- _dbus_string_init_const (&test_data_dir, dir);
-
- if (!_dbus_threads_init_debug ())
- die ("initializing debug threads");
-
- if (only == NULL || strcmp (only, "expire-list") == 0)
- {
- test_pre_hook ();
- printf ("%s: Running expire list test\n", argv[0]);
- if (!bus_expire_list_test (&test_data_dir))
- die ("expire list");
- test_post_hook ();
- }
-
- if (only == NULL || strcmp (only, "config-parser") == 0)
- {
- test_pre_hook ();
- printf ("%s: Running config file parser test\n", argv[0]);
- if (!bus_config_parser_test (&test_data_dir))
- die ("parser");
- test_post_hook ();
- }
-
- if (only == NULL || strcmp (only, "signals") == 0)
- {
- test_pre_hook ();
- printf ("%s: Running signals test\n", argv[0]);
- if (!bus_signals_test (&test_data_dir))
- die ("signals");
- test_post_hook ();
- }
-
- if (only == NULL || strcmp (only, "dispatch-sha1") == 0)
- {
- test_pre_hook ();
- printf ("%s: Running SHA1 connection test\n", argv[0]);
- if (!bus_dispatch_sha1_test (&test_data_dir))
- die ("sha1");
- test_post_hook ();
- }
-
- if (only == NULL || strcmp (only, "dispatch") == 0)
- {
- test_pre_hook ();
- printf ("%s: Running message dispatch test\n", argv[0]);
- if (!bus_dispatch_test (&test_data_dir))
- die ("dispatch");
- test_post_hook ();
- }
-
- if (only == NULL || strcmp (only, "activation-service-reload") == 0)
- {
- test_pre_hook ();
- printf ("%s: Running service files reloading test\n", argv[0]);
- if (!bus_activation_service_reload_test (&test_data_dir))
- die ("service reload");
- test_post_hook ();
- }
-
-#ifdef HAVE_UNIX_FD_PASSING
- if (only == NULL || strcmp (only, "unix-fds-passing") == 0)
- {
- test_pre_hook ();
- printf ("%s: Running unix fd passing test\n", argv[0]);
- if (!bus_unix_fds_passing_test (&test_data_dir))
- die ("unix fd passing");
- test_post_hook ();
- }
-#endif
-
- printf ("%s: Success\n", argv[0]);
-
-
- return 0;
-#else /* DBUS_ENABLE_EMBEDDED_TESTS */
-
- printf ("Not compiled with test support\n");
-
- return 0;
-#endif
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/test-system.c b/src/3rd_party/dbus-1.7.8/bus/test-system.c
deleted file mode 100644
index 5f02d0ab42..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/test-system.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu" -*- */
-/* test-main.c main() for make check
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "test.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-sysdeps.h>
-#include <dbus/dbus-internals.h>
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-static void
-die (const char *failure)
-{
- fprintf (stderr, "Unit test failed: %s\n", failure);
- exit (1);
-}
-
-static void
-check_memleaks (const char *name)
-{
- dbus_shutdown ();
-
- printf ("%s: checking for memleaks\n", name);
- if (_dbus_get_malloc_blocks_outstanding () != 0)
- {
- _dbus_warn ("%d dbus_malloc blocks were not freed\n",
- _dbus_get_malloc_blocks_outstanding ());
- die ("memleaks");
- }
-}
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
-
-static void
-test_pre_hook (void)
-{
-}
-
-static char *progname = "";
-static void
-test_post_hook (void)
-{
- check_memleaks (progname);
-}
-
-int
-main (int argc, char **argv)
-{
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
- const char *dir;
- DBusString test_data_dir;
-
- progname = argv[0];
-
- if (argc > 1)
- dir = argv[1];
- else
- dir = _dbus_getenv ("DBUS_TEST_DATA");
-
- if (dir == NULL)
- {
- fprintf (stderr, "Must specify test data directory as argv[1] or in DBUS_TEST_DATA env variable\n");
- return 1;
- }
-
- _dbus_string_init_const (&test_data_dir, dir);
-
- if (!_dbus_threads_init_debug ())
- die ("initializing debug threads");
-
- test_pre_hook ();
- printf ("%s: Running config file parser (trivial) test\n", argv[0]);
- if (!bus_config_parser_trivial_test (&test_data_dir))
- die ("parser");
- test_post_hook ();
-
- printf ("%s: Success\n", argv[0]);
-
- return 0;
-#else /* DBUS_ENABLE_EMBEDDED_TESTS */
-
- printf ("Not compiled with test support\n");
-
- return 0;
-#endif
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/test.c b/src/3rd_party/dbus-1.7.8/bus/test.c
deleted file mode 100644
index 31ef4c8fc6..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/test.c
+++ /dev/null
@@ -1,315 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* test.c unit test routines
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-#include "test.h"
-#include <dbus/dbus-internals.h>
-#include <dbus/dbus-list.h>
-#include <dbus/dbus-sysdeps.h>
-
-/* The "debug client" watch/timeout handlers don't dispatch messages,
- * as we manually pull them in order to verify them. This is why they
- * are different from the real handlers in connection.c
- */
-static DBusList *clients = NULL;
-static DBusLoop *client_loop = NULL;
-
-static dbus_bool_t
-add_client_watch (DBusWatch *watch,
- void *data)
-{
- return _dbus_loop_add_watch (client_loop, watch);
-}
-
-static void
-remove_client_watch (DBusWatch *watch,
- void *data)
-{
- _dbus_loop_remove_watch (client_loop, watch);
-}
-
-static void
-toggle_client_watch (DBusWatch *watch,
- void *data)
-{
- _dbus_loop_toggle_watch (client_loop, watch);
-}
-
-static dbus_bool_t
-add_client_timeout (DBusTimeout *timeout,
- void *data)
-{
- return _dbus_loop_add_timeout (client_loop, timeout);
-}
-
-static void
-remove_client_timeout (DBusTimeout *timeout,
- void *data)
-{
- _dbus_loop_remove_timeout (client_loop, timeout);
-}
-
-static DBusHandlerResult
-client_disconnect_filter (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- if (!dbus_message_is_signal (message,
- DBUS_INTERFACE_LOCAL,
- "Disconnected"))
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
- _dbus_verbose ("Removing client %p in disconnect handler\n",
- connection);
-
- _dbus_list_remove (&clients, connection);
-
- dbus_connection_unref (connection);
-
- if (clients == NULL)
- {
- _dbus_loop_unref (client_loop);
- client_loop = NULL;
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-dbus_bool_t
-bus_setup_debug_client (DBusConnection *connection)
-{
- dbus_bool_t retval;
-
- if (!dbus_connection_add_filter (connection,
- client_disconnect_filter,
- NULL, NULL))
- return FALSE;
-
- retval = FALSE;
-
- if (client_loop == NULL)
- {
- client_loop = _dbus_loop_new ();
- if (client_loop == NULL)
- goto out;
- }
-
- if (!dbus_connection_set_watch_functions (connection,
- add_client_watch,
- remove_client_watch,
- toggle_client_watch,
- connection,
- NULL))
- goto out;
-
- if (!dbus_connection_set_timeout_functions (connection,
- add_client_timeout,
- remove_client_timeout,
- NULL,
- connection, NULL))
- goto out;
-
- if (!_dbus_list_append (&clients, connection))
- goto out;
-
- retval = TRUE;
-
- out:
- if (!retval)
- {
- dbus_connection_remove_filter (connection,
- client_disconnect_filter,
- NULL);
-
- dbus_connection_set_watch_functions (connection,
- NULL, NULL, NULL, NULL, NULL);
- dbus_connection_set_timeout_functions (connection,
- NULL, NULL, NULL, NULL, NULL);
-
- _dbus_list_remove_last (&clients, connection);
-
- if (clients == NULL)
- {
- _dbus_loop_unref (client_loop);
- client_loop = NULL;
- }
- }
-
- return retval;
-}
-
-void
-bus_test_clients_foreach (BusConnectionForeachFunction function,
- void *data)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (&clients);
- while (link != NULL)
- {
- DBusConnection *connection = link->data;
- DBusList *next = _dbus_list_get_next_link (&clients, link);
-
- if (!(* function) (connection, data))
- break;
-
- link = next;
- }
-}
-
-dbus_bool_t
-bus_test_client_listed (DBusConnection *connection)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (&clients);
- while (link != NULL)
- {
- DBusConnection *c = link->data;
- DBusList *next = _dbus_list_get_next_link (&clients, link);
-
- if (c == connection)
- return TRUE;
-
- link = next;
- }
-
- return FALSE;
-}
-
-void
-bus_test_run_clients_loop (dbus_bool_t block_once)
-{
- if (client_loop == NULL)
- return;
-
- _dbus_verbose ("---> Dispatching on \"client side\"\n");
-
- /* dispatch before we block so pending dispatches
- * won't make our block return early
- */
- _dbus_loop_dispatch (client_loop);
-
- /* Do one blocking wait, since we're expecting data */
- if (block_once)
- {
- _dbus_verbose ("---> blocking on \"client side\"\n");
- _dbus_loop_iterate (client_loop, TRUE);
- }
-
- /* Then mop everything up */
- while (_dbus_loop_iterate (client_loop, FALSE))
- ;
-
- _dbus_verbose ("---> Done dispatching on \"client side\"\n");
-}
-
-void
-bus_test_run_bus_loop (BusContext *context,
- dbus_bool_t block_once)
-{
- _dbus_verbose ("---> Dispatching on \"server side\"\n");
-
- /* dispatch before we block so pending dispatches
- * won't make our block return early
- */
- _dbus_loop_dispatch (bus_context_get_loop (context));
-
- /* Do one blocking wait, since we're expecting data */
- if (block_once)
- {
- _dbus_verbose ("---> blocking on \"server side\"\n");
- _dbus_loop_iterate (bus_context_get_loop (context), TRUE);
- }
-
- /* Then mop everything up */
- while (_dbus_loop_iterate (bus_context_get_loop (context), FALSE))
- ;
-
- _dbus_verbose ("---> Done dispatching on \"server side\"\n");
-}
-
-void
-bus_test_run_everything (BusContext *context)
-{
- while (_dbus_loop_iterate (bus_context_get_loop (context), FALSE) ||
- (client_loop == NULL || _dbus_loop_iterate (client_loop, FALSE)))
- ;
-}
-
-BusContext*
-bus_context_new_test (const DBusString *test_data_dir,
- const char *filename)
-{
- DBusError error;
- DBusString config_file;
- DBusString relative;
- BusContext *context;
-
- if (!_dbus_string_init (&config_file))
- {
- _dbus_warn ("No memory\n");
- return NULL;
- }
-
- if (!_dbus_string_copy (test_data_dir, 0,
- &config_file, 0))
- {
- _dbus_warn ("No memory\n");
- _dbus_string_free (&config_file);
- return NULL;
- }
-
- _dbus_string_init_const (&relative, filename);
-
- if (!_dbus_concat_dir_and_file (&config_file, &relative))
- {
- _dbus_warn ("No memory\n");
- _dbus_string_free (&config_file);
- return NULL;
- }
-
- dbus_error_init (&error);
- context = bus_context_new (&config_file, BUS_CONTEXT_FLAG_NONE, NULL, NULL, NULL, &error);
- if (context == NULL)
- {
- _DBUS_ASSERT_ERROR_IS_SET (&error);
-
- _dbus_warn ("Failed to create debug bus context from configuration file %s: %s\n",
- filename, error.message);
-
- dbus_error_free (&error);
-
- _dbus_string_free (&config_file);
-
- return NULL;
- }
-
- _dbus_string_free (&config_file);
-
- return context;
-}
-
-#endif
diff --git a/src/3rd_party/dbus-1.7.8/bus/test.h b/src/3rd_party/dbus-1.7.8/bus/test.h
deleted file mode 100644
index 38b74e89cf..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/test.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* test.h unit test routines
- *
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_TEST_H
-#define BUS_TEST_H
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-string.h>
-#include "connection.h"
-
-dbus_bool_t bus_dispatch_test (const DBusString *test_data_dir);
-dbus_bool_t bus_dispatch_sha1_test (const DBusString *test_data_dir);
-dbus_bool_t bus_config_parser_test (const DBusString *test_data_dir);
-dbus_bool_t bus_config_parser_trivial_test (const DBusString *test_data_dir);
-dbus_bool_t bus_signals_test (const DBusString *test_data_dir);
-dbus_bool_t bus_expire_list_test (const DBusString *test_data_dir);
-dbus_bool_t bus_activation_service_reload_test (const DBusString *test_data_dir);
-dbus_bool_t bus_setup_debug_client (DBusConnection *connection);
-void bus_test_clients_foreach (BusConnectionForeachFunction function,
- void *data);
-dbus_bool_t bus_test_client_listed (DBusConnection *connection);
-void bus_test_run_bus_loop (BusContext *context,
- dbus_bool_t block);
-void bus_test_run_clients_loop (dbus_bool_t block);
-void bus_test_run_everything (BusContext *context);
-BusContext* bus_context_new_test (const DBusString *test_data_dir,
- const char *filename);
-
-#ifdef HAVE_UNIX_FD_PASSING
-dbus_bool_t bus_unix_fds_passing_test (const DBusString *test_data_dir);
-#endif
-
-#endif
-
-#endif /* BUS_TEST_H */
diff --git a/src/3rd_party/dbus-1.7.8/bus/utils.c b/src/3rd_party/dbus-1.7.8/bus/utils.c
deleted file mode 100644
index 7d24872741..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/utils.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* utils.c General utility functions
- *
- * Copyright (C) 2003 CodeFactory AB
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <config.h>
-#include "utils.h"
-#include <dbus/dbus-sysdeps.h>
-#include <dbus/dbus-mainloop.h>
-
-const char bus_no_memory_message[] = "Memory allocation failure in message bus";
-
-void
-bus_connection_dispatch_all_messages (DBusConnection *connection)
-{
- while (bus_connection_dispatch_one_message (connection))
- ;
-}
-
-dbus_bool_t
-bus_connection_dispatch_one_message (DBusConnection *connection)
-{
- DBusDispatchStatus status;
-
- while ((status = dbus_connection_dispatch (connection)) == DBUS_DISPATCH_NEED_MEMORY)
- _dbus_wait_for_memory ();
-
- return status == DBUS_DISPATCH_DATA_REMAINS;
-}
diff --git a/src/3rd_party/dbus-1.7.8/bus/utils.h b/src/3rd_party/dbus-1.7.8/bus/utils.h
deleted file mode 100644
index f533895ff2..0000000000
--- a/src/3rd_party/dbus-1.7.8/bus/utils.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/* utils.h General utility functions
- *
- * Copyright (C) 2003 CodeFactory AB
- * Copyright (C) 2003 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifndef BUS_UTILS_H
-#define BUS_UTILS_H
-
-#include <dbus/dbus.h>
-
-extern const char bus_no_memory_message[];
-#define BUS_SET_OOM(error) dbus_set_error_const ((error), DBUS_ERROR_NO_MEMORY, bus_no_memory_message)
-
-void bus_connection_dispatch_all_messages (DBusConnection *connection);
-dbus_bool_t bus_connection_dispatch_one_message (DBusConnection *connection);
-
-#endif /* BUS_UTILS_H */