diff --git a/distrib/distrib.cc b/distrib/distrib.cc index 8a5891e..de1b47d 100644 --- a/distrib/distrib.cc +++ b/distrib/distrib.cc @@ -22,6 +22,8 @@ int distrib::readHostFile(const char * filename) while ( ! ifs.eof() ) { ifs >> host; + if ( ifs.eof() ) + break; m_hosts.push_back(host); } @@ -29,17 +31,18 @@ int distrib::readHostFile(const char * filename) return 0; } -int distrib::connect() +int distrib::connect(const std::vector & client_options) { int err = 0; for (int i = 0, sz = m_hosts.size(); i < sz; i++) { - err += connect(m_hosts[i]); + err += connect(m_hosts[i], client_options); } return err; } -int distrib::connect(const string & host) +int distrib::connect(const string & host, + const std::vector & client_options) { int id = fork(); if (id < 0) /* check for fork() error */ @@ -55,10 +58,30 @@ int distrib::connect(const string & host) { char server_port_str[15]; sprintf(server_port_str, "%d", m_serverport); - execlp("ssh", "ssh", host.c_str(), - "fart", "--host", m_servername.c_str(), - "--port", server_port_str, - (char *) NULL); + vector args; + args.push_back("ssh"); + args.push_back(host); + args.push_back("fart"); + args.push_back("--host"); + args.push_back(m_servername); + args.push_back("--port"); + args.push_back(server_port_str); + for (int i = 0, sz = client_options.size(); i < sz; i++) + args.push_back(client_options[i]); + const char * char_star_args[args.size() + 1]; + for (int i = 0, sz = args.size(); i < sz; i++) + char_star_args[i] = args[i].c_str(); + char_star_args[args.size()] = (char *) NULL; + +#if 0 + /* debug */ + cout << "executing: 'ssh', "; + for (int i = 0, sz = args.size(); i < sz; i++) + cout << "'" << char_star_args[i] << "', "; + cout << endl; +#endif + + execvp("ssh", (char * const *) char_star_args); /* we should not get here */ cerr << "Error " << errno << " with execlp()!" << endl; @@ -68,10 +91,8 @@ int distrib::connect(const string & host) return 0; } -int distrib::startServer() +int distrib::startServer(const std::vector & client_options) { - connect(); - char hostname[1000]; gethostname(&hostname[0], 1000); m_servername = hostname; @@ -109,6 +130,8 @@ int distrib::startServer() << m_serverport << endl; + connect(client_options); + return 0; } diff --git a/distrib/distrib.h b/distrib/distrib.h index e16a49c..df56465 100644 --- a/distrib/distrib.h +++ b/distrib/distrib.h @@ -9,12 +9,13 @@ class distrib { public: int readHostFile(const char * filename); - int startServer(); + int startServer(const std::vector & client_options); int startClient(const char * server, int port); protected: - int connect(); - int connect(const std::string & host); + int connect(const std::vector & client_options); + int connect(const std::string & host, + const std::vector & client_options); std::vector m_hosts; std::vector m_children; diff --git a/main/Scene.cc b/main/Scene.cc index 8632d5c..4f8abea 100644 --- a/main/Scene.cc +++ b/main/Scene.cc @@ -41,52 +41,68 @@ Scene::Scene(const map & options, if (it->first == "width") { m_width = atoi(it->second); + m_client_options.push_back("--width"); + m_client_options.push_back(it->second); } else if (it->first == "height") { m_height = atoi(it->second); + m_client_options.push_back("--height"); + m_client_options.push_back(it->second); } else if (it->first == "multisample") { m_multisample_level = atoi(it->second); + m_client_options.push_back("--multisample"); + m_client_options.push_back(it->second); } else if (it->first == "field-of-view") { m_vfov = atof(it->second); + m_client_options.push_back("--field-of-view"); + m_client_options.push_back(it->second); } else if (it->first == "output-file") { m_output_file_name = it->second; + /* no client option necessary */ } else if (it->first == "max-depth") { m_max_depth = atoi(it->second); + m_client_options.push_back("--max-depth"); + m_client_options.push_back(it->second); } else if (it->first == "verbose") { m_verbose = true; + /* no client option necessary */ } else if (it->first == "host") { m_server_name = it->second; m_server = false; + /* no client option necessary */ } else if (it->first == "port") { m_server_port = atoi(it->second); + /* no client option necessary */ } else if (it->first == "hosts") { m_hosts_file = it->second; + /* no client option necessary */ } } + m_client_options.push_back(filename); /* start the distribution infrastructure */ if (m_server) { if (m_hosts_file != "") m_distrib.readHostFile(m_hosts_file.c_str()); - m_distrib.startServer(); + m_distrib.startServer(m_client_options); } else { @@ -108,7 +124,7 @@ Scene::~Scene() void Scene::render() { - if (m_verbose) + if (m_verbose && m_server) { cout << " *** Beginning scene render ***" << endl; cout << "Parameters:" << endl; @@ -130,7 +146,7 @@ void Scene::render() } } - if (m_verbose) + if (m_verbose && m_server) { cout << " *** Ending scene render ***" << endl; cout << "Writing output file '" << m_output_file_name << '\'' << endl; diff --git a/main/Scene.h b/main/Scene.h index 38af097..a7697f7 100644 --- a/main/Scene.h +++ b/main/Scene.h @@ -95,6 +95,7 @@ class Scene std::string m_hosts_file; int m_server_port; distrib m_distrib; + std::vector m_client_options; /* framebuffer */ unsigned char * m_data; diff --git a/main/fart.cc b/main/fart.cc index dbcafb9..3966cf2 100644 --- a/main/fart.cc +++ b/main/fart.cc @@ -30,6 +30,7 @@ int main(int argc, char * argv[]) int opt; int option_index; map scene_options; + bool server = true; static const struct option long_options[] = { { "output-file", required_argument, NULL, 'o' }, @@ -77,6 +78,7 @@ int main(int argc, char * argv[]) break; case 257: scene_options["host"] = optarg; + server = false; break; case 258: scene_options["port"] = optarg; @@ -104,29 +106,32 @@ int main(int argc, char * argv[]) gettimeofday(&after, NULL); /* stop timing */ - double time_before = before.tv_sec + before.tv_usec / 1000000.0; - double time_after = after.tv_sec + after.tv_usec / 1000000.0; - double total_seconds = time_after - time_before; - cout << "Elapsed time: " << total_seconds << " seconds"; - - double seconds = total_seconds; - int days = (int) (seconds / (60.0 * 60.0 * 24.0)); - seconds -= days * 60.0 * 60.0 * 24.0; - int hours = (int) (seconds / (60.0 * 60.0)); - seconds -= hours * 60.0 * 60.0; - int minutes = (int) (seconds / 60.0); - seconds -= minutes * 60.0; - if (days || hours || minutes) + if (server) { - cout << " ("; - if (days) - cout << days << " days, "; - if (days || hours) - cout << hours << " hours, "; - cout << minutes << " minutes, "; - cout << seconds << " seconds)"; + double time_before = before.tv_sec + before.tv_usec / 1000000.0; + double time_after = after.tv_sec + after.tv_usec / 1000000.0; + double total_seconds = time_after - time_before; + cout << "Elapsed time: " << total_seconds << " seconds"; + + double seconds = total_seconds; + int days = (int) (seconds / (60.0 * 60.0 * 24.0)); + seconds -= days * 60.0 * 60.0 * 24.0; + int hours = (int) (seconds / (60.0 * 60.0)); + seconds -= hours * 60.0 * 60.0; + int minutes = (int) (seconds / 60.0); + seconds -= minutes * 60.0; + if (days || hours || minutes) + { + cout << " ("; + if (days) + cout << days << " days, "; + if (days || hours) + cout << hours << " hours, "; + cout << minutes << " minutes, "; + cout << seconds << " seconds)"; + } + cout << endl; } - cout << endl; return 0; }