Index: dbus/dbus-sysdeps-win.c =================================================================== RCS file: /cvs/dbus/dbus/dbus/dbus-sysdeps-win.c,v retrieving revision 1.6 diff -u -r1.6 dbus-sysdeps-win.c --- dbus/dbus-sysdeps-win.c 12 Mar 2007 15:59:44 -0000 1.6 +++ dbus/dbus-sysdeps-win.c 13 Mar 2007 15:55:17 -0000 @@ -3654,33 +3621,62 @@ return _dbus_socket_to_handle (&sclient); } - - +/* 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. + * + */ 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. - * - */ + 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 +3699,23 @@ * @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; }