[tor-commits] [vidalia/alpha] Remember ports used when using automatic port selection
chiiph at torproject.org
chiiph at torproject.org
Mon Jan 23 16:45:42 UTC 2012
commit 3ae5eb998eb5edb39ac15e9ce11d89d5d5f9e255
Author: Tomás Touceda <chiiph at torproject.org>
Date: Fri Jan 20 19:54:56 2012 -0300
Remember ports used when using automatic port selection
Tries to use the remembered ports if restarting in auto configuration and
it didn't failed last time.
---
src/vidalia/MainWindow.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++-
src/vidalia/MainWindow.h | 4 +++
2 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp
index 183e78f..28786fc 100644
--- a/src/vidalia/MainWindow.cpp
+++ b/src/vidalia/MainWindow.cpp
@@ -105,6 +105,8 @@ void qt_mac_set_dock_menu(QMenu *menu);
MainWindow::MainWindow()
: VidaliaWindow("MainWindow")
{
+ _startedWithPrevious = false;
+
/* Create a new TorControl object, used to communicate with Tor */
_torControl = Vidalia::torControl();
@@ -592,8 +594,20 @@ MainWindow::start()
if(settings.getControlMethod() == ControlMethod::Port) {
if(settings.autoControlPort()) {
- args << "ControlPort" << "auto";
- args << "SocksPort" << "auto";
+ QString control_str = "auto";
+ QString socks_str = "auto";
+
+ if(!_previousControlPort.isEmpty()) {
+ control_str = _previousControlPort;
+ _startedWithPrevious = true;
+ }
+ if(!_previousSocksPort.isEmpty()) {
+ socks_str = _previousSocksPort;
+ _startedWithPrevious = true;
+ }
+
+ args << "ControlPort" << control_str;
+ args << "SocksPort" << socks_str;
args << "ControlPortWriteToFile" << QString("%1/port.conf").arg(expDataDirectory);
} else {
/* Add the intended control port value */
@@ -806,6 +820,15 @@ MainWindow::startFailed(QString errmsg)
* that Qt gives us in this instance is almost always "Unknown Error". That
* will make users sad. */
Q_UNUSED(errmsg);
+
+ if(_startedWithPrevious) {
+ _startedWithPrevious = false;
+ _previousControlPort = "";
+ _previousSocksPort = "";
+ vWarn("Retrying with new ports");
+ start();
+ return;
+ }
updateTorStatus(Stopped);
@@ -833,6 +856,29 @@ void
MainWindow::connected()
{
authenticate();
+
+ TorSettings settings;
+ if(settings.autoControlPort()) {
+ // We want to remember the ports if it's on auto
+ QString control_str = "", socks_str = "";
+ if(_torControl->getInfo("net/listeners/control", control_str)) {
+ QStringList control_parts = control_str.split(":");
+ if(control_parts.size() > 1)
+ control_str = control_parts[1];
+ }
+ if(_torControl->getInfo("net/listeners/socks", socks_str)) {
+ QStringList socks_parts = socks_str.split(":");
+ if(socks_parts.size() > 1)
+ socks_str = socks_parts[1];
+ }
+
+ _previousControlPort = control_str;
+ _previousSocksPort = socks_str;
+ } else {
+ // Otherwise we want to clear the remembered ports
+ _previousControlPort = "";
+ _previousSocksPort = "";
+ }
}
/** Called when the connection to the control socket fails. The reason will be
diff --git a/src/vidalia/MainWindow.h b/src/vidalia/MainWindow.h
index 834d6c1..444c434 100644
--- a/src/vidalia/MainWindow.h
+++ b/src/vidalia/MainWindow.h
@@ -302,6 +302,10 @@ private:
PluginEngine *_engine;
QStringList _tabMap; /**< Map to handle opened tabs */
QStringList _detachedTabMap; /**< Map to handle detached tabs */
+
+ bool _startedWithPrevious; /**< True if Vidalia tried to start Tor with the previous ports */
+ QString _previousControlPort; /**< Holds the previous controlport used */
+ QString _previousSocksPort; /**< Holds the previous socksport used */
};
#endif
More information about the tor-commits
mailing list