diff --git a/SConstruct b/SConstruct index 83dd04ef4..8362a9383 100644 --- a/SConstruct +++ b/SConstruct @@ -106,7 +106,7 @@ env.Append(LINKFLAGS = ['-rdynamic', '-pthread']) env.Append(CCFLAGS = ['-pthread', '-Wall', '-Wno-sign-compare', '-Wno-char-subscripts', '-DSQLITE_THREADSAFE=1']) env.Append(CXXFLAGS = ['-O0', '-pthread', '-Wno-invalid-offsetof', '-Wformat']+BOOSTFLAGS+DEBUGFLAGS) -if (GCC_VERSION[0] > 4 or (GCC_VERSION[0] == 4 and GCC_VERSION[1] >= 7)): +if (int(GCC_VERSION[0]) > 4 or (int(GCC_VERSION[0]) == 4 and int(GCC_VERSION[1]) >= 7)): env.Append(CXXFLAGS = ['-std=c++11']) if OSX: diff --git a/rippled-example.cfg b/rippled-example.cfg index 1d5fa6d73..fa5690e56 100644 --- a/rippled-example.cfg +++ b/rippled-example.cfg @@ -17,7 +17,7 @@ # # Example: debug.log # -# [validators]: +# [validators] # List of nodes to always accept as validators. Nodes are specified by domain # or public key. # @@ -32,7 +32,7 @@ # n9KorY8QtTdRx7TVDpwnG9NvyxsDwHUKUEeDLY3AkiGncVaSXZi5 # n9MqiExBcoG19UXwoLjBJnhsxEhAZMuWwJDRdkyDz1EkEkwzQTNt John Doe # -# [validators_file]: +# [validators_file] # Path to file contain a list of nodes to always accept as validators. Use # this to specify a file other than this file to manage your validators list. # @@ -51,13 +51,13 @@ # C:/home/johndoe/ripple/validators.txt # /home/johndoe/ripple/validators.txt # -# [validators_site]: +# [validators_site] # Specifies where to find validators.txt for UNL boostrapping and RPC # unl_network command. # # Example: ripple.com # -# [ips]: +# [ips] # List of ips where the Ripple protocol is served. For a starter list, you # can copy entries from: https://ripple.com/ripple.txt # @@ -80,38 +80,38 @@ # time.nist.gov # pool.ntp.org # -# [peer_ip]: +# [peer_ip] # IP address or domain to bind to allow external connections from peers. # Defaults to not binding, which disallows external connections from peers. # # Examples: 0.0.0.0 - Bind on all interfaces. # -# [peer_port]: +# [peer_port] # If peer_ip is supplied, corresponding port to bind to for peer connections. # -# [peer_private]: +# [peer_private] # 0 or 1. # 0: request peers to broadcast your address. [default] # 1: request peers not broadcast your address. # -# [rpc_ip]: +# [rpc_ip] # IP address or domain to bind to allow insecure RPC connections. # Defaults to not binding, which disallows RPC connections. # -# [rpc_port]: +# [rpc_port] # If rpc_ip is supplied, corresponding port to bind to for peer connections. # -# [rpc_allow_remote]: +# [rpc_allow_remote] # 0 or 1. # 0: Allow RPC connections only from 127.0.0.1. [default] # 1: Allow RPC connections from any IP. # -# [rpc_admin_allow]: +# [rpc_admin_allow] # Specify an list of IP addresses allowed to have admin access. One per line. # # Defaults to 127.0.0.1. # -# [rpc_user]: +# [rpc_user] # As a server, require a this user to specified and require rpc_password to # be checked for RPC access via the rpc_ip and rpc_port. The user and password # must be specified via HTTP's basic authentication method. @@ -119,7 +119,7 @@ # As a client, supply this to the server via HTTP's basic authentication # method. # -# [rpc_password]: +# [rpc_password] # As a server, require a this password to specified and require rpc_user to # be checked for RPC access via the rpc_ip and rpc_port. The user and password # must be specified via HTTP's basic authentication method. @@ -127,7 +127,7 @@ # As a client, supply this to the server via HTTP's basic authentication # method. # -# [rpc_admin_user]: +# [rpc_admin_user] # As a server, require this as the admin user to be specified. Also, require # rpc_admin_user and rpc_admin_password to be checked for RPC admin functions. # The request must specify these as the admin_user and admin_password in the @@ -135,7 +135,7 @@ # # As a client, supply this to the server in the request object. # -# [rpc_admin_password]: +# [rpc_admin_password] # As a server, require this as the admin pasword to be specified. Also, # require rpc_admin_user and rpc_admin_password to be checked for RPC admin # functions. The request must specify these as the admin_user and @@ -143,12 +143,12 @@ # # As a client, supply this to the server in the request object. # -# [validation_quorum]: +# [validation_quorum] # Sets the minimum number of trusted validations a ledger must have before # the server considers it fully validated. Note that if you are validating, # your validation counts. # -# [websocket_public_ip]: +# [websocket_public_ip] # IP address or domain to bind to allow untrusted connections from clients. # In the future, this option will go away and the peer_ip will accept # websocket client connections. @@ -156,7 +156,7 @@ # Examples: 0.0.0.0 - Bind on all interfaces. # 127.0.0.1 - Bind on localhost interface. Only local programs may connect. # -# [websocket_public_port]: +# [websocket_public_port] # Port to bind to allow untrusted connections from clients. In the future, # this option will go away and the peer_ip will accept websocket client # connections. @@ -172,14 +172,14 @@ # reference client currently shares secrets with its server, this should be # enabled. # -# [websocket_ip]: +# [websocket_ip] # IP address or domain to bind to allow trusted ADMIN connections from backend # applications. # # Examples: 0.0.0.0 - Bind on all interfaces. # 127.0.0.1 - Bind on localhost interface. Only local programs may connect. # -# [websocket_port]: +# [websocket_port] # Port to bind to allow trusted ADMIN connections from backend applications. # # [websocket_secure] @@ -188,14 +188,14 @@ # 1: Provide ws and wss service for websocket_ip/websocket_port # 2: Provide wss service for websocket_ip/websocket_port. # -# [websocket_ssl_key]: +# [websocket_ssl_key] # Specify the filename holding the SSL key in PEM format. # -# [websocket_ssl_cert]: +# [websocket_ssl_cert] # Specify the path to the SSL certificate file in PEM format. # This is not needed if the chain includes it. # -# [websocket_ssl_chain]: +# [websocket_ssl_chain] # If you need a certificate chain, specify the path to the certificate chain # here. The chain may include the end certificate. # @@ -205,7 +205,7 @@ # that the server will accept for verifying HTTP servers. Used only for # outbound HTTPS client connections. # -# [validation_seed]: +# [validation_seed] # To perform validation, this section should contain either a validation seed # or key. The validation seed is used to generate the validation # public/private key pair. To obtain a validation seed, use the @@ -214,7 +214,7 @@ # Examples: RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE # shfArahZT9Q9ckTf3s1psJ7C7qzVN # -# [node_seed]: +# [node_seed] # This is used for clustering. To force a particular node seed or key, the # key can be set here. The format is the same as the validation_seed field. # To obtain a validation seed, use the validation_create command. @@ -222,19 +222,19 @@ # Examples: RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE # shfArahZT9Q9ckTf3s1psJ7C7qzVN # -# [node_size]: +# [node_size] # Tunes the servers based on the expected load and available memory. Legal # sizes are "tiny", "small", "medium", "large", and "huge". We recommend # you start at the default and raise the setting if you have extra memory. # The default is "tiny". # -# [cluster_nodes]: +# [cluster_nodes] # To extend full trust to other nodes, place their node public keys here. # Generally, you should only do this for nodes under common administration. # Node public keys start with an 'n'. To give a node a name for identification # place a space after the public key and then the name. # -# [ledger_history]: +# [ledger_history] # The number of past ledgers to acquire on server startup and the minimum to # maintain while running. # @@ -244,7 +244,7 @@ # # The default is: 256 # -# [database_path]: +# [database_path] # Full path of database directory. # # [path_search_size] @@ -253,10 +253,12 @@ # # The default is: 5 # -# [rpc_startup]: +# [rpc_startup] # Specify a list of RPC commands to run at startup. # -# Example: { "command" : "server_info" } +# Examples: +# { "command" : "server_info" } +# { "command" : "log_level", "partition" : "ripplecalc", "severity" : "trace" } # # Allow other peers to connect to this server. diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 872cf7b71..0a9b408b9 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1065,16 +1065,16 @@ void NetworkOPs::setMode(OperatingMode om) std::vector< std::pair > - NetworkOPs::getAccountTxs(const RippleAddress& account, uint32 minLedger, uint32 maxLedger) + NetworkOPs::getAccountTxs(const RippleAddress& account, uint32 minLedger, uint32 maxLedger, bool bAdmin) { // can be called with no locks std::vector< std::pair > ret; std::string sql = - str(boost::format("SELECT AccountTransactions.LedgerSeq,Status,RawTxn,TxnMeta FROM " + boost::str(boost::format("SELECT AccountTransactions.LedgerSeq,Status,RawTxn,TxnMeta FROM " "AccountTransactions INNER JOIN Transactions ON Transactions.TransID = AccountTransactions.TransID " "WHERE Account = '%s' AND AccountTransactions.LedgerSeq <= '%u' AND AccountTransactions.LedgerSeq >= '%u' " - "ORDER BY AccountTransactions.LedgerSeq,AccountTransactions.TransID DESC LIMIT 200;") - % account.humanAccountID() % maxLedger % minLedger); + "ORDER BY AccountTransactions.LedgerSeq,AccountTransactions.TransID DESC%s;") + % account.humanAccountID() % maxLedger % minLedger % (bAdmin ? "" : " LIMIT 200")); { Database* db = theApp->getTxnDB()->getDB(); @@ -1103,15 +1103,15 @@ std::vector< std::pair > } std::vector NetworkOPs::getAccountTxsB( - const RippleAddress& account, uint32 minLedger, uint32 maxLedger) + const RippleAddress& account, uint32 minLedger, uint32 maxLedger, bool bAdmin) { // can be called with no locks std::vector< txnMetaLedgerType> ret; std::string sql = str(boost::format("SELECT AccountTransactions.LedgerSeq,Status,RawTxn,TxnMeta FROM " "AccountTransactions INNER JOIN Transactions ON Transactions.TransID = AccountTransactions.TransID " "WHERE Account = '%s' AND AccountTransactions.LedgerSeq <= '%u' AND AccountTransactions.LedgerSeq >= '%u' " - "ORDER BY AccountTransactions.LedgerSeq,AccountTransactions.TransID DESC LIMIT 500;") - % account.humanAccountID() % maxLedger % minLedger); + "ORDER BY AccountTransactions.LedgerSeq,AccountTransactions.TransID DESC%s;") + % account.humanAccountID() % maxLedger % minLedger % (bAdmin ? "" : " LIMIT 500")); { Database* db = theApp->getTxnDB()->getDB(); diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h index 00cb710c9..3047aa139 100644 --- a/src/cpp/ripple/NetworkOPs.h +++ b/src/cpp/ripple/NetworkOPs.h @@ -294,11 +294,11 @@ public: // client information retrieval functions std::vector< std::pair > - getAccountTxs(const RippleAddress& account, uint32 minLedger, uint32 maxLedger); + getAccountTxs(const RippleAddress& account, uint32 minLedger, uint32 maxLedger, bool bAdmin); typedef boost::tuple txnMetaLedgerType; std::vector - getAccountTxsB(const RippleAddress& account, uint32 minL, uint32 maxL); + getAccountTxsB(const RippleAddress& account, uint32 minL, uint32 maxL, bool bAdmin); std::vector getLedgerAffectedAccounts(uint32 ledgerSeq); std::vector getLedgerTransactions(uint32 ledgerSeq); diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index cc0a84f7e..7fdf59e00 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -9,7 +9,6 @@ #include "Pathfinder.h" #include "Log.h" -#include "NetworkOPs.h" #include "RPCHandler.h" #include "RPCSub.h" #include "Application.h" @@ -1706,7 +1705,8 @@ Json::Value RPCHandler::doAccountTransactions(Json::Value jvRequest, int& cost) if (jvRequest.isMember("binary") && jvRequest["binary"].asBool()) { std::vector txns = - mNetOps->getAccountTxsB(raAccount, minLedger, maxLedger); + mNetOps->getAccountTxsB(raAccount, minLedger, maxLedger, mRole == ADMIN); + for (std::vector::const_iterator it = txns.begin(), end = txns.end(); it != end; ++it) { @@ -1723,7 +1723,7 @@ Json::Value RPCHandler::doAccountTransactions(Json::Value jvRequest, int& cost) } else { - std::vector< std::pair > txns = mNetOps->getAccountTxs(raAccount, minLedger, maxLedger); + std::vector< std::pair > txns = mNetOps->getAccountTxs(raAccount, minLedger, maxLedger, mRole == ADMIN); for (std::vector< std::pair >::iterator it = txns.begin(), end = txns.end(); it != end; ++it) { Json::Value obj(Json::objectValue); diff --git a/src/cpp/ripple/RPCHandler.h b/src/cpp/ripple/RPCHandler.h index 63ba7b556..b716ebc55 100644 --- a/src/cpp/ripple/RPCHandler.h +++ b/src/cpp/ripple/RPCHandler.h @@ -8,6 +8,7 @@ #include "RippleAddress.h" #include "SerializedTypes.h" #include "Ledger.h" +#include "NetworkOPs.h" #define LEDGER_CURRENT -1 #define LEDGER_CLOSED -2 diff --git a/src/cpp/ripple/main.cpp b/src/cpp/ripple/main.cpp index 8a7ed48b2..e717d20be 100644 --- a/src/cpp/ripple/main.cpp +++ b/src/cpp/ripple/main.cpp @@ -188,8 +188,17 @@ int main(int argc, char* argv[]) } } + if (iResult) + { + nothing(); + } + else if (vm.count("help")) + { + iResult = 1; + } + if (HaveSustain() && - !vm.count("parameters") && !vm.count("fg") && !vm.count("standalone") && !vm.count("unittest")) + !iResult && !vm.count("parameters") && !vm.count("fg") && !vm.count("standalone") && !vm.count("unittest")) { std::string logMe = DoSustain(); if (!logMe.empty()) @@ -251,10 +260,6 @@ int main(int argc, char* argv[]) { nothing(); } - else if (vm.count("help")) - { - iResult = 1; - } else if (!vm.count("parameters")) { // No arguments. Run server. diff --git a/src/cpp/ripple/utils.cpp b/src/cpp/ripple/utils.cpp index a8bbaa75a..f2eb6945a 100644 --- a/src/cpp/ripple/utils.cpp +++ b/src/cpp/ripple/utils.cpp @@ -4,6 +4,10 @@ #include #include #endif +#ifdef __FreeBSD__ +#include +#include +#endif #include @@ -336,8 +340,8 @@ uint32_t htobe32(uint32_t value) } uint32_t be32toh(uint32_t value) -{ - return( _byteswap_ulong(value)); +{ + return( _byteswap_ulong(value)); } #endif @@ -443,8 +447,8 @@ std::string DoSustain() #else bool HaveSustain() { return false; } -std::string DoSustain() { return std::string; } -std::string StopSustain() { return std::string; } +std::string DoSustain() { return std::string(); } +std::string StopSustain() { return std::string(); } #endif diff --git a/test/server.js b/test/server.js index 5b9e63958..bb0936ca3 100644 --- a/test/server.js +++ b/test/server.js @@ -192,7 +192,8 @@ Server.prototype.stop = function () { if (!self.quiet) console.log("server: stop: server exited"); self.emit('stopped'); - delete this.child; + + delete self.child; }); this.child.kill(); diff --git a/test/testutils.js b/test/testutils.js index b81df4861..39495f213 100644 --- a/test/testutils.js +++ b/test/testutils.js @@ -129,14 +129,14 @@ var build_teardown = function (host) { .connect(false); }, function stopServerStep(callback) { - if (opts.no_server) { + return callback(); + } - return callback(); - } - - data.server.on('stopped', callback).stop(); + data.server + .on('stopped', callback) + .stop(); } ], done); };