[glib/gdbus-merge] Set up gtk-doc for GDBus



commit c490c14f4e3fbbe8c74b26e6cacac31b0e744c92
Author: David Zeuthen <davidz redhat com>
Date:   Thu May 6 15:31:45 2010 -0400

    Set up gtk-doc for GDBus
    
    Also move send_credentials() and receive_credentials() to
    GUnixConnection. This code might change, discussion is still ongoing
    in
    
     https://bugzilla.gnome.org/show_bug.cgi?id=617483.

 docs/reference/gio/gio-docs.xml     |   21 ++
 docs/reference/gio/gio-sections.txt |  390 +++++++++++++++++++++++++++++++++++
 docs/reference/gio/gio.types        |   11 +
 gio/gcredentials.c                  |    4 +-
 gio/gdbusaddress.c                  |    2 +-
 gio/gdbusauth.c                     |  189 -----------------
 gio/gdbusauthobserver.c             |    2 +-
 gio/gdbusconnection.c               |    8 +-
 gio/gdbuserror.c                    |    2 +-
 gio/gdbusintrospection.c            |    2 +-
 gio/gdbusmessage.c                  |    2 +-
 gio/gdbusmethodinvocation.c         |    2 +-
 gio/gdbusnameowning.c               |    4 +-
 gio/gdbusnamewatching.c             |    4 +-
 gio/gdbusproxy.c                    |    2 +-
 gio/gdbusproxywatching.c            |    4 +-
 gio/gdbusserver.c                   |    4 +-
 gio/gdbusutils.c                    |    2 +-
 gio/gunixconnection.c               |  258 +++++++++++++++++++++++
 gio/gunixconnection.h               |   10 +
 20 files changed, 712 insertions(+), 211 deletions(-)
---
diff --git a/docs/reference/gio/gio-docs.xml b/docs/reference/gio/gio-docs.xml
index 8ea9f38..305dc7a 100644
--- a/docs/reference/gio/gio-docs.xml
+++ b/docs/reference/gio/gio-docs.xml
@@ -107,6 +107,8 @@
       <xi:include href="xml/gsocketcontrolmessage.xml"/>
       <xi:include href="xml/gunixfdlist.xml"/>
       <xi:include href="xml/gunixfdmessage.xml"/>
+      <xi:include href="xml/gcredentials.xml"/>
+      <xi:include href="xml/gunixcredentialsmessage.xml"/>
     </chapter>
     <chapter id="resolver">
       <title>DNS resolution</title>
@@ -124,6 +126,25 @@
       <xi:include href="xml/gsocketservice.xml"/>
       <xi:include href="xml/gthreadedsocketservice.xml"/>
     </chapter>
+    <chapter id="gdbus-lowlevel">
+      <title>Lowlevel D-Bus Support</title>
+      <xi:include href="xml/gdbusutils.xml"/>
+      <xi:include href="xml/gdbusaddress.xml"/>
+      <xi:include href="xml/gdbusintrospection.xml"/>
+      <xi:include href="xml/gdbuserror.xml"/>
+      <xi:include href="xml/gdbusmessage.xml"/>
+      <xi:include href="xml/gdbusconnection.xml"/>
+      <xi:include href="xml/gdbusmethodinvocation.xml"/>
+      <xi:include href="xml/gdbusproxy.xml"/>
+      <xi:include href="xml/gdbusserver.xml"/>
+      <xi:include href="xml/gdbusauthobserver.xml"/>
+    </chapter>
+    <chapter id="gdbus-convenience">
+      <title>Highlevel D-Bus Support</title>
+      <xi:include href="xml/gdbusnameowning.xml"/>
+      <xi:include href="xml/gdbusnamewatching.xml"/>
+      <xi:include href="xml/gdbusproxywatching.xml"/>
+    </chapter>
     <chapter id="utils">
         <title>Utilities</title>
         <xi:include href="xml/gfilenamecompleter.xml"/>
diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt
index fd2c338..06d8199 100644
--- a/docs/reference/gio/gio-sections.txt
+++ b/docs/reference/gio/gio-sections.txt
@@ -1807,6 +1807,8 @@ g_tcp_connection_get_graceful_disconnect
 GUnixConnection
 g_unix_connection_receive_fd
 g_unix_connection_send_fd
+g_unix_connection_receive_credentials
+g_unix_connection_send_credentials
 <SUBSECTION>
 g_socket_connection_factory_create_connection
 g_socket_connection_factory_lookup_type
@@ -2167,3 +2169,391 @@ G_SETTINGS_SCHEMA_GET_CLASS
 <SUBSECTION Private>
 g_settings_get_type
 </SECTION>
