Fix check for message timeout
authorMike Gorse <mgorse@novell.com>
Sun, 30 Jan 2011 17:50:38 +0000 (11:50 -0600)
committerMike Gorse <mgorse@novell.com>
Sun, 30 Jan 2011 17:50:38 +0000 (11:50 -0600)
dbind/dbind.c

index 23046f2f31cfc1a7b945db6fd04aaef9b7f3f27c..084de2859620c58615c18f26deab50a219241412 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <stdio.h>
 #include <stdarg.h>
+#include <sys/time.h>
 #include <glib.h>
 
 #include "config.h"
@@ -30,6 +31,15 @@ set_reply (DBusPendingCall * pending, void *user_data)
   dbus_pending_call_unref (pending);
 }
 
+static gint
+time_elapsed (struct timeval *origin)
+{
+  struct timeval tv;
+
+  gettimeofday (&tv, NULL);
+  return (tv.tv_sec - origin->tv_sec) * 1000 + (tv.tv_usec - origin->tv_usec) / 1000;
+}
+
 DBusMessage *
 dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusError *error)
 {
@@ -37,6 +47,7 @@ dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusE
   SpiReentrantCallClosure closure;
   const char *unique_name = dbus_bus_get_unique_name (bus);
   const char *destination = dbus_message_get_destination (message);
+  struct timeval tv;
 
   if (unique_name && destination &&
       strcmp (destination, unique_name) != 0)
@@ -51,10 +62,13 @@ dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusE
   dbus_pending_call_set_notify (pending, set_reply, (void *) &closure, NULL);
 
   closure.reply = NULL;
+  gettimeofday (&tv, NULL);
   while (!closure.reply)
     {
       if (!dbus_connection_read_write_dispatch (bus, dbind_timeout))
         return NULL;
+if (time_elapsed (&tv) > dbind_timeout)
+        return NULL;
     }
   
   return closure.reply;