dbus: prepare API for checking transport overflow 86/257986/2
authorAdrian Szyndela <adrian.s@samsung.com>
Thu, 29 Apr 2021 12:48:57 +0000 (14:48 +0200)
committerAdrian Szyndela <adrian.s@samsung.com>
Fri, 14 May 2021 14:29:31 +0000 (16:29 +0200)
Add API for checking transport overflow and implementation
of transport overflow indicator for socket transport.
Other transports always show "no overflow" for now.

Change-Id: I5169403c4548bdaeb9b08e909a45f9299e146e5d

dbus/dbus-connection-internal.h
dbus/dbus-connection.c
dbus/dbus-transport-protected.h
dbus/dbus-transport-socket.c
dbus/dbus-transport.c
dbus/dbus-transport.h

index da2db4f..aca6631 100644 (file)
@@ -133,6 +133,9 @@ dbus_bool_t       _dbus_connection_remove_message                 (DBusConnectio
                                                                    DBusMessage    *message);
 int               _dbus_connection_get_n_incoming               (DBusConnection *connection);
 
+DBUS_PRIVATE_EXPORT
+dbus_bool_t       _dbus_connection_is_overflowed                   (DBusConnection *connection);
+
 /* if DBUS_ENABLE_STATS */
 DBUS_PRIVATE_EXPORT
 void _dbus_connection_get_stats (DBusConnection *connection,
index 4b87da7..e010579 100644 (file)
@@ -5317,6 +5317,12 @@ _dbus_connection_get_n_incoming (DBusConnection *connection)
   return connection->n_incoming;
 }
 
+dbus_bool_t
+_dbus_connection_is_overflowed (DBusConnection *connection)
+{
+  return _dbus_transport_get_overflowed (connection->transport);
+}
+
 /**
  * Gets the UNIX user ID of the connection if known.  Returns #TRUE if
  * the uid is filled in.  Always returns #FALSE on non-UNIX platforms
index 1a02bd2..17081ca 100644 (file)
@@ -130,6 +130,7 @@ struct DBusTransport
   unsigned int is_server : 1;                 /**< #TRUE if on the server side */
   unsigned int unused_bytes_recovered : 1;    /**< #TRUE if we've recovered unused bytes from auth */
   unsigned int allow_anonymous : 1;           /**< #TRUE if an anonymous client can connect */
+  unsigned int overflowed : 1;                /**< #TRUE if last write didn't write all the data */
 };
 
 dbus_bool_t _dbus_transport_init_base     (DBusTransport             *transport,
index 7389650..20bb6aa 100644 (file)
@@ -528,6 +528,8 @@ do_writing (DBusTransport *transport)
   oom = FALSE;
   total = 0;
 
+  transport->overflowed = FALSE;
+
   while (!transport->disconnected &&
          _dbus_connection_has_messages_to_send_unlocked (transport->connection))
     {
@@ -667,7 +669,10 @@ do_writing (DBusTransport *transport)
            */
           
           if (_dbus_get_is_errno_eagain_or_ewouldblock (saved_errno) || _dbus_get_is_errno_epipe (saved_errno))
-            goto out;
+            {
+              transport->overflowed = TRUE;
+              goto out;
+            }
 
           /* Since Linux commit 25888e (from 2.6.37-rc4, Nov 2010), sendmsg()
            * on Unix sockets returns -1 errno=ETOOMANYREFS when the passfd
index 5771279..c51a8d3 100644 (file)
@@ -273,6 +273,7 @@ _dbus_transport_init_base_with_auth (DBusTransport             *transport,
   transport->assure_protocol_function = _dbus_message_assure_dbus1;
   transport->send_sync_call_function = NULL;
   transport->protocol = DBUS_MAJOR_PROTOCOL_VERSION;
+  transport->overflowed = FALSE;
 
   return TRUE;
 }
@@ -297,6 +298,12 @@ _dbus_transport_get_protocol (DBusTransport *transport)
   return transport->protocol;
 }
 
+dbus_bool_t
+_dbus_transport_get_overflowed (DBusTransport *transport)
+{
+  return transport->overflowed;
+}
+
 /**
  * Initializes the base class members of DBusTransport.  Chained up to
  * by subclasses in their constructor.  The server GUID is the
index 55182c5..4bd0179 100644 (file)
@@ -110,7 +110,7 @@ dbus_bool_t        _dbus_transport_assure_protocol_version (DBusTransport
                                                             DBusMessage              **message);
 DBusMessage*       _dbus_transport_send_sync_call          (DBusTransport             *transport,
                                                             DBusMessage               *message);
-
+dbus_bool_t        _dbus_transport_get_overflowed          (DBusTransport             *transport);
 
 /* if DBUS_ENABLE_STATS */
 void _dbus_transport_get_stats (DBusTransport  *transport,