//examine /proc/self/fd for unknown connections
void dmtcp::FileConnList::scanForPreExisting()
{
  // FIXME: Detect stdin/out/err fds to detect duplicates.
  dmtcp::vector<int> fds = jalib::Filesystem::ListOpenFds();
  dmtcp::string ctty = jalib::Filesystem::GetControllingTerm();
  dmtcp::string parentCtty = jalib::Filesystem::GetControllingTerm(getppid());
  for (size_t i = 0; i < fds.size(); ++i) {
    int fd = fds[i];
    if (!Util::isValidFd(fd)) continue;
    if (dmtcp_is_protected_fd(fd)) continue;
    struct stat statbuf;
    JASSERT(fstat(fd, &statbuf) == 0);
    bool isRegularFile = (S_ISREG(statbuf.st_mode) || S_ISCHR(statbuf.st_mode) ||
                          S_ISDIR(statbuf.st_mode) || S_ISBLK(statbuf.st_mode));

    dmtcp::string device = _resolveSymlink(_procFDPath(fd));

    JTRACE("scanning pre-existing device") (fd) (device);
    if (device == ctty || device == parentCtty) {
      // Search if this is duplicate connection
      iterator conit;
      int cttyType = (device == ctty) ? PtyConnection::PTY_CTTY
                                      : PtyConnection::PTY_PARENT_CTTY;
      for (conit = begin(); conit != end(); conit++) {
        Connection *c = conit->second;
        if (c->subType() == cttyType &&
            ((PtyConnection*)c)->ptsName() == device) {
          processDup(c->getFds()[0], fd);
          break;
        }
      }
      if (conit == end()) {
        // FIXME: Merge this code with the code in processFileConnection
        PtyConnection *con = new PtyConnection(fd, (const char*) device.c_str(),
                                               -1, -1, cttyType);
        // Check comments in FileConnList::postRestart() for the explanation
        // about isPreExistingCTTY.
        con->markPreExistingCTTY();
        add(fd, (Connection*)con);
      }
    } else if(dmtcp_is_bq_file && dmtcp_is_bq_file(device.c_str())) {
      if (isRegularFile) {
        Connection *c = findDuplication(fd, device.c_str());
        if (c != NULL) {
          c->addFd(fd);
          continue;
        }
      }
      processFileConnection(fd, device.c_str(), -1, -1);
    } else if( fd <= 2 ){
      add(fd, new StdioConnection(fd));
    } else if (Util::strStartsWith(device, "/")) {
      if (isRegularFile) {
        Connection *c = findDuplication(fd, device.c_str());
        if (c != NULL) {
          c->addFd(fd);
          continue;
        }
      }
      processFileConnection(fd, device.c_str(), -1, -1);
    }
  }
}