aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Corallo <git@bluematt.me>2013-01-23 11:45:00 -0500
committerMatt Corallo <git@bluematt.me>2013-01-27 03:03:04 -0500
commit72a348fd9a7015aa039f9cbdc9166f388f4725e0 (patch)
treeac3b1167ed8737ec0709600834a6379571abbcf2
parentf339e9e3391465de4921aea3194f3021016f07d1 (diff)
Add addnode RPC command.
-rw-r--r--src/bitcoinrpc.cpp1
-rw-r--r--src/bitcoinrpc.h1
-rw-r--r--src/rpcnet.cpp42
3 files changed, 44 insertions, 0 deletions
diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
index a1e39d7506..910d52a9fe 100644
--- a/src/bitcoinrpc.cpp
+++ b/src/bitcoinrpc.cpp
@@ -201,6 +201,7 @@ static const CRPCCommand vRPCCommands[] =
{ "getblockcount", &getblockcount, true, false },
{ "getconnectioncount", &getconnectioncount, true, false },
{ "getpeerinfo", &getpeerinfo, true, false },
+ { "addnode", &addnode, true, true },
{ "getdifficulty", &getdifficulty, true, false },
{ "getgenerate", &getgenerate, true, false },
{ "setgenerate", &setgenerate, true, false },
diff --git a/src/bitcoinrpc.h b/src/bitcoinrpc.h
index 44050ae1bb..4e4ac4ff81 100644
--- a/src/bitcoinrpc.h
+++ b/src/bitcoinrpc.h
@@ -132,6 +132,7 @@ extern void EnsureWalletIsUnlocked();
extern json_spirit::Value getconnectioncount(const json_spirit::Array& params, bool fHelp); // in rpcnet.cpp
extern json_spirit::Value getpeerinfo(const json_spirit::Array& params, bool fHelp);
+extern json_spirit::Value addnode(const json_spirit::Array& params, bool fHelp);
extern json_spirit::Value dumpprivkey(const json_spirit::Array& params, bool fHelp); // in rpcdump.cpp
extern json_spirit::Value importprivkey(const json_spirit::Array& params, bool fHelp);
diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp
index 491297eb1d..f3b41e5be7 100644
--- a/src/rpcnet.cpp
+++ b/src/rpcnet.cpp
@@ -65,3 +65,45 @@ Value getpeerinfo(const Array& params, bool fHelp)
return ret;
}
+Value addnode(const Array& params, bool fHelp)
+{
+ string strCommand;
+ if (params.size() == 2)
+ strCommand = params[1].get_str();
+ if (fHelp || params.size() != 2 ||
+ (strCommand != "onetry" && strCommand != "add" && strCommand != "remove"))
+ throw runtime_error(
+ "addnode <node> <add|remove|onetry>\n"
+ "Attempts add or remove <node> from the addnode list or try a connection to <node> once.");
+
+ string strNode = params[0].get_str();
+
+ if (strCommand == "onetry")
+ {
+ CAddress addr;
+ ConnectNode(addr, strNode.c_str());
+ return Value::null;
+ }
+
+ LOCK(cs_vAddedNodes);
+ vector<string>::iterator it = vAddedNodes.begin();
+ for(; it != vAddedNodes.end(); it++)
+ if (strNode == *it)
+ break;
+
+ if (strCommand == "add")
+ {
+ if (it != vAddedNodes.end())
+ throw JSONRPCError(-23, "Error: Node already added");
+ vAddedNodes.push_back(strNode);
+ }
+ else if(strCommand == "remove")
+ {
+ if (it == vAddedNodes.end())
+ throw JSONRPCError(-24, "Error: Node has not been added.");
+ vAddedNodes.erase(it);
+ }
+
+ return Value::null;
+}
+