[44934] trunk/dports/devel

illogic-al at macports.org illogic-al at macports.org
Sun Jan 4 13:30:28 PST 2009


Revision: 44934
          http://trac.macports.org/changeset/44934
Author:   illogic-al at macports.org
Date:     2009-01-04 13:30:28 -0800 (Sun, 04 Jan 2009)
Log Message:
-----------
New Portfile dbus-legacy being introduced and maintained, by moi. 
This port contains patches to dbus which allow launching using dbus via launchd. This will allow KDE ports to work with dbus-X11. 
Once https://bugs.freedesktop.org/show_bug.cgi?id=14259 gets merged to trunkwe can do away with this. All kde4 portfiles should depend on dbus-legacy.

Added Paths:
-----------
    trunk/dports/devel/dbus-legacy/
    trunk/dports/devel/dbus-legacy/Portfile
    trunk/dports/devel/dbus-legacy/files/
    trunk/dports/devel/dbus-legacy/files/dbus-launchd-modified.patch

Added: trunk/dports/devel/dbus-legacy/Portfile
===================================================================
--- trunk/dports/devel/dbus-legacy/Portfile	                        (rev 0)
+++ trunk/dports/devel/dbus-legacy/Portfile	2009-01-04 21:30:28 UTC (rev 44934)
@@ -0,0 +1,107 @@
+PortSystem      1.0
+
+name            dbus-legacy
+version         1.2.4
+revision        0
+maintainers     illogic-al
+categories      devel
+platforms       darwin
+description     A message bus system, a simple way for applications to talk to one another.
+long_description \
+    ${description} This is the older 1.2.4 version which has been patched \
+    to work with launchd. 
+distname        dbus-${version}
+
+homepage        http://www.freedesktop.org/Software/dbus
+master_sites    http://dbus.freedesktop.org/releases/dbus
+
+checksums       md5     2e643910a09f44b000a0d76038637999 \
+                sha1    913d796b79802b6ee6ca2b0ef59c670f3fd79774 \
+                rmd160  0441eb8b668ed70250e484b02fe6a83c05c9a088
+
+depends_build 	port:pkgconfig \
+		port:libtool \
+		port:automake
+
+depends_lib     port:expat
+
+patchfiles	dbus-launchd-modified.patch
+patch.pre_args	-p1
+
+configure.args  --mandir=${prefix}/share/man \
+                --disable-tests \
+                --disable-doxygen-docs \
+                --disable-xml-docs \
+                --enable-kqueue \
+                --enable-launchd \
+                --without-x \
+                --with-dbus-daemondir=${prefix}/bin
+    
+configure.cflags-append -no-cpp-precomp
+#configure.cflags-append -flat_namespace
+
+use_parallel_build  yes
+
+test.run        yes
+test.target     check
+
+# We need to regenerate configure from a patched configure.in
+pre-configure {
+    system "cd ${worksrcpath} && autoreconf"
+}
+
+post-configure {
+    copy -force ${prefix}/bin/glibtool ${worksrcpath}/libtool
+}
+
+pre-test {
+    if {![variant_isset test]} {
+        ui_error "test variant must be activated to enable test support."
+        error "Please enable test variant."
+    }
+}
+
+post-destroot {
+    file mkdir ${destroot}${prefix}/share/dbus-1/services
+    file mkdir ${destroot}${prefix}/var/run/dbus
+    file mkdir ${destroot}${prefix}/var/lib/dbus
+    file mkdir ${destroot}${prefix}/etc/dbus-1/system.d
+    file mkdir ${destroot}${prefix}/etc/dbus-1/session.d
+}
+
+destroot.keepdirs \
+    ${destroot}${prefix}/share/dbus-1/services \
+    ${destroot}${prefix}/var/run/dbus \
+    ${destroot}${prefix}/var/lib/dbus \
+    ${destroot}${prefix}/etc/dbus-1/system.d \
+    ${destroot}${prefix}/etc/dbus-1/session.d
+
+startupitem.create  yes
+startupitem.name    dbus
+startupitem.init    XDG_DATA_DIRS=${prefix}/share
+startupitem.start   "${prefix}/bin/dbus-daemon --system"
+startupitem.stop    "kill `cat ${prefix}/var/run/dbus/pid`"
+startupitem.restart "kill `cat ${prefix}/var/run/dbus/pid` ; ${prefix}/bin/dbus-daemon --system"
+
+pre-activate {
+    addgroup messagebus
+    adduser messagebus gid=[existsgroup messagebus] realname=Message\ Bus
+}
+
+post-activate {
+    file attributes ${prefix}/var/run/dbus -group messagebus -owner messagebus
+    file attributes ${prefix}/libexec/dbus-daemon-launch-helper -group messagebus
+    system "${prefix}/bin/dbus-uuidgen --ensure"
+}
+
+variant test {
+    configure.args-delete   --disable-tests
+    configure.args-append   --enable-tests
+}
+
+platform darwin 7 {
+    configure.args-delete   --enable-kqueue
+}
+
+livecheck.check regex
+livecheck.regex {D-Bus (\d+(?:\.\d+)*)}


