# # # add_file "usher/dir_serverlist_reader.cc" # content [b8c52b94481a6b940b8639948ff3cb5cb7445309] # # add_file "usher/dir_serverlist_reader.hh" # content [8ce0af271ee1f8e8e474b5ed7689a420c342342e] # # patch "usher/Makefile.am" # from [f87f3d661caea844802c0182e9ea3021b91ec70a] # to [8279856a25e147ea67621157109f9f7e03900e73] # # patch "usher/usher.cc" # from [57d4235ae9446846b8d1ca456b8dc9b5f8165079] # to [3c27bc3a47beef0b9363815acfd0c00e299c9ff9] # ============================================================ --- usher/dir_serverlist_reader.cc b8c52b94481a6b940b8639948ff3cb5cb7445309 +++ usher/dir_serverlist_reader.cc b8c52b94481a6b940b8639948ff3cb5cb7445309 @@ -0,0 +1,86 @@ +#include "dir_serverlist_reader.hh" + +#include + +using std::string; +using std::vector; +using std::set; + +using namespace basic_io; + +dir_serverlist_reader::dir_serverlist_reader(string const &fn) + : filename(fn) +{ +} + +dir_serverlist_reader::~dir_serverlist_reader() +{ +} + +serverspec +dir_serverlist_reader::get_next() +{ + serverspec ss; + if (!dir) + { + ss.valid = false; + return ss; + } + dirent *d = readdir(dir); + if (!d) + { + ss.valid = false; + return ss; + } + ss.name = d->d_name; + ss.valid = true; + ss.local = true; + string mydir = project_dir + "/" + ss.name; + ss.local_args.push_back("--database=" + mydir + "/database"); + ss.local_args.push_back("--confidr=" + mydir); + ss.local_args.push_back("*"); + ss.hosts.insert(ss.name + "."); + return ss; +} + +bool +dir_serverlist_reader::begin_reading() +{ + std::ifstream ifs(filename.c_str()); + vector delims; + basic_io::stanza_reader reader(ifs, delims); + basic_io::stanza st; + bool ok = reader.get(st); + ifs.close(); + if (!ok) + return false; + + for (vector::iterator i = st.items.begin(); + i != st.items.end(); ++i) + { + if (i->key == "project_dir") + { + if (!i->values.empty()) + project_dir = i->values[0].parsed; + } + else if (i->key == "monotone") + { + if (!i->values.empty()) + monotone = i->values[0].parsed; + } + else if (i->key == "logdir") + { + if (!i->values.empty()) + logdir = i->values[0].parsed; + } + } + dir = opendir(project_dir.c_str()); + + return dir; +} + +void +dir_serverlist_reader::end_reading() +{ + closedir(dir); +} ============================================================ --- usher/dir_serverlist_reader.hh 8ce0af271ee1f8e8e474b5ed7689a420c342342e +++ usher/dir_serverlist_reader.hh 8ce0af271ee1f8e8e474b5ed7689a420c342342e @@ -0,0 +1,24 @@ +#ifndef __DIR_SERVERLIST_READER_HH_ +#define __DIR_SERVERLIST_READER_HH_ + +#include "serverlist_reader.hh" +#include "io.hh" + +#include + +#include +#include + +struct dir_serverlist_reader : public serverlist_reader +{ + std::string filename; + DIR *dir; + std::string project_dir, monotone, logdir; + dir_serverlist_reader(std::string const &fn); + ~dir_serverlist_reader(); + virtual serverspec get_next(); + virtual bool begin_reading(); + virtual void end_reading(); +}; + +#endif ============================================================ --- usher/Makefile.am f87f3d661caea844802c0182e9ea3021b91ec70a +++ usher/Makefile.am 8279856a25e147ea67621157109f9f7e03900e73 @@ -5,6 +5,7 @@ basic_io_serverlist_reader.cc basic_io_serverlist_reader.hh \ buffer.cc buffer.hh \ channel.cc channel.hh \ + dir_serverlist_reader.cc dir_serverlist_reader.hh \ err.cc err.hh \ io.cc io.hh \ query_client.cc query_client.hh \ ============================================================ --- usher/usher.cc 57d4235ae9446846b8d1ca456b8dc9b5f8165079 +++ usher/usher.cc 3c27bc3a47beef0b9363815acfd0c00e299c9ff9 @@ -6,7 +6,7 @@ #include "err.hh" #include "channel.hh" #include "server_manager.hh" -#include "basic_io_serverlist_reader.hh" +#include "dir_serverlist_reader.hh" #include "query_client.hh" #include @@ -105,7 +105,7 @@ int main (int argc, char **argv) { pidfile pf; - basic_io_serverlist_reader reader(conffile); + dir_serverlist_reader reader(conffile); server_manager manager(reader); administrator admin(manager, conffile); {