+
+<SECTION>
+<FILE>gunixcredentialsmessage</FILE>
+<TITLE>GUnixCredentialsMessage</TITLE>
+GUnixCredentialsMessage
+GUnixCredentialsMessageClass
+g_unix_credentials_message_new
+g_unix_credentials_message_new_with_credentials
+g_unix_credentials_message_get_credentials
+g_unix_credentials_message_is_supported
+<SUBSECTION Standard>
+G_IS_UNIX_CREDENTIALS_MESSAGE
+G_IS_UNIX_CREDENTIALS_MESSAGE_CLASS
+G_TYPE_UNIX_CREDENTIALS_MESSAGE
+G_UNIX_CREDENTIALS_MESSAGE
+G_UNIX_CREDENTIALS_MESSAGE_CLASS
+G_UNIX_CREDENTIALS_MESSAGE_GET_CLASS
+<SUBSECTION Private>
+GUnixCredentialsMessagePrivate
+g_unix_credentials_message_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gcredentials</FILE>
+<TITLE>GCredentials</TITLE>
+GCredentials
+GCredentialsClass
+GCredentialType
+g_credentials_new
+g_credentials_new_for_process
+g_credentials_new_for_string
+g_credentials_to_string
+g_credentials_has_unix_user
+g_credentials_get_unix_user
+g_credentials_set_unix_user
+g_credentials_has_unix_group
+g_credentials_get_unix_group
+g_credentials_set_unix_group
+g_credentials_has_unix_process
+g_credentials_get_unix_process
+g_credentials_set_unix_process
+g_credentials_has_windows_user
+g_credentials_get_windows_user
+g_credentials_set_windows_user
+<SUBSECTION Standard>
+G_CREDENTIALS
+G_IS_CREDENTIALS
+G_TYPE_CREDENTIALS
+g_credentials_get_type
+G_CREDENTIALS_CLASS
+G_IS_CREDENTIALS_CLASS
+G_CREDENTIALS_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gdbusaddress</FILE>
+g_dbus_is_address
+g_dbus_is_supported_address
+g_dbus_address_get_stream
+g_dbus_address_get_stream_finish
+g_dbus_address_get_stream_sync
+g_dbus_address_get_for_bus_sync
+</SECTION>
+
+<SECTION>
+<FILE>gdbusutils</FILE>
+g_dbus_is_activated
+g_dbus_generate_guid
+g_dbus_is_guid
+g_dbus_is_name
+g_dbus_is_unique_name
+g_dbus_is_member_name
+g_dbus_is_interface_name
+</SECTION>
+
+<SECTION>
+<FILE>gdbusauthobserver</FILE>
+<TITLE>GDBusAuthObserver</TITLE>
+GDBusAuthObserver
+GDBusAuthObserverClass
+g_dbus_auth_observer_new
+g_dbus_auth_observer_deny_authenticated_peer
+<SUBSECTION Standard>
+G_DBUS_AUTH_OBSERVER
+G_IS_DBUS_AUTH_OBSERVER
+G_TYPE_DBUS_AUTH_OBSERVER
+g_dbus_server_get_gtype
+G_DBUS_AUTH_OBSERVER_CLASS
+G_IS_DBUS_AUTH_OBSERVER_CLASS
+G_DBUS_AUTH_OBSERVER_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gdbusserver</FILE>
+<TITLE>GDBusServer</TITLE>
+GDBusServer
+GDBusServerClass
+GDBusServerFlags
+g_dbus_server_new_sync
+g_dbus_server_start
+g_dbus_server_stop
+g_dbus_server_is_active
+g_dbus_server_get_guid
+g_dbus_server_get_flags
+g_dbus_server_get_client_address
+<SUBSECTION Standard>
+G_DBUS_SERVER
+G_IS_DBUS_SERVER
+G_TYPE_DBUS_SERVER
+g_dbus_server_get_gtype
+G_DBUS_SERVER_CLASS
+G_IS_DBUS_SERVER_CLASS
+G_DBUS_SERVER_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gdbusmessage</FILE>
+<TITLE>GDBusMessage</TITLE>
+GDBusMessageType
+GDBusMessageFlags
+GDBusMessageHeaderField
+GDBusMessage
+GDBusMessageClass
+g_dbus_message_new
+g_dbus_message_new_signal
+g_dbus_message_new_method_call
+g_dbus_message_new_method_reply
+g_dbus_message_new_method_error
+g_dbus_message_new_method_error_valist
+g_dbus_message_new_method_error_literal
+g_dbus_message_print
+g_dbus_message_get_type
+g_dbus_message_set_type
+g_dbus_message_get_serial
+g_dbus_message_set_serial
+g_dbus_message_get_flags
+g_dbus_message_set_flags
+g_dbus_message_get_body
+g_dbus_message_set_body
+g_dbus_message_get_unix_fd_list
+g_dbus_message_set_unix_fd_list
+g_dbus_message_get_header_fields
+g_dbus_message_get_header
+g_dbus_message_set_header
+g_dbus_message_get_destination
+g_dbus_message_set_destination
+g_dbus_message_get_error_name
+g_dbus_message_set_error_name
+g_dbus_message_get_interface
+g_dbus_message_set_interface
+g_dbus_message_get_member
+g_dbus_message_set_member
+g_dbus_message_get_path
+g_dbus_message_set_path
+g_dbus_message_get_reply_serial
+g_dbus_message_set_reply_serial
+g_dbus_message_get_sender
+g_dbus_message_set_sender
+g_dbus_message_get_signature
+g_dbus_message_set_signature
+g_dbus_message_get_arg0
+g_dbus_message_to_blob
+g_dbus_message_bytes_needed
+g_dbus_message_new_from_blob
+g_dbus_message_to_gerror
+<SUBSECTION Standard>
+G_DBUS_MESSAGE
+G_IS_DBUS_MESSAGE
+G_TYPE_DBUS_MESSAGE
+g_dbus_message_get_gtype
+G_DBUS_MESSAGE_CLASS
+G_IS_DBUS_MESSAGE_CLASS
+G_DBUS_MESSAGE_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gdbusconnection</FILE>
+<TITLE>GDBusConnection</TITLE>
+GBusType
+g_bus_get
+g_bus_get_finish
+g_bus_get_sync
+GDBusConnection
+GDBusConnectionClass
+GDBusConnectionFlags
+g_dbus_connection_new
+g_dbus_connection_new_finish
+g_dbus_connection_new_sync
+g_dbus_connection_new_for_address
+g_dbus_connection_new_for_address_finish
+g_dbus_connection_new_for_address_sync
+GDBusCapabilityFlags
+g_dbus_connection_close
+g_dbus_connection_is_closed
+g_dbus_connection_get_exit_on_close
+g_dbus_connection_set_exit_on_close
+g_dbus_connection_get_stream
+g_dbus_connection_get_guid
+g_dbus_connection_get_unique_name
+g_dbus_connection_get_capabilities
+g_dbus_connection_get_peer_credentials
+GDBusInvokeMethodFlags
+g_dbus_connection_invoke_method
+g_dbus_connection_invoke_method_finish
+g_dbus_connection_invoke_method_sync
+g_dbus_connection_emit_signal
+GDBusSignalCallback
+g_dbus_connection_signal_subscribe
+g_dbus_connection_signal_unsubscribe
+g_dbus_connection_send_message
+g_dbus_connection_send_message_with_reply
+g_dbus_connection_send_message_with_reply_finish
+g_dbus_connection_send_message_with_reply_sync
+GDBusMessageFilterFunction
+g_dbus_connection_add_filter
+g_dbus_connection_remove_filter
+GDBusInterfaceVTable
+GDBusInterfaceMethodCallFunc
+GDBusInterfaceGetPropertyFunc
+GDBusInterfaceSetPropertyFunc
+g_dbus_connection_register_object
+g_dbus_connection_unregister_object
+GDBusSubtreeVTable
+GDBusSubtreeEnumerateFunc
+GDBusSubtreeIntrospectFunc
+GDBusSubtreeDispatchFunc
+GDBusSubtreeFlags
+g_dbus_connection_register_subtree
+g_dbus_connection_unregister_subtree
+<SUBSECTION Standard>
+G_DBUS_CONNECTION
+G_IS_DBUS_CONNECTION
+G_TYPE_DBUS_CONNECTION
+g_dbus_connection_get_type
+G_DBUS_CONNECTION_CLASS
+G_IS_DBUS_CONNECTION_CLASS
+G_DBUS_CONNECTION_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gdbusmethodinvocation</FILE>
+<TITLE>GDBusMethodInvocation</TITLE>
+GDBusMethodInvocation
+GDBusMethodInvocationClass
+g_dbus_method_invocation_new
+g_dbus_method_invocation_get_sender
+g_dbus_method_invocation_get_object_path
+g_dbus_method_invocation_get_interface_name
+g_dbus_method_invocation_get_method_name
+g_dbus_method_invocation_get_method_info
+g_dbus_method_invocation_get_connection
+g_dbus_method_invocation_get_message
+g_dbus_method_invocation_get_parameters
+g_dbus_method_invocation_get_user_data
+g_dbus_method_invocation_return_value
+g_dbus_method_invocation_return_error
+g_dbus_method_invocation_return_error_valist
+g_dbus_method_invocation_return_error_literal
+g_dbus_method_invocation_return_gerror
+g_dbus_method_invocation_return_dbus_error
+<SUBSECTION Standard>
+G_DBUS_METHOD_INVOCATION
+G_IS_DBUS_METHOD_INVOCATION
+G_TYPE_DBUS_METHOD_INVOCATION
+g_dbus_method_invocation_get_type
+G_DBUS_METHOD_INVOCATION_CLASS
+G_IS_DBUS_METHOD_INVOCATION_CLASS
+G_DBUS_METHOD_INVOCATION_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gdbusnameowning</FILE>
+GBusAcquiredCallback
+GBusNameAcquiredCallback
+GBusNameLostCallback
+GBusNameOwnerFlags
+g_bus_own_name
+g_bus_own_name_on_connection
+g_bus_unown_name
+</SECTION>
+
+<SECTION>
+<FILE>gdbusnamewatching</FILE>
+GBusNameAppearedCallback
+GBusNameVanishedCallback
+GBusNameWatcherFlags
+g_bus_watch_name
+g_bus_unwatch_name
+</SECTION>
+
+<SECTION>
+<FILE>gdbusproxywatching</FILE>
+GBusProxyAppearedCallback
+GBusProxyVanishedCallback
+g_bus_watch_proxy
+g_bus_unwatch_proxy
+</SECTION>
+
+<SECTION>
+<FILE>gdbuserror</FILE>
+GDBusError
+G_DBUS_ERROR
+g_dbus_error_is_remote_error
+g_dbus_error_get_remote_error
+g_dbus_error_strip_remote_error
+GDBusErrorEntry
+g_dbus_error_register_error_domain
+g_dbus_error_register_error
+g_dbus_error_unregister_error
+g_dbus_error_new_for_dbus_error
+g_dbus_error_set_dbus_error
+g_dbus_error_set_dbus_error_valist
+g_dbus_error_encode_gerror
+</SECTION>
+
+<SECTION>
+<FILE>gdbusproxy</FILE>
+<TITLE>GDBusProxy</TITLE>
+GDBusProxyFlags
+GDBusProxy
+GDBusProxyClass
+g_dbus_proxy_new
+g_dbus_proxy_new_finish
+g_dbus_proxy_new_sync
+g_dbus_proxy_get_flags
+g_dbus_proxy_get_connection
+g_dbus_proxy_get_unique_bus_name
+g_dbus_proxy_get_object_path
+g_dbus_proxy_get_interface_name
+g_dbus_proxy_get_default_timeout
+g_dbus_proxy_set_default_timeout
+g_dbus_proxy_get_cached_property_names
+g_dbus_proxy_get_cached_property
+g_dbus_proxy_set_interface_info
+g_dbus_proxy_get_interface_info
+g_dbus_proxy_invoke_method
+g_dbus_proxy_invoke_method_finish
+g_dbus_proxy_invoke_method_sync
+<SUBSECTION Standard>
+G_DBUS_PROXY
+G_IS_DBUS_PROXY
+G_TYPE_DBUS_PROXY
+g_dbus_proxy_get_type
+G_DBUS_PROXY_CLASS
+G_IS_DBUS_PROXY_CLASS
+G_DBUS_PROXY_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gdbusintrospection</FILE>
+GDBusAnnotationInfo
+GDBusArgInfo
+GDBusMethodInfo
+GDBusSignalInfo
+GDBusPropertyInfoFlags
+GDBusPropertyInfo
+GDBusInterfaceInfo
+GDBusNodeInfo
+g_dbus_annotation_info_lookup
+g_dbus_interface_info_lookup_method
+g_dbus_interface_info_lookup_signal
+g_dbus_interface_info_lookup_property
+g_dbus_interface_info_generate_xml
+g_dbus_node_info_new_for_xml
+g_dbus_node_info_lookup_interface
+g_dbus_node_info_generate_xml
+G_TYPE_DBUS_NODE_INFO
+G_TYPE_DBUS_INTERFACE_INFO
+G_TYPE_DBUS_METHOD_INFO
+G_TYPE_DBUS_SIGNAL_INFO
+G_TYPE_DBUS_PROPERTY_INFO
+G_TYPE_DBUS_ARG_INFO
+G_TYPE_DBUS_ANNOTATION_INFO
+g_dbus_node_info_ref
+g_dbus_interface_info_ref
+g_dbus_method_info_ref
+g_dbus_signal_info_ref
+g_dbus_property_info_ref
+g_dbus_arg_info_ref
+g_dbus_annotation_info_ref
+g_dbus_node_info_unref
+g_dbus_interface_info_unref
+g_dbus_method_info_unref
+g_dbus_signal_info_unref
+g_dbus_property_info_unref
+g_dbus_arg_info_unref
+g_dbus_annotation_info_unref
+</SECTION>
diff --git a/docs/reference/gio/gio.types b/docs/reference/gio/gio.types
index e8f9738..e1d65a9 100644
--- a/docs/reference/gio/gio.types
+++ b/docs/reference/gio/gio.types
@@ -107,3 +107,14 @@ g_volume_monitor_get_type
 g_zlib_compressor_get_type
 g_zlib_compressor_format_get_type
 g_zlib_decompressor_get_type
