MythSocket *MythCoreContext::ConnectEventSocket(const QString &hostname, int port) { MythSocket *eventSock = new MythSocket(); while (eventSock->state() != MythSocket::Idle) { usleep(5000); } // Assume that since we _just_ connected the command socket, // this one won't need multiple retries to work... if (!eventSock->connect(hostname, port)) { LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to connect event " "socket to master backend"); eventSock->DecrRef(); return NULL; } eventSock->Lock(); QString str = QString("ANN Monitor %1 %2") .arg(d->m_localHostname).arg(true); QStringList strlist(str); eventSock->writeStringList(strlist); bool ok = true; if (!eventSock->readStringList(strlist) || strlist.empty() || (strlist[0] == "ERROR")) { if (!strlist.empty()) { LOG(VB_GENERAL, LOG_ERR, LOC + "Problem connecting event socket to master backend"); } else { LOG(VB_GENERAL, LOG_ERR, LOC + "Timeout connecting event socket to master backend"); } ok = false; } eventSock->Unlock(); if (ok) { eventSock->setCallbacks(this); } else { eventSock->DecrRef(); eventSock = NULL; } return eventSock; }
int connect_to_master(void) { MythSocket *tempMonitorConnection = new MythSocket(); if (tempMonitorConnection->connect( gCoreContext->GetSetting("MasterServerIP", "127.0.0.1"), gCoreContext->GetNumSetting("MasterServerPort", 6543))) { if (!gCoreContext->CheckProtoVersion(tempMonitorConnection)) { VERBOSE(VB_IMPORTANT, "Master backend is incompatible with " "this backend.\nCannot become a slave."); return GENERIC_EXIT_CONNECT_ERROR; } QStringList tempMonitorDone("DONE"); QStringList tempMonitorAnnounce("ANN Monitor tzcheck 0"); tempMonitorConnection->writeStringList(tempMonitorAnnounce); tempMonitorConnection->readStringList(tempMonitorAnnounce); if (tempMonitorAnnounce.empty() || tempMonitorAnnounce[0] == "ERROR") { tempMonitorConnection->DownRef(); tempMonitorConnection = NULL; if (tempMonitorAnnounce.empty()) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to open event socket, timeout"); } else { VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to open event socket" + ((tempMonitorAnnounce.size() >= 2) ? QString(", error was %1").arg(tempMonitorAnnounce[1]) : QString(", remote error"))); } } QStringList tzCheck("QUERY_TIME_ZONE"); if (tempMonitorConnection) { tempMonitorConnection->writeStringList(tzCheck); tempMonitorConnection->readStringList(tzCheck); } if (tzCheck.size() && !checkTimeZone(tzCheck)) { // Check for different time zones, different offsets, different // times VERBOSE(VB_IMPORTANT, "The time and/or time zone settings on " "this system do not match those in use on the master " "backend. Please ensure all frontend and backend " "systems are configured to use the same time zone and " "have the current time properly set."); VERBOSE(VB_IMPORTANT, "Unable to run with invalid time settings. Exiting."); tempMonitorConnection->writeStringList(tempMonitorDone); tempMonitorConnection->DownRef(); return GENERIC_EXIT_INVALID_TIMEZONE; } else { VERBOSE(VB_IMPORTANT, QString("Backend is running in %1 time zone.") .arg(getTimeZoneID())); } if (tempMonitorConnection) tempMonitorConnection->writeStringList(tempMonitorDone); } if (tempMonitorConnection) tempMonitorConnection->DownRef(); return GENERIC_EXIT_OK; }
MythSocket *RemoteFile::openSocket(bool control) { QUrl qurl(path); QString dir; QString host = qurl.host(); int port = qurl.port(); dir = qurl.path(); if (qurl.hasQuery()) dir += "?" + QUrl::fromPercentEncoding(qurl.encodedQuery()); if (qurl.hasFragment()) dir += "#" + qurl.fragment(); QString sgroup = qurl.userName(); MythSocket *lsock = new MythSocket(); QString stype = (control) ? "control socket" : "file data socket"; QString loc_err = QString("RemoteFile::openSocket(%1), Error: ").arg(stype); if (port <= 0) { port = GetMythDB()->GetSettingOnHost("BackendServerPort", host).toInt(); // if we still have no port use the default if (port <= 0) port = 6543; } if (!lsock->connect(host, port)) { LOG(VB_GENERAL, LOG_ERR, QString("Could not connect to server %1:%2") .arg(host).arg(port)); lsock->DownRef(); return NULL; } QString hostname = GetMythDB()->GetHostName(); QStringList strlist; if (control) { strlist.append(QString("ANN Playback %1 %2").arg(hostname).arg(false)); lsock->writeStringList(strlist); if (!lsock->readStringList(strlist, true)) { LOG(VB_GENERAL, LOG_ERR, QString("\n\t\t\tCould not read string list from server " "%1:%2").arg(host).arg(port)); lsock->DownRef(); return NULL; } } else { strlist.push_back(QString("ANN FileTransfer %1 %2 %3 %4") .arg(hostname).arg(writemode) .arg(usereadahead).arg(timeout_ms)); strlist << QString("%1").arg(dir); strlist << sgroup; QStringList::const_iterator it = possibleauxfiles.begin(); for (; it != possibleauxfiles.end(); ++it) strlist << *it; if (!lsock->writeStringList(strlist) || !lsock->readStringList(strlist, true)) { LOG(VB_GENERAL, LOG_ERR, QString("Did not get proper response from %1:%2") .arg(host).arg(port)); strlist.clear(); strlist.push_back("ERROR"); strlist.push_back("invalid response"); } if (strlist.size() >= 3) { it = strlist.begin(); ++it; recordernum = (*it).toInt(); ++it; filesize = (*(it)).toLongLong(); ++it; for (; it != strlist.end(); ++it) auxfiles << *it; } else if (0 < strlist.size() && strlist.size() < 3 && strlist[0] != "ERROR") { LOG(VB_GENERAL, LOG_ERR, QString("Did not get proper response from %1:%2") .arg(host).arg(port)); strlist.clear(); strlist.push_back("ERROR"); strlist.push_back("invalid response"); } } if (strlist.empty() || strlist[0] == "ERROR") { lsock->DownRef(); lsock = NULL; if (strlist.empty()) { LOG(VB_GENERAL, LOG_ERR, "Failed to open socket, timeout"); } else { LOG(VB_GENERAL, LOG_ERR, "Failed to open socket" + ((strlist.size() >= 2) ? QString(", error was %1").arg(strlist[1]) : QString(", remote error"))); } } return lsock; }