# # # patch "cmd_netsync.cc" # from [a6bdb923f4d1519a4f4d0a4d00e37b6c237f6c6a] # to [0b4d4ff8280def4970e38dc7572a58dd4eef781b] # # patch "netsync.cc" # from [d135c6d75aacfb065e662c1363b1a452435c4c98] # to [2b907663423ebfafb588a534cd0f9a9cb66070f3] # # patch "network.cc" # from [0069872ed86ff7d572c3e9eafa129003bb1af799] # to [d125e63af6c148a794658caa76c6341a67843b30] # # patch "network.hh" # from [1d373c44e28c98c4724a500a44f4c22c125cae23] # to [3aea57c511ac5585a423dc5927a1fcfa08d35bd2] # ============================================================ --- cmd_netsync.cc a6bdb923f4d1519a4f4d0a4d00e37b6c237f6c6a +++ cmd_netsync.cc 0b4d4ff8280def4970e38dc7572a58dd4eef781b @@ -202,7 +202,6 @@ CMD(sync, "sync", "", CMD_REF(network), utf8 addr; globish include_pattern, exclude_pattern; extract_address(args, addr, app); - find_key_if_needed(addr, app); extract_patterns(args, include_pattern, exclude_pattern, app); find_key_if_needed(addr, include_pattern, exclude_pattern, app); @@ -333,8 +332,6 @@ CMD(clone, "clone", "", CMD_REF(network) client_session sess(addr, app); sess.request_service(&puller); - run_netsync_protocol(client_voice, sink_role, uris, - change_current_working_dir(workspace_dir); transaction_guard guard(app.db, false); @@ -465,7 +462,7 @@ CMD_NO_WORKSPACE(serve, "serve", "", CMD } else { - serve_connections_forever(app.opts.bind_address, app); + serve_connections_forever(app.opts.bind_uris, app); } } ============================================================ --- netsync.cc d135c6d75aacfb065e662c1363b1a452435c4c98 +++ netsync.cc 2b907663423ebfafb588a534cd0f9a9cb66070f3 @@ -601,8 +601,6 @@ netsync::netsync(protocol_role role, app(app), remote_peer_key_hash(""), remote_peer_key_name(""), - write_hmac(netsync_session_key(constants::netsync_key_initializer), - app.opts.use_transport_auth), authenticated(false), byte_in_ticker(NULL), byte_out_ticker(NULL), @@ -2299,80 +2297,6 @@ bool netsync::process(transaction_guard } } - if (app.lua.hook_get_netsync_connect_command(u, - I(addresses.size() == 1); - utf8 address(*addresses.begin()); - i->second->maybe_say_goodbye(guard); - else - { - for (std::list::const_iterator it = addresses.begin(); it != addresses.end(); ++it) - { - const utf8 & address = *it; - if (!address().empty()) - { - size_t l_colon = address().find(':'); - size_t r_colon = address().rfind(':'); - - if (l_colon == r_colon && l_colon == 0) - { - // can't be an IPv6 address as there is only one colon - // must be a : followed by a port - string port_str = address().substr(1); - addr.add_all_addresses(std::atoi(port_str.c_str())); - } - else - addr.add_address(address().c_str(), default_port); - } - } - } - guard = shared_ptr(new transaction_guard(app.db)); - - I(guard); - - while (!server_initiated_sync_requests.empty()) - { - server_initiated_sync_request request - = server_initiated_sync_requests.front(); - server_initiated_sync_requests.pop_front(); - - utf8 addr(request.address); - globish inc(request.include); - globish exc(request.exclude); - - try - { - P(F("connecting to %s") % addr()); - shared_ptr server - = build_stream_to_server(app, inc, exc, - addr, default_port, - timeout); - - // 'false' here means not to revert changes when - // the SockOpt goes out of scope. - Netxx::SockOpt socket_options(server->get_socketfd(), false); - socket_options.set_non_blocking(); - - protocol_role role = source_and_sink_role; - if (request.what == "sync") - role = source_and_sink_role; - else if (request.what == "push") - role = source_role; - else if (request.what == "pull") - role = sink_role; - - shared_ptr sess(new session(role, client_voice, - inc, exc, - app, addr(), server, true)); - - sessions.insert(make_pair(server->get_socketfd(), sess)); - } - catch (Netxx::NetworkException & e) - { - P(F("Network error: %s") % e.what()); - } - } - - arm_sessions_and_calculate_probe(probe, sessions, armed_sessions, *guard); void insert_with_parents(revision_id rev, refiner & ref, ============================================================ --- network.cc 0069872ed86ff7d572c3e9eafa129003bb1af799 +++ network.cc d125e63af6c148a794658caa76c6341a67843b30 @@ -1,3 +1,5 @@ +#include "base.hh" + #include "netio.hh" #include "network.hh" #include "sanity.hh" @@ -56,7 +58,8 @@ public: public: input_manager(bool use_transport_auth) : have_cmd(false), - read_hmac(constants::netsync_key_initializer, use_transport_auth) + read_hmac(netsync_session_key(constants::netsync_key_initializer), + use_transport_auth) {} inline bool full() const { @@ -122,7 +125,8 @@ public: public: output_manager(bool use_transport_auth) : buffer_size(0), - write_hmac(constants::netsync_key_initializer, use_transport_auth) + write_hmac(netsync_session_key(constants::netsync_key_initializer), + use_transport_auth) {} inline bool full() const { @@ -352,10 +356,10 @@ client_session::client_session(utf8 cons shared_ptr server; uri u; vector argv; - if (parse_uri(address(), u) - && app.lua.hook_get_netsync_connect_command(u, - global_sanity.debug, - argv)) + parse_uri(address(), u); + if (app.lua.hook_get_netsync_connect_command(u, + global_sanity.debug_p(), + argv)) { I(argv.size() > 0); string cmd = argv[0]; @@ -888,13 +892,10 @@ make_server(bool use_ipv6, app_state & a shared_ptr make_server(bool use_ipv6, app_state & app, - string & listenaddr) + std::list const & addresses) { - Netxx::port_type port; - if (app.opts.bind_port().empty()) - port = std::atoi(app.opts.bind_port().c_str()); - else - port = static_cast(constants::netsync_default_port); + Netxx::port_type default_port + = static_cast(constants::netsync_default_port); Netxx::Timeout timeout(static_cast(constants::netsync_timeout_seconds)); @@ -906,19 +907,31 @@ make_server(bool use_ipv6, app_state & a { Netxx::Address addr(use_ipv6); - if (!app.opts.bind_address().empty()) - addr.add_address(app.opts.bind_address().c_str(), port); + if (addresses.empty()) + addr.add_all_addresses(default_port); else - addr.add_all_addresses(port); + { + for (std::list::const_iterator it = addresses.begin(); + it != addresses.end(); ++it) + { + string const & address = (*it)(); + if (!address.empty()) + { + size_t l_colon = address.find(':'); + size_t r_colon = address.rfind(':'); + if (l_colon == r_colon && l_colon == 0) + addr.add_all_addresses(lexical_cast(address.substr(1))); + else + addr.add_address(address.c_str(), default_port); + } + } + } + shared_ptr srv (new Netxx::StreamServer(addr, timeout)); - const char * name = addr.get_name(); - listenaddr = (FL("%s : %s") - % (name != NULL ? name : _("")) - % lexical_cast(addr.get_port())).str(); - P(F("beginning service on %s") % listenaddr); + P(F("beginning service on %s") % addr.get_name()); return srv; } @@ -949,7 +962,8 @@ void } void -serve_connections_forever(utf8 const & addr, app_state & app) +serve_connections_forever(std::list const & addrs, + app_state & app) { #ifdef USE_IPV6 bool use_ipv6 = true; @@ -957,10 +971,9 @@ serve_connections_forever(utf8 const & a bool use_ipv6 = false; #endif ignore_sigpipe(); - string listenaddr; - shared_ptr srv = make_server(use_ipv6, app, listenaddr); + shared_ptr srv = make_server(use_ipv6, app, addrs); map > sessions; - run_network_loop(false, srv, sessions, app, listenaddr); + run_network_loop(false, srv, sessions, app); } void ============================================================ --- network.hh 1d373c44e28c98c4724a500a44f4c22c125cae23 +++ network.hh 3aea57c511ac5585a423dc5927a1fcfa08d35bd2 @@ -80,7 +80,7 @@ public: state request_service(service * newsrv); }; -void serve_connections_forever(utf8 const & addr, app_state & app); +void serve_connections_forever(std::list const & addrs, app_state & app); void serve_single_on_stdio(app_state & app);