Property changes on: trunk/dports/devel/dbus-legacy/Portfile
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

Added: trunk/dports/devel/dbus-legacy/files/dbus-launchd-modified.patch
===================================================================
--- trunk/dports/devel/dbus-legacy/files/dbus-launchd-modified.patch	                        (rev 0)
+++ trunk/dports/devel/dbus-legacy/files/dbus-launchd-modified.patch	2009-01-04 21:30:28 UTC (rev 44934)
@@ -0,0 +1,585 @@
+diff --git a/bus/Makefile.am b/bus/Makefile.am
+index 3b4f69d..420742b 100644
+--- a/bus/Makefile.am
++++ b/bus/Makefile.am
+@@ -9,12 +9,18 @@ EFENCE=
+ 
+ CONFIG_IN_FILES=				\
+ 	session.conf.in				\
+-	system.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
++
+ if DBUS_USE_LIBXML
+ XML_SOURCES=config-loader-libxml.c
+ endif
+diff --git a/bus/org.freedesktop.dbus-session.plist.in b/bus/org.freedesktop.dbus-session.plist.in
+new file mode 100644
+index 0000000..6f1ad8e
+--- /dev/null
++++ b/bus/org.freedesktop.dbus-session.plist.in
+@@ -0,0 +1,31 @@
++<?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/>
++
++	<!-- bug in 10.4's launchd - on-demand loading does not work -->
++	<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>session</key>
++		<dict>
++			<key>SecureSocketWithKey</key>
++			<string>DBUS_LAUNCHD_SESSION_BUS_SOCKET</string>
++		</dict>
++	</dict>
++</dict>
++</plist>
+diff --git a/bus/session.conf.in b/bus/session.conf.in
+index b2dee5b..ea29849 100644
+--- a/bus/session.conf.in
++++ b/bus/session.conf.in
+@@ -8,7 +8,7 @@
+   <!-- Our well-known bus type, don't change this -->
+   <type>session</type>
+ 
+-  <listen>unix:tmpdir=@DBUS_SESSION_SOCKET_DIR@</listen>
++  <listen>@DBUS_SESSION_BUS_DEFAULT_ADDRESS@</listen>
+ 
+   <standard_session_servicedirs />
+ 
+diff --git a/configure.in b/configure.in
+index d38f6d9..fa94197 100644
+--- a/configure.in
++++ b/configure.in
+@@ -78,6 +78,7 @@ AC_ARG_ENABLE(inotify, AS_HELP_STRING([--enable-inotify],[build with inotify sup
+ AC_ARG_ENABLE(kqueue, AS_HELP_STRING([--enable-kqueue],[build with kqueue support]),enable_kqueue=$enableval,enable_kqueue=auto)
+ AC_ARG_ENABLE(console-owner-file, AS_HELP_STRING([--enable-console-owner-file],[enable console owner file]),enable_console_owner_file=$enableval,enable_console_owner_file=auto)
+ AC_ARG_ENABLE(userdb-cache, AS_HELP_STRING([--enable-userdb-cache],[build with userdb-cache support]),enable_userdb_cache=$enableval,enable_userdb_cache=yes)
++AC_ARG_ENABLE(launchd, AS_HELP_STRING([--enable-launchd],[build with launchd auto-launch support]),enable_launchd=$enableval,enable_launchd=auto)
+ 
+ AC_ARG_WITH(xml, AS_HELP_STRING([--with-xml=[libxml/expat]],[XML library to use]))
+ AC_ARG_WITH(init-scripts, AS_HELP_STRING([--with-init-scripts=[redhat]],[Style of init scripts to install]))
+@@ -87,6 +88,7 @@ AC_ARG_WITH(system-pid-file, AS_HELP_STRING([--with-system-pid-file=[pidfile]],[
+ AC_ARG_WITH(system-socket, AS_HELP_STRING([--with-system-socket=[filename]],[UNIX domain socket for systemwide daemon]))
+ AC_ARG_WITH(console-auth-dir, AS_HELP_STRING([--with-console-auth-dir=[dirname]],[directory to check for console ownerhip]))
+ AC_ARG_WITH(console-owner-file, AS_HELP_STRING([--with-console-owner-file=[filename]],[file whose owner determines current console owner]))
++AC_ARG_WITH(launchd-agent-dir, AS_HELP_STRING([--with-launchd-agent-dir=[dirname]],[directory to put the launchd agent (default: /Library/LaunchAgents)]))
+ AC_ARG_WITH(dbus_user, AS_HELP_STRING([--with-dbus-user=<user>],[User for running the DBUS daemon (messagebus)]))
+ AC_ARG_WITH(dbus_daemondir, AS_HELP_STRING([--with-dbus-daemondir=[dirname]],[Directory for installing the DBUS daemon]))
+ 
+@@ -991,6 +993,38 @@ fi
+ 
+ AM_CONDITIONAL(DBUS_BUS_ENABLE_KQUEUE, test x$have_kqueue = xyes) 
+ 
++# launchd checks
++if test x$enable_launchd = xno ; then
++    have_launchd=no
++else
++    have_launchd=yes
++    AC_CHECK_HEADER([launch.h], , have_launchd=no)
++    AC_PATH_PROG([LAUNCHCTL], [launchctl])
++    if test "x$LAUNCHCTL" = "x"; then
++        have_launchd=no
++    fi
++
++    if test x$enable_launchd = xyes -a x$have_launchd = xno ; then
++        AC_MSG_ERROR([launchd support explicitly enabled but not available])
++    fi
++fi
++
++dnl check if launchd is enabled
++if test x$have_launchd = xyes; then
++    AC_DEFINE(DBUS_ENABLE_LAUNCHD,1,[Use launchd autolaunch])
++fi
++
++AM_CONDITIONAL(DBUS_ENABLE_LAUNCHD, test x$have_launchd = xyes)
++
++#### Directory to place launchd agent file
++if test "x$with_launchd_agent_dir" = "x"; then
++   LAUNCHD_AGENT_DIR="/Library/LaunchAgents"
++else
++   LAUNCHD_AGENT_DIR="$with_launchd_agent_dir"
++fi
++
++AC_SUBST(LAUNCHD_AGENT_DIR)
++
+ dnl console owner file
+ if test x$enable_console_owner_file = xno ; then
+     have_console_owner_file=no;
+@@ -1313,6 +1347,13 @@ fi
+ AC_DEFINE_UNQUOTED(DBUS_SESSION_SOCKET_DIR, "$DBUS_SESSION_SOCKET_DIR", [Where per-session bus puts its sockets])
+ AC_SUBST(DBUS_SESSION_SOCKET_DIR)
+ 
++if test x$have_launchd = xyes; then
++   DBUS_SESSION_BUS_DEFAULT_ADDRESS="autolaunch:"
++else
++   DBUS_SESSION_BUS_DEFAULT_ADDRESS="unix:tmpdir=$DBUS_SESSION_SOCKET_DIR"
++fi
++AC_SUBST(DBUS_SESSION_BUS_DEFAULT_ADDRESS)
++
+ AC_DEFINE_UNQUOTED(DBUS_UNIX, "1", [Defined on UNIX and Linux systems and not on Windows])
+ 
+ # darwin needs this to initialize the environment
+@@ -1333,6 +1374,7 @@ dbus/dbus-arch-deps.h
+ bus/system.conf
+ bus/session.conf
+ bus/messagebus
++bus/org.freedesktop.dbus-session.plist
+ bus/rc.messagebus
+ bus/dbus-daemon.1
+ Makefile
+@@ -1399,6 +1441,7 @@ echo "
+         Building Doxygen docs:    ${enable_doxygen_docs}
+         Building XML docs:        ${enable_xml_docs}
+         Building cache support:   ${enable_userdb_cache}
++        Building launchd support: ${have_launchd}
+         Gettext libs (empty OK):  ${INTLLIBS}
+         Using XML parser:         ${with_xml}
+         Init scripts style:       ${with_init_scripts}
+@@ -1413,6 +1456,7 @@ echo "
+ 	System bus user:          ${DBUS_USER}
+ 	Session bus services dir: ${EXPANDED_DATADIR}/dbus-1/services
+         'make check' socket dir:  ${TEST_SOCKET_DIR}
++        launchd agent dir:        ${LAUNCHD_AGENT_DIR}
+ "
+ 
+ if test x$enable_tests = xyes; then
+diff --git a/dbus/Makefile.am b/dbus/Makefile.am
+index e966a43..3a9c3ad 100644
+--- a/dbus/Makefile.am
++++ b/dbus/Makefile.am
+@@ -9,6 +9,12 @@ INCLUDES=-I$(top_builddir) -I$(top_srcdir) $(DBUS_CLIENT_CFLAGS) @PIC_CFLAGS@ -D
+ dbusincludedir=$(includedir)/dbus-1.0/dbus
+ dbusarchincludedir=$(libdir)/dbus-1.0/include/dbus
+ 
++if DBUS_ENABLE_LAUNCHD
++LAUNCHD_SOURCES = \
++	dbus-server-launchd.h \
++	dbus-server-launchd.c
++endif
++
+ lib_LTLIBRARIES=libdbus-1.la
+ 
+ dbusinclude_HEADERS=				\
+@@ -92,7 +98,8 @@ DBUS_LIB_SOURCES=				\
+ 	dbus-uuidgen.c				\
+ 	dbus-uuidgen.h				\
+ 	dbus-watch.c				\
+-	dbus-watch.h
++	dbus-watch.h				\
++	$(LAUNCHD_SOURCES)
+ 
+ ##	dbus-md5.c				\
+ ##	dbus-md5.h				\
+diff --git a/dbus/dbus-bus.c b/dbus/dbus-bus.c
+index e159dae..dd0ff4e 100644
+--- a/dbus/dbus-bus.c
++++ b/dbus/dbus-bus.c
+@@ -22,6 +22,7 @@
+  *
+  */
+ 
++#include <config.h>
+ #include "dbus-bus.h"
+ #include "dbus-protocol.h"
+ #include "dbus-internals.h"
+@@ -159,6 +160,10 @@ init_connections_unlocked (void)
+           ++i;
+         }
+ 
++#ifdef DBUS_ENABLE_LAUNCHD
++      _dbus_unix_launchd_initialize_environment();
++#endif
++
+       /* Don't init these twice, we may run this code twice if
+        * init_connections_unlocked() fails midway through.
+        * In practice, each block below should contain only one
+diff --git a/dbus/dbus-server-launchd.c b/dbus/dbus-server-launchd.c
+new file mode 100644
+index 0000000..fce274b
+--- /dev/null
++++ b/dbus/dbus-server-launchd.c
+@@ -0,0 +1,138 @@
++/* dbus-server-launchd.c Server methods for interacting with launchd.
++ * Copyright (C) 2007, Tanner Lovelace <lovelace at wayfarer.org>
++ * Copyright (C) 2008, Benjamin Reed <rangerrick at befunk.com>
++ *
++ * Permission is hereby granted, free of charge, to any person
++ * obtaining a copy of this software and associated documentation
++ * files (the "Software"), to deal in the Software without
++ * restriction, including without limitation the rights to use, copy,
++ * modify, merge, publish, distribute, sublicense, and/or sell copies
++ * of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be
++ * included in all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ */
++
++#include <config.h>
++#include <launch.h>
++#include <errno.h>
++
++#include "dbus-server-socket.h"
++#include "dbus-server-launchd.h"
++
++/**
++ * @defgroup DBusServerLaunchd DBusServer implementations for Launchd
++ * @ingroup  DBusInternals
++ * @brief Implementation details of DBusServer with Launchd support
++ *
++ * @{
++ */
++
++/**
++ * Creates a new server from launchd.
++ *
++ * @param socket_key they key to use when looking up the file descriptor from launchd
++ * @param error location to store reason for failure.
++ * @returns the new server, or #NULL on failure.
++ */
++
++DBusServer*
++_dbus_server_new_for_launchd_fd (const char *socket_key, DBusError *error)
++{
++  DBusServer *server;
++  DBusString address;
++  int launchd_fd;
++  launch_data_t sockets_dict, checkin_response;
++  launch_data_t checkin_request;
++  launch_data_t listening_fd_array, listening_fd;
++
++  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
++
++  if (!_dbus_string_init (&address))
++  {
++    dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
++    return NULL;
++  }
++  if (!_dbus_string_append (&address, "autolaunch:key="))
++  {
++    dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
++    goto l_failed_0;
++  }
++  if (!_dbus_string_append (&address, socket_key))
++  {
++    dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
++    goto l_failed_0;
++  }
++
++  if ((checkin_request = launch_data_new_string(LAUNCH_KEY_CHECKIN)) == NULL) {
++    dbus_set_error (error, DBUS_ERROR_NO_MEMORY, "launch_data_new_string(\"%s\") Unable to create string.\n", LAUNCH_KEY_CHECKIN);
++    goto l_failed_0;
++  }
++
++  if ((checkin_response = launch_msg(checkin_request)) == NULL) {
++    dbus_set_error (error, DBUS_ERROR_IO_ERROR, "launch_msg(\"%s\") IPC failure: %s\n", LAUNCH_KEY_CHECKIN, strerror(errno));
++    goto l_failed_0;
++  }
++
++  if (LAUNCH_DATA_ERRNO == launch_data_get_type(checkin_response)) {
++    dbus_set_error (error, DBUS_ERROR_FAILED, "Check-in failed: %s\n", strerror(launch_data_get_errno(checkin_response)));
++    goto l_failed_0;
++  }
++
++  sockets_dict = launch_data_dict_lookup(checkin_response, LAUNCH_JOBKEY_SOCKETS);
++  if (NULL == sockets_dict) {
++    dbus_set_error (error, DBUS_ERROR_IO_ERROR, "No sockets found to answer requests on!\n");
++    goto l_failed_0;
++  }
++
++  listening_fd_array = launch_data_dict_lookup(sockets_dict, socket_key);
++  if (NULL == listening_fd_array) {
++    dbus_set_error (error, DBUS_ERROR_IO_ERROR, "No known sockets found to answer requests on!\n");
++    goto l_failed_0;
++  }
++
++  if (launch_data_array_get_count(listening_fd_array)!=1) {
++    dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, "Expected 1 socket from launchd, got %d.\n", launch_data_array_get_count(listening_fd_array));
++    goto l_failed_0;
++  }
++
++  listening_fd=launch_data_array_get_index(listening_fd_array, 0);
++  launchd_fd=launch_data_get_fd(listening_fd);
++
++  _dbus_fd_set_close_on_exec (launchd_fd);
++
++  if (launchd_fd < 0)
++  {
++    _DBUS_ASSERT_ERROR_IS_SET (error);
++    goto l_failed_0;
++  }
++
++  server = _dbus_server_new_for_socket (&launchd_fd, 1, &address);
++  if (server == NULL)
++  {
++    dbus_set_error (error, DBUS_ERROR_NO_SERVER, "Unable to listen on launchd fd %d.", launchd_fd);
++    goto l_failed_0;
++  }
++
++  _dbus_string_free (&address);
++
++  return server;
++
++ l_failed_0:
++  _dbus_string_free (&address);
++
++  return NULL;
++}
++
++/** @} */
++
+diff --git a/dbus/dbus-server-launchd.h b/dbus/dbus-server-launchd.h
+new file mode 100644
+index 0000000..1c45aa1
+--- /dev/null
++++ b/dbus/dbus-server-launchd.h
+@@ -0,0 +1,37 @@
++/* dbus-server-launchd.h Server methods for interacting with launchd.
++* Copyright (C) 2008, Benjamin Reed <rangerrick at befunk.com>
++*
++* Permission is hereby granted, free of charge, to any person
++* obtaining a copy of this software and associated documentation
++* files (the "Software"), to deal in the Software without
++* restriction, including without limitation the rights to use, copy,
++* modify, merge, publish, distribute, sublicense, and/or sell copies
++* of the Software, and to permit persons to whom the Software is
++* furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be
++* included in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
++* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
++* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++* DEALINGS IN THE SOFTWARE.
++*/
++
++#ifndef DBUS_SERVER_LAUNCHD_H
++#define DBUS_SERVER_LAUNCHD_H
++
++#include <dbus/dbus-internals.h>
++#include <dbus/dbus-server-protected.h>
++
++DBUS_BEGIN_DECLS
++
++DBusServer* _dbus_server_new_for_launchd_fd (const char *socket_fd, DBusError  *error);
++
++DBUS_END_DECLS
++
++#endif /* DBUS_SERVER_LAUNCHD_H */
+diff --git a/dbus/dbus-server-unix.c b/dbus/dbus-server-unix.c
+index 1dda5d1..ddc0944 100644
+--- a/dbus/dbus-server-unix.c
++++ b/dbus/dbus-server-unix.c
+@@ -21,6 +21,7 @@
+  *
+  */
+ 
++#include <config.h>
+ #include "dbus-internals.h"
+ #include "dbus-server-unix.h"
+ #include "dbus-server-socket.h"
+@@ -29,6 +30,10 @@
+ #include "dbus-sysdeps-unix.h"
+ #include "dbus-string.h"
+ 
++#ifdef DBUS_ENABLE_LAUNCHD
++#include "dbus-server-launchd.h"
++#endif
++
+ /**
+  * @defgroup DBusServerUnix DBusServer implementations for UNIX
+  * @ingroup  DBusInternals
+@@ -145,6 +150,27 @@ _dbus_server_listen_platform_specific (DBusAddressEntry *entry,
+           return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
+         }
+     }
++#ifdef DBUS_ENABLE_LAUNCHD
++  else if (strcmp (method, "autolaunch") == 0)
++    {
++
++      const char *launchd_key = dbus_address_entry_get_value (entry, "key");
++      if (launchd_key == NULL)
++        launchd_key = "session";
++      *server_p = _dbus_server_new_for_launchd_fd (launchd_key, error);
++
++      if (*server_p != NULL)
++        {
++          _DBUS_ASSERT_ERROR_IS_CLEAR(error);
++          return DBUS_SERVER_LISTEN_OK;
++        }
++      else
++        {
++          _DBUS_ASSERT_ERROR_IS_SET(error);
++          return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
++        }
++    }
++#endif 
+   else
+     {
+       /* If we don't handle the method, we return NULL with the
+diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c
+index 19858dd..5bc600d 100644
+--- a/dbus/dbus-sysdeps-unix.c
++++ b/dbus/dbus-sysdeps-unix.c
+@@ -71,6 +71,11 @@
+ #include <ucred.h>
+ #endif
+ 
++#ifdef DBUS_ENABLE_LAUNCHD
++#include <sys/param.h>
++#define DBUS_LAUNCHD_MAX_OUTPUT_LINE MAXPATHLEN + 2
++#endif
++
+ #ifndef O_BINARY
+ #define O_BINARY 0
+ #endif
+@@ -3263,4 +3268,91 @@ _dbus_get_is_errno_eagain_or_ewouldblock (void)
+   return errno == EAGAIN || errno == EWOULDBLOCK;
+ }
+ 
++#ifdef DBUS_ENABLE_LAUNCHD
++/**
++ * Initialization for turning a launchd environment into
++ * DBUS_SESSION_BUS_ADDRESS
++ */
++void
++_dbus_unix_launchd_initialize_environment (void)
++{
++  FILE *launchd = NULL;
++  const char *env_var = NULL;
++  char launchctl_output[DBUS_LAUNCHD_MAX_OUTPUT_LINE];
++  DBusString socket_filename;
++  DBusString session_address;
++
++  if (!_dbus_string_init (&socket_filename))
++    {
++      return;
++    }
++
++  if (!_dbus_string_init (&session_address))
++    goto launchd_finished_0;
++
++  /*
++   * Try to get the dbus session bus address
++   */
++  env_var = _dbus_getenv("DBUS_SESSION_BUS_ADDRESS");
++
++  /*
++   * User has already overridden in the environment.
++   * Use that directly.
++   */
++  if (env_var != NULL && (strlen(env_var) > 0))
++    goto launchd_finished_1;
++
++  /*
++   * User doesn't have the session buss address set
++   * so let's try to get it from launchd.
++   */
++  env_var = _dbus_getenv("DBUS_LAUNCHD_SESSION_BUS_SOCKET");
++
++  if (env_var == NULL || (strlen(env_var) == 0) || access(env_var, W_OK) != 0)
++    {
++      /*
++       * This is a bit of a kludge but it works on both OS X Tiger & Leopard.
++       */
++      launchd = popen("launchctl getenv DBUS_LAUNCHD_SESSION_BUS_SOCKET", "r");
++      if (launchd != NULL && !feof(launchd))
++        {
++          if (_dbus_read(fileno(launchd), &socket_filename, DBUS_LAUNCHD_MAX_OUTPUT_LINE) > 0)
++            {
++              // strip the carriage-return
++              _dbus_string_shorten(&socket_filename, 1);
++
++              env_var = _dbus_string_get_data(&socket_filename);
++            }
++        }
++      /*
++       * Make sure launchd file is closed.
++       */
++      if (launchd != NULL)
++        pclose(launchd);
++    }
++
++  /*
++   * Now that we have the session socket from launchd, set the
++   * DBUS_SESSION_BUS_ADDRESS environment variable.
++   */
++  if (env_var != NULL && strlen(env_var) != 0 && access(env_var, W_OK) == 0)
++    {
++      if (!_dbus_string_append (&session_address, "unix:path="))
++        goto launchd_finished_1;
++
++      if (!_dbus_string_append (&session_address, env_var))
++        goto launchd_finished_1;
++
++      _dbus_setenv("DBUS_SESSION_BUS_ADDRESS", _dbus_string_get_const_data(&session_address));
++    }
++
++ launchd_finished_1:
++  _dbus_string_free(&session_address);
++
++ launchd_finished_0:
++  _dbus_string_free(&socket_filename);
++}
++#endif
++
++
+ /* tests in dbus-sysdeps-util.c */
+diff --git a/dbus/dbus-sysdeps-unix.h b/dbus/dbus-sysdeps-unix.h
+index 0005cd8..b0ba860 100644
+--- a/dbus/dbus-sysdeps-unix.h
++++ b/dbus/dbus-sysdeps-unix.h
+@@ -127,6 +127,13 @@ dbus_gid_t    _dbus_getgid (void);
+ dbus_bool_t _dbus_parse_uid (const DBusString  *uid_str,
+                              dbus_uid_t        *uid);
+ 
++/**
++ * Initialization for turning a launchd environment into
++ * DBUS_SESSION_BUS_ADDRESS
++ */
++void
++_dbus_unix_launchd_initialize_environment (void);
++
+ /** @} */
+ 
+ DBUS_END_DECLS
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20090104/1c283c67/attachment.html>


More information about the macports-changes mailing list