diff --git a/distrib/distrib.cc b/distrib/distrib.cc index 0193534..c25babb 100644 --- a/distrib/distrib.cc +++ b/distrib/distrib.cc @@ -2,6 +2,13 @@ #include "distrib.h" #include #include +#include +#include +#include +#include +#include +#include +#include using namespace std; int distrib::readHostFile(const char * filename) @@ -21,3 +28,80 @@ int distrib::readHostFile(const char * filename) ifs.close(); return 0; } + +int distrib::connect() +{ + int err = 0; + for (int i = 0, sz = m_hosts.size(); i < sz; i++) + { + err += connect(m_hosts[i]); + } + return err; +} + +int distrib::connect(const string & host) +{ + int id = fork(); + if (id < 0) /* check for fork() error */ + { + cerr << "Error forking: " << id << endl; + return 1; + } + else if (id > 0) /* in the parent */ + { + m_children.push_back(id); + } + else /* in the child */ + { + execlp("ssh", "ssh", host.c_str(), + "fart", "--host", m_servername.c_str(), + "--port", m_serverport, + NULL); + cerr << "Error " << errno << " with execlp()!" << endl; + exit(33); + } + + return 0; +} + +int distrib::startServer() +{ + char hostname[1000]; + gethostname(&hostname[0], 1000); + m_servername = hostname; + + m_listen_socket = socket(PF_INET, SOCK_STREAM, 0); + if ( m_listen_socket == -1 ) + { + cerr << "Error " << errno << " creating listen socket!" << endl; + return 1; + } + + if ( listen(m_listen_socket, 5) == -1 ) + { + cerr << "Error " << errno << " when trying to listen!" << endl; + return 2; + } + + struct sockaddr_in addr; + int addr_len = sizeof(struct sockaddr_in); + getsockname(m_listen_socket, + (struct sockaddr *) &addr, + (socklen_t *) &addr_len); + + int ip_addr = ntohl(addr.sin_addr.s_addr); + m_serverport = ntohs(addr.sin_port); + cout << "Listening on " + << (unsigned int) ((ip_addr >> 24) & 0xFF) + << '.' + << (unsigned int) ((ip_addr >> 16) & 0xFF) + << '.' + << (unsigned int) ((ip_addr >> 8) & 0xFF) + << '.' + << (unsigned int) (ip_addr & 0xFF) + << ':' + << m_serverport + << endl; + + return 0; +} diff --git a/distrib/distrib.h b/distrib/distrib.h index e019d55..9c7d03d 100644 --- a/distrib/distrib.h +++ b/distrib/distrib.h @@ -9,9 +9,16 @@ class distrib { public: int readHostFile(const char * filename); + int connect(); + int startServer(); protected: + int connect(const std::string & host); std::vector m_hosts; + std::vector m_children; + std::string m_servername; + int m_serverport; + int m_listen_socket; }; #endif