+g_dbus_message_get_gtype
+g_dbus_connection_get_type
+g_bus_type_get_type
+g_bus_name_owner_flags_get_type
+g_dbus_error_get_type
+g_dbus_proxy_get_type
+g_dbus_method_invocation_get_type
+g_dbus_server_get_type
+g_dbus_auth_observer_get_type
+g_credentials_get_type
+g_unix_credentials_message_get_type
diff --git a/gio/gcredentials.c b/gio/gcredentials.c
index e1712fe..1ca2543 100644
--- a/gio/gcredentials.c
+++ b/gio/gcredentials.c
@@ -36,8 +36,8 @@
 
 /**
  * SECTION:gcredentials
- * @short_description: Credentials
- * @include: gdbus/gdbus.h
+ * @short_description: An object containing credentials
+ * @include: gio/gio.h
  *
  * The #GCredentials type is used for storing information that can be
  * used for identifying, authenticating and authorizing processes.
diff --git a/gio/gdbusaddress.c b/gio/gdbusaddress.c
index e50e737..6cfa5f9 100644
--- a/gio/gdbusaddress.c
+++ b/gio/gdbusaddress.c
@@ -40,7 +40,7 @@
  * SECTION:gdbusaddress
  * @title: D-Bus Addresses
  * @short_description: D-Bus connection endpoints
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * Routines for working with D-Bus addresses.
  */
