[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[vidalia-svn] r2572: Improve error handling for UPNP (vidalia/branches/upnp/src/vidalia/config)



Author: sjmurdoch
Date: 2008-05-10 08:36:38 -0400 (Sat, 10 May 2008)
New Revision: 2572

Modified:
   vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp
   vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.h
Log:
Improve error handling for UPNP

Modified: vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp
===================================================================
--- vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp	2008-05-10 04:23:18 UTC (rev 2571)
+++ vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp	2008-05-10 12:36:38 UTC (rev 2572)
@@ -86,7 +86,13 @@
 UPNPControlThread::configurePorts() {
   quint16 desiredDirPort, desiredOrPort;
   bool force_init = false;
+  int retval = 0;
 
+#ifdef UPNPCONTROL_DEBUG
+    printf("configurePorts()\n");
+    fflush(stdout);
+#endif
+
   /* Get desired state */
   _control->getDesiredState(&desiredDirPort, &desiredOrPort);
 
@@ -104,22 +110,32 @@
   if (!force_init) {
     /* Configure DirPort */
     if (desiredDirPort != _dirPort) {
-      updatePort(_dirPort, desiredDirPort);
-      _dirPort = desiredDirPort;
+      retval = updatePort(_dirPort, desiredDirPort);
+      if (!retval)
+	_dirPort = desiredDirPort;
     }
     
     /* Configure ORPort */
     if (desiredOrPort != _orPort) {
-      updatePort(_orPort, desiredOrPort);
-      _orPort = desiredOrPort;
+      retval = updatePort(_orPort, desiredOrPort);
+      if (!retval)
+        _orPort = desiredOrPort;
     }
   } else {
     /* Add the mapping even if they exist already */
-    updatePort(0, desiredDirPort);
-    _dirPort = desiredDirPort;
-    updatePort(0, desiredOrPort);
-    _orPort = desiredOrPort;
+    retval = updatePort(0, desiredDirPort);
+    if (!retval)
+      _dirPort = desiredDirPort;
+    
+    retval = updatePort(0, desiredOrPort);
+    if (!retval)
+      _orPort = desiredOrPort;
   }
+
+#ifdef UPNPCONTROL_DEBUG
+  printf("configurePorts() result %d\n", retval);
+    fflush(stdout);
+#endif
 }
 
 void
@@ -149,10 +165,12 @@
   _waitMutex->unlock();
 }
 
-void
+int
 UPNPControlThread::updatePort(quint16 oldPort, quint16 newPort)
 {
 
+  int retval;
+
 #ifdef WIN32  
   // Workaround from http://trolltech.com/developer/knowledgebase/579
   WSAData wsadata;
@@ -162,24 +180,30 @@
 #endif
 
   if (_upnpInitialized.isNull() && (oldPort!=0 || newPort !=0)) {
-    init_upnp();
-    _upnpInitialized = QTime::currentTime();
+    retval = init_upnp();
+    if (0 == retval)
+      _upnpInitialized = QTime::currentTime();
+    else
+      _upnpInitialized = QTime();
+  } else {
+    retval = 0;
   }
 
-  if (oldPort != 0)
-    disablePort(oldPort);
+  if (!retval && oldPort != 0)
+    retval = disablePort(oldPort);
 
-  if (newPort != 0)
-    forwardPort(newPort);
+  if (!retval && newPort != 0)
+    retval = forwardPort(newPort);
 
 #ifdef WIN32
   WSACleanup();
 #endif
 
+  return retval;
 }
 
 /** Based on http://miniupnp.free.fr/files/download.php?file=xchat-upnp20061022.patch */
-void
+int
 UPNPControlThread::init_upnp()
 {
   struct UPNPDev * devlist;
@@ -189,6 +213,14 @@
   memset(&data, 0, sizeof(struct IGDdatas));
 
   devlist = upnpDiscover(2000, NULL, NULL);
+  if (NULL == devlist) {
+#ifdef UPNPCONTROL_DEBUG
+    printf("upnpDiscover returned: NULL\n");
+    fflush(stdout);
+#endif
+    return 1;
+  }
+
   retval = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));
 
   #ifdef UPNPCONTROL_DEBUG
@@ -197,6 +229,11 @@
   #endif
 
   freeUPNPDevlist(devlist);
+
+  if (retval != 1 && retval != 2)
+    return 2;
+
+  return 0;
 }
 
 int

Modified: vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.h
===================================================================
--- vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.h	2008-05-10 04:23:18 UTC (rev 2571)
+++ vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.h	2008-05-10 12:36:38 UTC (rev 2572)
@@ -57,8 +57,8 @@
   char lanaddr[16];
 
   void configurePorts();
-  void init_upnp();
-  void updatePort(quint16 oldPort, quint16 newPort);
+  int init_upnp();
+  int updatePort(quint16 oldPort, quint16 newPort);
   int forwardPort(quint16 port);
   int disablePort(quint16 port);
 };