diff options
Diffstat (limited to 'dbus')
-rw-r--r-- | dbus/dbus-message.c | 18 | ||||
-rw-r--r-- | dbus/dbus-transport-unix.c | 24 |
2 files changed, 33 insertions, 9 deletions
diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index 8887720a..1db8bd9c 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -2622,7 +2622,7 @@ dbus_message_iter_get_args_valist (DBusMessageIter *iter, #endif /* DBUS_HAVE_INT64 */ case DBUS_TYPE_DOUBLE: { - void *ptr = va_arg (var_args, void *); + void *ptr = va_arg (var_args, double *); _dbus_message_iter_get_basic_type (iter, spec_type, ptr); break; } @@ -6696,6 +6696,7 @@ verify_test_message (DBusMessage *message) char *our_str; double our_double; dbus_bool_t our_bool; + unsigned char our_byte_1, our_byte_2; dbus_uint32_t our_uint32; dbus_int32_t *our_uint32_array; int our_uint32_array_len; @@ -6730,6 +6731,9 @@ verify_test_message (DBusMessage *message) DBUS_TYPE_STRING, &our_str, DBUS_TYPE_DOUBLE, &our_double, DBUS_TYPE_BOOLEAN, &our_bool, + DBUS_TYPE_BYTE, &our_byte_1, + DBUS_TYPE_BYTE, &our_byte_2, + DBUS_TYPE_NIL, DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &our_uint32_array, &our_uint32_array_len, DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, @@ -6775,6 +6779,12 @@ verify_test_message (DBusMessage *message) if (!our_bool) _dbus_assert_not_reached ("booleans differ"); + if (our_byte_1 != 42) + _dbus_assert_not_reached ("bytes differ!"); + + if (our_byte_2 != 24) + _dbus_assert_not_reached ("bytes differ!"); + if (our_uint32_array_len != 4 || our_uint32_array[0] != 0x12345678 || our_uint32_array[1] != 0x23456781 || @@ -7027,6 +7037,9 @@ _dbus_message_test (const char *test_data_dir) DBUS_TYPE_STRING, "Test string", DBUS_TYPE_DOUBLE, 3.14159, DBUS_TYPE_BOOLEAN, TRUE, + DBUS_TYPE_BYTE, (unsigned char) 42, + DBUS_TYPE_BYTE, 24, + DBUS_TYPE_NIL, DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, our_uint32_array, _DBUS_N_ELEMENTS (our_uint32_array), DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, our_int32_array, @@ -7062,6 +7075,9 @@ _dbus_message_test (const char *test_data_dir) sig[i++] = DBUS_TYPE_STRING; sig[i++] = DBUS_TYPE_DOUBLE; sig[i++] = DBUS_TYPE_BOOLEAN; + sig[i++] = DBUS_TYPE_BYTE; + sig[i++] = DBUS_TYPE_BYTE; + sig[i++] = DBUS_TYPE_NIL; sig[i++] = DBUS_TYPE_ARRAY; sig[i++] = DBUS_TYPE_UINT32; sig[i++] = DBUS_TYPE_ARRAY; diff --git a/dbus/dbus-transport-unix.c b/dbus/dbus-transport-unix.c index 2e942abc..37825f1c 100644 --- a/dbus/dbus-transport-unix.c +++ b/dbus/dbus-transport-unix.c @@ -717,11 +717,25 @@ unix_handle_watch (DBusTransport *transport, _dbus_assert (watch == unix_transport->read_watch || watch == unix_transport->write_watch); + /* Disconnect in case of an error. In case of hangup do not + * disconnect the transport because data can still be in the buffer + * and do_reading may need several iteration to read it all (because + * of its max_bytes_read_per_iteration limit). The condition where + * flags == HANGUP (without READABLE) probably never happen in fact. + */ + if ((flags & DBUS_WATCH_ERROR) || + ((flags & DBUS_WATCH_HANGUP) && !(flags & DBUS_WATCH_READABLE))) + { + _dbus_verbose ("Hang up or error on watch\n"); + _dbus_transport_disconnect (transport); + return TRUE; + } + if (watch == unix_transport->read_watch && (flags & DBUS_WATCH_READABLE)) { -#if 1 - _dbus_verbose ("handling read watch\n"); +#if 0 + _dbus_verbose ("handling read watch (%x)\n", flags); #endif if (!do_authentication (transport, TRUE, FALSE)) return FALSE; @@ -763,12 +777,6 @@ unix_handle_watch (DBusTransport *transport, } #endif /* DBUS_ENABLE_VERBOSE_MODE */ - if (flags & (DBUS_WATCH_HANGUP | DBUS_WATCH_ERROR)) - { - _dbus_transport_disconnect (transport); - return TRUE; - } - return TRUE; } |