diff --git a/gio/gdbusauth.c b/gio/gdbusauth.c
index 850db9a..2d47060 100644
--- a/gio/gdbusauth.c
+++ b/gio/gdbusauth.c
@@ -78,195 +78,6 @@ debug_print (const gchar *message, ...)
 #endif
 }
 
-
-/* ---------------------------------------------------------------------------------------------------- */
-/* TODO: move to gio */
-
-/**
- * g_unix_connection_send_credentials:
- * @connection: A #GUnixConnection.
- * @credentials: A #GCredentials to send.
- * @cancellable: A #GCancellable or %NULL.
- * @error: Return location for error or %NULL.
- *
- * Passes the credentials stored in @credentials to the recieving side
- * of the connection. The recieving end has to call
- * g_unix_connection_receive_credentials() (or similar) to accept the
- * credentials.
- *
- * The credentials which the sender specifies are checked by the
- * kernel.  A process with effective user ID 0 is allowed to specify
- * values that do not match its own. This means that the credentials
- * can be used to authenticate other connections.
- *
- * As well as sending the credentials this also writes a single NUL
- * byte to the stream, as this is required for credentials passing to
- * work on some implementations.
- *
- * Returns: %TRUE on success, %FALSE if @error is set.
- *
- * Since: 2.26
- */
-static gboolean
-g_unix_connection_send_credentials (GUnixConnection      *connection,
-                                    GCredentials         *credentials,
-                                    GCancellable         *cancellable,
-                                    GError              **error)
-{
-  GSocketControlMessage *scm;
-  GSocket *socket;
-  gboolean ret;
-  GOutputVector vector;
-  guchar nul_byte[1] = {'\0'};
-
-  g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), FALSE);
-  g_return_val_if_fail (G_IS_CREDENTIALS (credentials), FALSE);
-  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-  ret = FALSE;
-
-  vector.buffer = &nul_byte;
-  vector.size = 1;
-  scm = g_unix_credentials_message_new_with_credentials (credentials);
-  g_object_get (connection, "socket", &socket, NULL);
-  if (g_socket_send_message (socket,
-                             NULL, /* address */
-                             &vector,
-                             1,
-                             &scm,
-                             1,
-                             G_SOCKET_MSG_NONE,
-                             cancellable,
-                             error) != 1)
-    {
-      g_prefix_error (error, _("Error sending credentials: "));
-      goto out;
-    }
-
-  ret = TRUE;
-
- out:
-  g_object_unref (socket);
-  g_object_unref (scm);
-  return ret;
-}
-
-/**
- * g_unix_connection_receive_credentials:
- * @connection: A #GUnixConnection.
- * @cancellable: A #GCancellable or %NULL.
- * @error: Return location for error or %NULL.
- *
- * Receives credentials from the sending end of the connection.  The
- * sending end has to call g_unix_connection_send_credentials() (or
- * similar) for this to work.
- *
- * As well as reading the credentials this also reads (and discards) a
- * single byte from the stream, as this is required for credentials
- * passing to work on some implementations.
- *
- * Returns: Received credentials on success (free with
- * g_object_unref()), %NULL if @error is set.
- *
- * Since: 2.26
- */
-static GCredentials *
-g_unix_connection_receive_credentials (GUnixConnection      *connection,
-                                       GCancellable         *cancellable,
-                                       GError              **error)
-{
-  GCredentials *ret;
-  GSocketControlMessage **scms;
-  gint nscm;
-  GSocket *socket;
-  gint n;
-  volatile GType credentials_message_gtype;
-  gssize num_bytes_read;
-
-  g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), NULL);
-  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-  ret = NULL;
-  scms = NULL;
-
-  g_object_get (connection, "socket", &socket, NULL);
-
-#if 1
-  /* TODO: Move this to gsocket.c... */
-  {
-    int opt_val = 1;
-    if (setsockopt (g_socket_get_fd (socket),
-                    SOL_SOCKET,
-                    SO_PASSCRED,
-                    &opt_val,
-                    sizeof opt_val) != 0)
-      {
-        g_warning ("boo, error setting SO_PASSCRED: %m");
-      }
-  }
-#endif
-
-  /* ensure the type of GUnixCredentialsMessage has been registered with the type system */
-  credentials_message_gtype = G_TYPE_UNIX_CREDENTIALS_MESSAGE;
-  num_bytes_read = g_socket_receive_message (socket,
-                                             NULL, /* GSocketAddress **address */
-                                             NULL,
-                                             0,
-                                             &scms,
-                                             &nscm,
-                                             NULL,
-                                             cancellable,
-                                             error);
-  if (num_bytes_read != 1)
-    {
-      /* Handle situation where g_socket_receive_message() returns
-       * 0 bytes and not setting @error
-       */
-      if (num_bytes_read == 0 && error != NULL && *error == NULL)
-        {
-          g_set_error_literal (error,
-                               G_IO_ERROR,
-                               G_IO_ERROR_FAILED,
-                               _("Expecting to read a single byte for receiving credentials but read zero bytes"));
-        }
-      goto out;
-    }
-
-  if (nscm != 1)
-    {
-      g_set_error (error,
-                   G_IO_ERROR,
-                   G_IO_ERROR_FAILED,
-		   _("Expecting 1 control message, got %d"),
-                   nscm);
-      goto out;
-    }
-
-  if (!G_IS_UNIX_CREDENTIALS_MESSAGE (scms[0]))
-    {
-      g_set_error_literal (error,
-                           G_IO_ERROR,
-                           G_IO_ERROR_FAILED,
-			   _("Unexpected type of ancillary data"));
-      goto out;
-    }
-
-  ret = g_unix_credentials_message_get_credentials (G_UNIX_CREDENTIALS_MESSAGE (scms[0]));
-  g_object_ref (ret);
-
- out:
-  if (scms != NULL)
-    {
-      for (n = 0; n < nscm; n++)
-        g_object_unref (scms[n]);
-      g_free (scms);
-    }
-  g_object_unref (socket);
-  return ret;
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
 typedef struct
 {
   const gchar *name;
diff --git a/gio/gdbusauthobserver.c b/gio/gdbusauthobserver.c
index f0411ab..4de6722 100644
--- a/gio/gdbusauthobserver.c
+++ b/gio/gdbusauthobserver.c
@@ -33,7 +33,7 @@
 /**
  * SECTION:gdbusauthobserver
  * @short_description: Object used for authenticating connections
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * The #GDBusAuthObserver type provides a mechanism for participating
  * in how a #GDBusServer (or a #GDBusConnection) authenticates remote
diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c
index 0bcd58f..fdcb6ed 100644
--- a/gio/gdbusconnection.c
+++ b/gio/gdbusconnection.c
@@ -78,7 +78,7 @@
 /**
  * SECTION:gdbusconnection
  * @short_description: D-Bus Connections
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * <para><note>
  * This class is rarely used directly in D-Bus clients. If you are
@@ -89,11 +89,11 @@
  * The #GDBusConnection type is used for D-Bus connections to remote
  * peers such as a message buses.
  *
- * <example id="gdbus-server"><title>D-Bus server example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../../gio/tests/gdbus-example-server.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
+ * <example id="gdbus-server"><title>D-Bus server example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../gio/tests/gdbus-example-server.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
  *
- * <example id="gdbus-subtree-server"><title>D-Bus subtree example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../../gio/tests/gdbus-example-subtree.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
+ * <example id="gdbus-subtree-server"><title>D-Bus subtree example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../gio/tests/gdbus-example-subtree.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
  *
- * <example id="gdbus-unix-fd-client"><title>D-Bus UNIX File Descriptor example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../../gio/tests/gdbus-example-unix-fd-client.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
+ * <example id="gdbus-unix-fd-client"><title>D-Bus UNIX File Descriptor example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../gio/tests/gdbus-example-unix-fd-client.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
  */
 
 /* ---------------------------------------------------------------------------------------------------- */
diff --git a/gio/gdbuserror.c b/gio/gdbuserror.c
index 3b0e080..5bc9c69 100644
--- a/gio/gdbuserror.c
+++ b/gio/gdbuserror.c
@@ -36,7 +36,7 @@
  * SECTION:gdbuserror
  * @title: GDBusError
  * @short_description: Mapping D-Bus errors to and from #GError
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * All facilities that return errors from remote methods (such as
  * g_dbus_connection_invoke_method_sync()) use #GError to represent
diff --git a/gio/gdbusintrospection.c b/gio/gdbusintrospection.c
index 63b945e..c76af4e 100644
--- a/gio/gdbusintrospection.c
+++ b/gio/gdbusintrospection.c
@@ -32,7 +32,7 @@
  * SECTION:gdbusintrospection
  * @title: Introspection XML
  * @short_description: Parse and Generate Introspection XML
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * Various data structures and convenience routines to parse and
  * generate D-Bus introspection XML.
diff --git a/gio/gdbusmessage.c b/gio/gdbusmessage.c
index 668b1c8..d1929ae 100644
--- a/gio/gdbusmessage.c
+++ b/gio/gdbusmessage.c
@@ -48,7 +48,7 @@
 /**
  * SECTION:gdbusmessage
  * @short_description: D-Bus Message
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * A type for representing D-Bus messages that can be sent or received
  * on a #GDBusConnection.
diff --git a/gio/gdbusmethodinvocation.c b/gio/gdbusmethodinvocation.c
index dc6950b..5885abc 100644
--- a/gio/gdbusmethodinvocation.c
+++ b/gio/gdbusmethodinvocation.c
@@ -36,7 +36,7 @@
 /**
  * SECTION:gdbusmethodinvocation
  * @short_description: Object for handling remote calls
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * Instances of the #GDBusMethodInvocation class are used when
  * handling D-Bus method calls. It provides a way to asynchronously
diff --git a/gio/gdbusnameowning.c b/gio/gdbusnameowning.c
index 3090165..e840353 100644
--- a/gio/gdbusnameowning.c
+++ b/gio/gdbusnameowning.c
@@ -36,11 +36,11 @@
  * SECTION:gdbusnameowning
  * @title: Owning Bus Names
  * @short_description: Simple API for owning bus names
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * Convenience API for owning bus names.
  *
- * <example id="gdbus-owning-names"><title>Simple application owning a name</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../../gio/tests/gdbus-example-own-name.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
+ * <example id="gdbus-owning-names"><title>Simple application owning a name</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../gio/tests/gdbus-example-own-name.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
  */
 
 G_LOCK_DEFINE_STATIC (lock);
diff --git a/gio/gdbusnamewatching.c b/gio/gdbusnamewatching.c
index 92e04cc..6ae4754 100644
--- a/gio/gdbusnamewatching.c
+++ b/gio/gdbusnamewatching.c
@@ -36,11 +36,11 @@
  * SECTION:gdbusnamewatching
  * @title: Watching Bus Names
  * @short_description: Simple API for watching bus names
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * Convenience API for watching bus names.
  *
- * <example id="gdbus-watching-names"><title>Simple application watching a name</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../../gio/tests/gdbus-example-watch-name.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
+ * <example id="gdbus-watching-names"><title>Simple application watching a name</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../gio/tests/gdbus-example-watch-name.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
  */
 
 G_LOCK_DEFINE_STATIC (lock);
diff --git a/gio/gdbusproxy.c b/gio/gdbusproxy.c
index 39094d0..89aced9 100644
--- a/gio/gdbusproxy.c
+++ b/gio/gdbusproxy.c
@@ -42,7 +42,7 @@
 /**
  * SECTION:gdbusproxy
  * @short_description: Base class for proxies
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * #GDBusProxy is a base class used for proxies to access a D-Bus
  * interface on a remote object. A #GDBusProxy can only be constructed
diff --git a/gio/gdbusproxywatching.c b/gio/gdbusproxywatching.c
index 4f85c1d..4025e1f 100644
--- a/gio/gdbusproxywatching.c
+++ b/gio/gdbusproxywatching.c
@@ -39,11 +39,11 @@
  * SECTION:gdbusproxywatching
  * @title: Watching Proxies
  * @short_description: Simple API for watching proxies
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * Convenience API for watching bus proxies.
  *
- * <example id="gdbus-watching-proxy"><title>Simple application watching a proxy</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../../gio/tests/gdbus-example-watch-proxy.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
+ * <example id="gdbus-watching-proxy"><title>Simple application watching a proxy</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../gio/tests/gdbus-example-watch-proxy.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
  */
 
 /* ---------------------------------------------------------------------------------------------------- */
diff --git a/gio/gdbusserver.c b/gio/gdbusserver.c
index 0d0deea..99e7701 100644
--- a/gio/gdbusserver.c
+++ b/gio/gdbusserver.c
@@ -44,12 +44,12 @@
 /**
  * SECTION:gdbusserver
  * @short_description: Helper for accepting connections
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * #GDBusServer is a helper for listening to and accepting D-Bus
  * connections.
  *
- * <example id="gdbus-peer-to-peer"><title>D-Bus peer-to-peer example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../../gio/tests/gdbus-example-peer.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
+ * <example id="gdbus-peer-to-peer"><title>D-Bus peer-to-peer example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"; parse="text" href="../../../../gio/tests/gdbus-example-peer.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
  */
 
 struct _GDBusServerPrivate
diff --git a/gio/gdbusutils.c b/gio/gdbusutils.c
index b1ec0ea..0052916 100644
--- a/gio/gdbusutils.c
+++ b/gio/gdbusutils.c
@@ -33,7 +33,7 @@
  * SECTION:gdbusutils
  * @title: D-Bus Utilities
  * @short_description: Various utilities related to D-Bus.
- * @include: gdbus/gdbus.h
+ * @include: gio/gio.h
  *
  * Various utility routines related to D-Bus.
  */
diff --git a/gio/gunixconnection.c b/gio/gunixconnection.c
index 92ad246..8b618cb 100644
--- a/gio/gunixconnection.c
+++ b/gio/gunixconnection.c
@@ -36,6 +36,14 @@
 #include <gio/gsocket.h>
 #include <unistd.h>
 
+#ifdef __linux__
+/* for getsockopt() and setsockopt() */
+#include <sys/types.h>          /* See NOTES */
+#include <sys/socket.h>
+#include <errno.h>
+#include <string.h>
+#endif
+
 #include "gioalias.h"
 
 G_DEFINE_TYPE_WITH_CODE (GUnixConnection, g_unix_connection,
@@ -287,5 +295,255 @@ gboolean                g_unix_connection_create_pair                   (GUnixCo
                                                                          GError              **error);
 */
 
+
+/**
+ * g_unix_connection_send_credentials:
+ * @connection: A #GUnixConnection.
+ * @credentials: A #GCredentials to send.
+ * @cancellable: A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Passes the credentials stored in @credentials to the recieving side
+ * of the connection. The recieving end has to call
+ * g_unix_connection_receive_credentials() (or similar) to accept the
+ * credentials.
+ *
+ * The credentials which the sender specifies are checked by the
+ * kernel.  A process with effective user ID 0 is allowed to specify
+ * values that do not match its own. This means that the credentials
+ * can be used to authenticate other connections.
+ *
+ * As well as sending the credentials this also writes a single NUL
+ * byte to the stream, as this is required for credentials passing to
+ * work on some implementations.
+ *
+ * Returns: %TRUE on success, %FALSE if @error is set.
+ *
+ * Since: 2.26
+ */
+gboolean
+g_unix_connection_send_credentials (GUnixConnection      *connection,
+                                    GCredentials         *credentials,
+                                    GCancellable         *cancellable,
+                                    GError              **error)
+{
+  GSocketControlMessage *scm;
+  GSocket *socket;
+  gboolean ret;
+  GOutputVector vector;
+  guchar nul_byte[1] = {'\0'};
+
+  g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), FALSE);
+  g_return_val_if_fail (G_IS_CREDENTIALS (credentials), FALSE);
+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+  ret = FALSE;
+
+  vector.buffer = &nul_byte;
+  vector.size = 1;
+  scm = g_unix_credentials_message_new_with_credentials (credentials);
+  g_object_get (connection, "socket", &socket, NULL);
+  if (g_socket_send_message (socket,
+                             NULL, /* address */
+                             &vector,
+                             1,
+                             &scm,
+                             1,
+                             G_SOCKET_MSG_NONE,
+                             cancellable,
+                             error) != 1)
+    {
+      g_prefix_error (error, _("Error sending credentials: "));
+      goto out;
+    }
+
+  ret = TRUE;
+
+ out:
+  g_object_unref (socket);
+  g_object_unref (scm);
+  return ret;
+}
+
+/**
+ * g_unix_connection_receive_credentials:
+ * @connection: A #GUnixConnection.
+ * @cancellable: A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Receives credentials from the sending end of the connection.  The
+ * sending end has to call g_unix_connection_send_credentials() (or
+ * similar) for this to work.
+ *
+ * As well as reading the credentials this also reads (and discards) a
+ * single byte from the stream, as this is required for credentials
+ * passing to work on some implementations.
+ *
+ * Returns: Received credentials on success (free with
+ * g_object_unref()), %NULL if @error is set.
+ *
+ * Since: 2.26
+ */
+GCredentials *
+g_unix_connection_receive_credentials (GUnixConnection      *connection,
+                                       GCancellable         *cancellable,
+                                       GError              **error)
+{
+  GCredentials *ret;
+  GSocketControlMessage **scms;
+  gint nscm;
+  GSocket *socket;
+  gint n;
+  volatile GType credentials_message_gtype;
+  gssize num_bytes_read;
+#ifdef __linux__
+  gboolean turn_off_so_passcreds;
+#endif
+
+  g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), NULL);
+  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+  ret = NULL;
+  scms = NULL;
+
+  g_object_get (connection, "socket", &socket, NULL);
+
+  /* On Linux, we need to turn on SO_PASSCRED if it isn't enabled
+   * already. We also need to turn it off when we're done.  See
+   * #617483 for more discussion.
+   */
+#ifdef __linux__
+  {
+    gint opt_val;
+    socklen_t opt_len;
+
+    turn_off_so_passcreds = FALSE;
+    opt_val = 0;
+    opt_len = sizeof (gint);
+    if (getsockopt (g_socket_get_fd (socket),
+                    SOL_SOCKET,
+                    SO_PASSCRED,
+                    &opt_val,
+                    &opt_len) != 0)
+      {
+        g_set_error (error,
+                     G_IO_ERROR,
+                     g_io_error_from_errno (errno),
+                     _("Error checking if SO_PASSCRED is enabled for socket: %s"),
+                     strerror (errno));
+        goto out;
+      }
+    if (opt_len != sizeof (gint))
+      {
+        g_set_error (error,
+                     G_IO_ERROR,
+                     G_IO_ERROR_FAILED,
+                     _("Unexpected option length while checking if SO_PASSCRED is enabled for socket. "
+                       "Expected %d bytes, got %d"),
+                     (gint) sizeof (gint), (gint) opt_len);
+        goto out;
+      }
+    if (opt_val == 0)
+      {
+        opt_val = 1;
+        if (setsockopt (g_socket_get_fd (socket),
+                        SOL_SOCKET,
+                        SO_PASSCRED,
+                        &opt_val,
+                        sizeof opt_val) != 0)
+          {
+            g_set_error (error,
+                         G_IO_ERROR,
+                         g_io_error_from_errno (errno),
+                         _("Error enabling SO_PASSCRED: %s"),
+                         strerror (errno));
+            goto out;
+          }
+        turn_off_so_passcreds = TRUE;
+      }
+  }
+#endif
+
+  /* ensure the type of GUnixCredentialsMessage has been registered with the type system */
+  credentials_message_gtype = G_TYPE_UNIX_CREDENTIALS_MESSAGE;
+  num_bytes_read = g_socket_receive_message (socket,
+                                             NULL, /* GSocketAddress **address */
+                                             NULL,
+                                             0,
+                                             &scms,
+                                             &nscm,
+                                             NULL,
+                                             cancellable,
+                                             error);
+  if (num_bytes_read != 1)
+    {
+      /* Handle situation where g_socket_receive_message() returns
+       * 0 bytes and not setting @error
+       */
+      if (num_bytes_read == 0 && error != NULL && *error == NULL)
+        {
+          g_set_error_literal (error,
+                               G_IO_ERROR,
+                               G_IO_ERROR_FAILED,
+                               _("Expecting to read a single byte for receiving credentials but read zero bytes"));
+        }
+      goto out;
+    }
+
+  if (nscm != 1)
+    {
+      g_set_error (error,
+                   G_IO_ERROR,
+                   G_IO_ERROR_FAILED,
+		   _("Expecting 1 control message, got %d"),
+                   nscm);
+      goto out;
+    }
+
+  if (!G_IS_UNIX_CREDENTIALS_MESSAGE (scms[0]))
+    {
+      g_set_error_literal (error,
+                           G_IO_ERROR,
+                           G_IO_ERROR_FAILED,
+			   _("Unexpected type of ancillary data"));
+      goto out;
+    }
+
+  ret = g_unix_credentials_message_get_credentials (G_UNIX_CREDENTIALS_MESSAGE (scms[0]));
+  g_object_ref (ret);
+
+ out:
+
+#ifdef __linux__
+  if (turn_off_so_passcreds)
+    {
+      gint opt_val;
+      opt_val = 0;
+      if (setsockopt (g_socket_get_fd (socket),
+                      SOL_SOCKET,
+                      SO_PASSCRED,
+                      &opt_val,
+                      sizeof opt_val) != 0)
+        {
+          g_set_error (error,
+                       G_IO_ERROR,
+                       g_io_error_from_errno (errno),
+                       _("Error while disabling SO_PASSCRED: %s"),
+                       strerror (errno));
+          goto out;
+        }
+    }
+#endif
+
+  if (scms != NULL)
+    {
+      for (n = 0; n < nscm; n++)
+        g_object_unref (scms[n]);
+      g_free (scms);
+    }
+  g_object_unref (socket);
+  return ret;
+}
+
 #define __G_UNIX_CONNECTION_C__
 #include "gioaliasdef.c"
diff --git a/gio/gunixconnection.h b/gio/gunixconnection.h
index 7435e97..9c691ea 100644
--- a/gio/gunixconnection.h
+++ b/gio/gunixconnection.h
@@ -71,6 +71,16 @@ gint                    g_unix_connection_receive_fd                    (GUnixCo
                                                                          GCancellable         *cancellable,
                                                                          GError              **error);
 
+gboolean                g_unix_connection_send_credentials              (GUnixConnection      *connection,
+                                                                         GCredentials         *credentials,
+                                                                         GCancellable         *cancellable,
+                                                                         GError              **error);
+
+GCredentials           *g_unix_connection_receive_credentials           (GUnixConnection      *connection,
+                                                                         GCancellable         *cancellable,
+                                                                         GError              **error);
+
+
 G_END_DECLS
 
 #endif /* __G_UNIX_CONNECTION_H__ */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]