# # # patch "Makefile.am" # from [600c270a0e0ccbc8adaccc199050c8a571a19332] # to [f87f3d661caea844802c0182e9ea3021b91ec70a] # # patch "query_client.cc" # from [0173bfeca26f746ee592ade7c743c03d59611550] # to [4aaedbdb9403d7cb33f459a7a0b6e500716cc341] # # patch "query_client.hh" # from [147311b466079c93ba80c3e564bc8a126ec03ccf] # to [e45fb70cd2feee54885cded16c277071ff0b8892] # # patch "server.cc" # from [f75bf400b10f5036210cd997b0b7b344876b104c] # to [f713179678ccaaeb5fb6e91e311de1ea8bd1a92a] # # patch "server.hh" # from [0266eae7db0a66205c6036f4d5c60ca81d57b80b] # to [750c094326121c1ddfc3c45f6fb9f9db43c57215] # # patch "server_manager.cc" # from [b440ed62ee4963c0d737cfc5768a4b91b2fe81ec] # to [0ac40f5d2df7553d9e72ab336d68cabec0711a4a] # # patch "server_manager.hh" # from [295bbc931e3c7acd0fa21589ca509b26812381fa] # to [edc251e468e963f6b4fe1a1c038457b10e3d4e9c] # # patch "sock.cc" # from [3aa1ae7006abe004eaecbeafcf526c1a98abb3e8] # to [138d9907656c90168d47e60f470a549216d29670] # # patch "usher.cc" # from [aec6d75a4cb98164e903cbda973b0b20de53859d] # to [57d4235ae9446846b8d1ca456b8dc9b5f8165079] # ============================================================ --- Makefile.am 600c270a0e0ccbc8adaccc199050c8a571a19332 +++ Makefile.am f87f3d661caea844802c0182e9ea3021b91ec70a @@ -9,7 +9,7 @@ io.cc io.hh \ query_client.cc query_client.hh \ server.cc server.hh \ - serverlist_reader.hh \ + serverlist_reader.cc serverlist_reader.hh \ server_manager.cc server_manager.hh \ sock.cc sock.hh \ usher.cc ============================================================ --- query_client.cc 0173bfeca26f746ee592ade7c743c03d59611550 +++ query_client.cc 4aaedbdb9403d7cb33f459a7a0b6e500716cc341 @@ -1,4 +1,5 @@ #include "buffer.hh" +#include "query_client.hh" #include using std::string; ============================================================ --- query_client.hh 147311b466079c93ba80c3e564bc8a126ec03ccf +++ query_client.hh e45fb70cd2feee54885cded16c277071ff0b8892 @@ -6,9 +6,7 @@ struct buffer; extern std::string const greeting; -//extern std::string const notfound; -//extern std::string const disabled; -//extern std::string const srvdisabled; +extern std::string const disabled; void make_packet(std::string const & msg, char * & pkt, int & size); ============================================================ --- server.cc f75bf400b10f5036210cd997b0b7b344876b104c +++ server.cc f713179678ccaaeb5fb6e91e311de1ea8bd1a92a @@ -1,5 +1,6 @@ #include "server.hh" #include "err.hh" +#include "server_manager.hh" #include using std::cerr; @@ -11,6 +12,8 @@ #include using boost::lexical_cast; +extern string monotone; + // keep local servers around for this many seconds after the last // client disconnects from them (only accurate to ~10 seconds) int const server_idle_timeout = 60; @@ -85,8 +88,9 @@ return os; } -server::server() : enabled(true), local(false), pid(-1), port(0), - connection_count(0), last_conn_time(0) +server::server(server_manager &sm) + : enabled(true), local(false), pid(-1), port(0), + connection_count(0), last_conn_time(0), manager(sm) { } @@ -100,8 +104,8 @@ { serverstate ss; ss.num = connection_count; - if (!connections_allowed) { - if (!total_connections) + if (!manager.connections_allowed) { + if (!manager.total_connections) ss.state = serverstate::shutdown; else ss.state = serverstate::shuttingdown; @@ -227,7 +231,7 @@ return; int difftime = time(0) - last_conn_time; if (!connection_count - && (difftime > server_idle_timeout || !connections_allowed)) + && (difftime > server_idle_timeout || !manager.connections_allowed)) yeskill(); else if (waitpid(pid, 0, WNOHANG) > 0) { pid = -1; @@ -244,7 +248,6 @@ do {r = waitpid(pid, 0, 0);} while (r==-1 && errno == EINTR); pid = -1; port = 0; - live_servers.erase(live_servers.find(by_name->second)); } } ============================================================ --- server.hh 0266eae7db0a66205c6036f4d5c60ca81d57b80b +++ server.hh 750c094326121c1ddfc3c45f6fb9f9db43c57215 @@ -8,6 +8,8 @@ #include using std::vector; +struct server_manager; + struct serverstate { enum ss {remote, active, waiting, sleeping, stopping, @@ -30,7 +32,8 @@ int port; int connection_count; int last_conn_time; - server(); + server_manager &manager; + server(server_manager &sm); ~server(); serverstate get_state(); sock connect(); ============================================================ --- server_manager.cc b440ed62ee4963c0d737cfc5768a4b91b2fe81ec +++ server_manager.cc 0ac40f5d2df7553d9e72ab336d68cabec0711a4a @@ -1,8 +1,25 @@ #include "server_manager.hh" #include "serverlist_reader.hh" +#include "err.hh" +#include +using std::max; +using std::min; +using std::make_pair; + #include +serversock::serversock(sock const &o) + : sock(o) +{ +} + +bool +server_manager::serverdata::operator==(serverdata const &o) +{ + return name == o.name && hosts == o.hosts && patterns == o.patterns; +} + server_manager::server_manager(serverlist_reader &r) : reader(r) { @@ -14,7 +31,7 @@ : str(s), ok_shorter(b) {} server_manager::prefix::~prefix() {} server_manager::prefix::operator string() {return str;} -int server_manager::prefix::cmp(prefix const &r) +int server_manager::prefix::cmp(prefix const &r) const { unsigned int size = min(str.size(), r.str.size()); int c = strncmp(str.c_str(), r.str.c_str(), size); @@ -26,15 +43,15 @@ else // (r.ok_shorter) return (c==0)?min(longer,0):c; } -bool server_manager::prefix::operator<(prefix const &r) +bool server_manager::prefix::operator<(prefix const &r) const { return cmp(r) < 0; } -bool server_manager::prefix::operator==(prefix const &r) +bool server_manager::prefix::operator==(prefix const &r) const { return cmp(r) == 0; } -bool server_manager::prefix::operator>(prefix const &r) +bool server_manager::prefix::operator>(prefix const &r) const { return cmp(r) > 0; } @@ -55,16 +72,16 @@ void server_manager::delist_server(shared_ptr srv) { - map >::iterator j = by_name.find(i->second.name); - if (j == by_name.end()) - return; serverdata sd; - map, serverdata>::iterator k = servers.find(j->second); + map, serverdata>::iterator k = servers.find(srv); if (k != servers.end()) { sd = k->second; servers.erase(k); } + map >::iterator j = by_name.find(sd.name); + if (j == by_name.end()) + return; by_name.erase(j); map >::iterator i; for (set::iterator j = sd.hosts.begin(); @@ -105,7 +122,7 @@ preexist = true; } else - srv.resert(new server()); + srv.reset(new server(*this)); srv->local = ss.local; if (ss.local) { @@ -126,7 +143,7 @@ if (i->second == sd) continue; else - delist_server(ss.name); + delist_server(srv); } add_replace_server(srv, sd); } @@ -135,7 +152,7 @@ j != all.end(); ++j) { map >::iterator i = by_name.find(*j); - if (i != b_name.end()) + if (i != by_name.end()) delist_server(i->second); } } @@ -164,11 +181,11 @@ { sock s = srv->connect(); serversock ss(s); - ss.server = srv; + ss.srv = srv; ++total_connections; if (srv->local && srv->connection_count == 1) { - live_servers.insert(srv); + live.insert(srv); } return ss; } @@ -178,7 +195,9 @@ void server_manager::disconnect_from_server(serversock const &s) { - s.server->disconnect(); + s.srv->disconnect(); + if (s.srv->local && s.srv->pid == -1) + live.erase(s.srv); --total_connections; } serverstate @@ -186,7 +205,7 @@ { map >::iterator i = by_name.find(name); if (i != by_name.end()) - return i->second.get_state(); + return i->second->get_state(); throw errstr("No such server."); } @@ -194,6 +213,6 @@ server_manager::kill_old_servers() { set >::iterator i; - for (i = server::live.begin(); i != server::live.end(); ++i) + for (i = live.begin(); i != live.end(); ++i) (*i)->maybekill(); } ============================================================ --- server_manager.hh 295bbc931e3c7acd0fa21589ca509b26812381fa +++ server_manager.hh edc251e468e963f6b4fe1a1c038457b10e3d4e9c @@ -19,6 +19,7 @@ struct serversock : public sock { shared_ptr srv; + serversock(sock const &o); }; struct server_manager @@ -27,6 +28,7 @@ { string name; set hosts, patterns; + bool operator==(serverdata const &o); }; struct prefix { @@ -36,10 +38,10 @@ prefix(string const &s, bool b); ~prefix(); operator string(); - int cmp(prefix const &r); - bool operator<(prefix const &r); - bool operator==(prefix const &r); - bool operator>(prefix const &r); + int cmp(prefix const &r) const; + bool operator<(prefix const &r) const; + bool operator==(prefix const &r) const; + bool operator>(prefix const &r) const; }; map > by_host, by_pattern; map > by_name; ============================================================ --- sock.cc 3aa1ae7006abe004eaecbeafcf526c1a98abb3e8 +++ sock.cc 138d9907656c90168d47e60f470a549216d29670 @@ -1,8 +1,18 @@ #include "sock.hh" #include "buffer.hh" +#include "err.hh" +#include #include +#include +#include +#include +using std::set; +using std::string; +#include +using std::cerr; + sock::operator int() { if (!s) @@ -10,6 +20,7 @@ else return s[0]; } + sock::sock(int ss) { s = new int[2]; @@ -17,13 +28,16 @@ s[1] = 1; all_socks.insert(s); } + sock::sock(sock const & ss) { s = ss.s; if (s) s[1]++; } -void sock::deref() + +void +sock::deref() { if (s && !(--s[1])) { try { @@ -36,11 +50,14 @@ } s = 0; } + sock::~sock() { deref(); } -sock const & sock::operator=(int ss) + +sock const & +sock::operator=(int ss) { deref(); s = new int[2]; @@ -48,7 +65,9 @@ s[0]=ss; return *this; } -sock const & sock::operator=(sock const & ss) + +sock const & +sock::operator=(sock const & ss) { deref(); s = ss.s; @@ -56,7 +75,9 @@ ++s[1]; return *this; } -void sock::close() + +void +sock::close() { if (!s || s[0] == -1) return; @@ -69,7 +90,9 @@ } s[0]=-1; } -static void sock::close_all_socks() + +void +sock::close_all_socks() { for (set::iterator i = all_socks.begin(); i != all_socks.end(); ++i) { while (::close((*i)[0]) < 0) @@ -77,7 +100,9 @@ break; } } -bool sock::read_to(buffer & buf) + +bool +sock::read_to(buffer & buf) { if (!s) return false; @@ -92,7 +117,9 @@ buf.fixwrite(n); return true; } -bool sock::write_from(buffer & buf) + +bool +sock::write_from(buffer & buf) { if (!s) return false; ============================================================ --- usher.cc aec6d75a4cb98164e903cbda973b0b20de53859d +++ usher.cc 57d4235ae9446846b8d1ca456b8dc9b5f8165079 @@ -1,7 +1,14 @@ // -*- mode: C++; c-file-style: "gnu"; indent-tabs-mode: nil -*- // Timothy Brownawell // GPL v2 +#include "administrator.hh" +#include "err.hh" +#include "channel.hh" +#include "server_manager.hh" +#include "basic_io_serverlist_reader.hh" +#include "query_client.hh" + #include #include #include @@ -98,7 +105,9 @@ int main (int argc, char **argv) { pidfile pf; - administrator admin; + basic_io_serverlist_reader reader(conffile); + server_manager manager(reader); + administrator admin(manager, conffile); { int i; for (i = 1; i < argc; ++i) { @@ -123,7 +132,7 @@ exit (1); } } - reload_conffile(conffile); + admin.reload_conffile(); struct sigaction sa, sa_old; @@ -181,8 +190,8 @@ memset(&client_address, 0, l); sock cli = tosserr(accept(h, (struct sockaddr *) &client_address, &l), "accept()"); - if (connections_allowed) - newchan = new channel(cli); + if (manager.connections_allowed) + newchan = new channel(cli, manager); else { char * dat; int size; @@ -214,11 +223,11 @@ delete newchan; newchan = 0; } - kill_old_servers(); + manager.kill_old_servers(); if (reload_pending) { - reload_pendinf = false; - reload_conffile(conffile); + reload_pending = false; + admin.reload_conffile(); } admin.process_selected(rd, wr, er);