Exemple #1
0
void RestoreTarget::dupAllSockets (SlidingFdTable& slidingFd)
{
  int lastfd = -1;
  dmtcp::vector<int> fdlist;

  ConnectionToFds::const_iterator i;
  for (i = _conToFd.begin(); i!=_conToFd.end(); ++i) {
    Connection& con = ConnectionList::instance() [i->first];
    if (con.conType() == Connection::INVALID) {
      JWARNING(false)(i->first).Text("Can't restore invalid Connection");
      continue;
    }

    const dmtcp::vector<int>& fds = i->second;
    for (size_t x=0; x<fds.size(); ++x) {
      int fd = fds[x];
      fdlist.push_back (fd);
      slidingFd.freeUpFd (fd);
      int oldFd = slidingFd.getFdFor (i->first);
      JTRACE ("restoring fd") (i->first) (oldFd) (fd);
      //let connection do custom dup2 handling
      con.restartDup2(oldFd, fd);

      if (fd > lastfd) {
        lastfd = fd;
      }
    }
  }

  size_t j;
  for (int i = 0 ; i < slidingFd.startFd() ; i++) {
    for (j = 0 ; j < fdlist.size() ; j++) {
      if (fdlist.at (j) == i) {
        break;
      }
    }
    if (j == fdlist.size()) {
      close ( i );
    }
  }

  slidingFd.closeAll();
}