* dbus/dbus-sysdeps-win.c: added zero byte sending and receiving after connection...
authorRalf Habacker <ralf.habacker@freenet.de>
Tue, 13 Mar 2007 16:56:32 +0000 (16:56 +0000)
committerRalf Habacker <ralf.habacker@freenet.de>
Tue, 13 Mar 2007 16:56:32 +0000 (16:56 +0000)
ChangeLog
dbus/dbus-sysdeps-win.c

index 411df2f..b402970 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-03-13  Ralf.Habacker  <ralf.habacker@freenet.de>
+
+       * dbus/dbus-sysdeps-win.c: added zero byte sending 
+       and receiving after connection start up
+
 2007-03-11  Havoc Pennington  <hp@redhat.com>
 
        * tools/dbus-launch.c (do_close_stderr): fix C89 problem and
index 734d4ab..2ffb3e2 100644 (file)
@@ -3657,30 +3657,61 @@ retry:
 
 
 dbus_bool_t
-write_credentials_byte (int             server_fd,
+write_credentials_byte (int            handle,
                         DBusError      *error)
 {
-  /* FIXME: for the session bus credentials shouldn't matter (?), but
-   * for the system bus they are presumably essential. A rough outline
-   * of a way to implement the credential transfer would be this:
-   *
-   * client waits to *read* a byte.
-   *
-   * server creates a named pipe with a random name, sends a byte
-   * contining its length, and its name.
-   *
-   * client reads the name, connects to it (using Win32 API).
-   *
-   * server waits for connection to the named pipe, then calls
-   * ImpersonateNamedPipeClient(), notes its now-current credentials,
-   * calls RevertToSelf(), closes its handles to the named pipe, and
-   * is done. (Maybe there is some other way to get the SID of a named
-   * pipe client without having to use impersonation?)
-   *
-   * client closes its handles and is done.
-   *
-   */
+/* FIXME: for the session bus credentials shouldn't matter (?), but
+ * for the system bus they are presumably essential. A rough outline
+ * of a way to implement the credential transfer would be this:
+ *
+ * client waits to *read* a byte.
+ *
+ * server creates a named pipe with a random name, sends a byte
+ * contining its length, and its name.
+ *
+ * client reads the name, connects to it (using Win32 API).
+ *
+ * server waits for connection to the named pipe, then calls
+ * ImpersonateNamedPipeClient(), notes its now-current credentials,
+ * calls RevertToSelf(), closes its handles to the named pipe, and
+ * is done. (Maybe there is some other way to get the SID of a named
+ * pipe client without having to use impersonation?)
+ *
+ * client closes its handles and is done.
+ * 
+ * Ralf: Why not sending credentials over the given this connection ?
+ * Using named pipes makes it impossible to be connected from a unix client.  
+ *
+ */
+  int bytes_written;
+  DBusString buf; 
+
+  _dbus_string_init_const_len (&buf, "\0", 1);
+again:
+  bytes_written = _dbus_write_socket (handle, &buf, 0, 1 );
+
+  if (bytes_written < 0 && errno == EINTR)
+    goto again;
 
+  if (bytes_written < 0)
+    {
+      dbus_set_error (error, _dbus_error_from_errno (errno),
+                      "Failed to write credentials byte: %s",
+                     _dbus_strerror (errno));
+      return FALSE;
+    }
+  else if (bytes_written == 0)
+    {
+      dbus_set_error (error, DBUS_ERROR_IO_ERROR,
+                      "wrote zero bytes writing credentials byte");
+      return FALSE;
+    }
+  else
+    {
+      _dbus_assert (bytes_written == 1);
+      _dbus_verbose ("wrote 1 zero byte, credential sending isn't implemented yet\n");
+      return TRUE;
+    }
   return TRUE;
 }
 
@@ -3703,12 +3734,23 @@ write_credentials_byte (int             server_fd,
  * @returns #TRUE on success
  */
 dbus_bool_t
-_dbus_read_credentials_unix_socket  (int              client_fd,
+_dbus_read_credentials_unix_socket  (int              handle,
                                      DBusCredentials *credentials,
                                      DBusError       *error)
 {
-  /* FIXME bogus testing credentials */
+  int bytes_read;
+  DBusString buf;
+  _dbus_string_init(&buf);
+
+  bytes_read = _dbus_read_socket(handle, &buf, 1 );
+  if (bytes_read > 0) 
+    {
+               _dbus_verbose("got one zero byte from server");
+    }
+
+  _dbus_string_free(&buf);
   _dbus_credentials_from_current_process (credentials);
+  _dbus_verbose("FIXME: get faked credentials from current process");
 
   return TRUE;
 }