#include "distrib.h" #include #include #include #include #include #include #include #include #include using namespace std; int distrib::readHostFile(const char * filename) { ifstream ifs(filename); if ( ! ifs.is_open() ) return 1; string host; while ( ! ifs.eof() ) { ifs >> host; m_hosts.push_back(host); } 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 */ { 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); /* we should not get here */ cerr << "Error " << errno << " with execlp()!" << endl; exit(33); } return 0; } int distrib::startServer() { connect(); 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; } int distrib::startClient(const char * server, int port) { return 0; }