[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);
};