diff --git a/device.c b/device.c index 8647b9c..edc92e5 100644 --- a/device.c +++ b/device.c @@ -46,12 +46,13 @@ cIptvDevice::cIptvDevice(unsigned int indexP) // Check if dvr fifo exists struct stat sb; cString filename = cString::sprintf(IPTV_DVR_FILENAME, deviceIndexM); - stat(filename, &sb); - if (S_ISFIFO(sb.st_mode)) { - dvrFdM = open(filename, O_RDWR | O_NONBLOCK); - if (dvrFdM >= 0) - info("IPTV device %d redirecting input stream to '%s'", deviceIndexM, *filename); + if(stat(filename, &sb) == 0) { + if (S_ISFIFO(sb.st_mode)) { + dvrFdM = open(filename, O_RDWR | O_NONBLOCK); + if (dvrFdM >= 0) + info("IPTV device %d redirecting input stream to '%s'", deviceIndexM, *filename); } + } } cIptvDevice::~cIptvDevice() diff --git a/iptv.c b/iptv.c index 8bb99ae..35aa4b8 100644 --- a/iptv.c +++ b/iptv.c @@ -79,22 +79,22 @@ bool cPluginIptv::ProcessArgs(int argc, char *argv[]) debug1("%s", __PRETTY_FUNCTION__); // Implement command line argument processing here if applicable. static const struct option long_options[] = { - { "devices", required_argument, NULL, 'd' }, - { "trace", required_argument, NULL, 't' }, - { NULL, no_argument, NULL, 0 } + { "devices", required_argument, NULL, 'd' }, + { "trace", required_argument, NULL, 't' }, + { NULL, no_argument, NULL, 0 } }; int c; - while ((c = getopt_long(argc, argv, "d:", long_options, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "d:t:", long_options, NULL)) != -1) { switch (c) { case 'd': - deviceCountM = atoi(optarg); - break; + deviceCountM = atoi(optarg); + break; case 't': - IptvConfig.SetTraceMode(strtol(optarg, NULL, 0)); - break; + IptvConfig.SetTraceMode(atoi(optarg)); + break; default: - return false; + return false; } } return true; diff --git a/protocolcurl.c b/protocolcurl.c index d286218..6356e71 100644 --- a/protocolcurl.c +++ b/protocolcurl.c @@ -280,8 +280,10 @@ bool cIptvProtocolCurl::Connect() return true; // Initialize the curl session - if (!handleM) + if (!handleM) { handleM = curl_easy_init(); + connectedM = true; + } if (handleM && !isempty(*streamUrlM)) { CURLcode res = CURLE_OK; @@ -428,7 +430,6 @@ bool cIptvProtocolCurl::Connect() } timeoutM.Set(eKeepAliveIntervalMs); - connectedM = true; return true; } diff --git a/socket.c b/socket.c index 0e1e8ae..23e7253 100644 --- a/socket.c +++ b/socket.c @@ -73,8 +73,14 @@ bool cIptvSocket::OpenSocket(const int portP, const bool isUdpP) sockAddrM.sin_port = htons((uint16_t)(portP & 0xFFFF)); sockAddrM.sin_addr.s_addr = htonl(INADDR_ANY); if (isUdpP) - ERROR_IF_FUNC(bind(socketDescM, (struct sockaddr *)&sockAddrM, sizeof(sockAddrM)) < 0, + { + int rcvbuf = 4 * 1024 * 1024; + + ERROR_IF_FUNC(bind(socketDescM, (struct sockaddr *)&sockAddrM, sizeof(sockAddrM)) < 0, "bind()", CloseSocket(), return false); + + ERROR_IF_RET(setsockopt(socketDescM, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(int)) < 0, "setsockopt(SO_RCVBUF)", return false); + } // Update socket port socketPortM = portP; } @@ -184,11 +190,13 @@ bool cIptvUdpSocket::JoinMulticast(void) ERROR_IF_RET(setsockopt(socketDescM, SOL_IP, MCAST_JOIN_SOURCE_GROUP, &gsr, sizeof(gsr)) < 0, "setsockopt(MCAST_JOIN_SOURCE_GROUP)", return false); } else { - struct ip_mreq mreq; - mreq.imr_multiaddr.s_addr = streamAddrM; - mreq.imr_interface.s_addr = htonl(INADDR_ANY); - ERROR_IF_RET(setsockopt(socketDescM, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0, "setsockopt(IP_ADD_MEMBERSHIP)", return false); - } + if (IN_MULTICAST(ntohl(streamAddrM))) { + struct ip_mreq mreq; + mreq.imr_multiaddr.s_addr = streamAddrM; + mreq.imr_interface.s_addr = htonl(INADDR_ANY); + ERROR_IF_RET(setsockopt(socketDescM, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0, "setsockopt(IP_ADD_MEMBERSHIP)", return false); + } + } // Update multicasting flag isActiveM = true; } @@ -218,11 +226,13 @@ bool cIptvUdpSocket::DropMulticast(void) ERROR_IF_RET(setsockopt(socketDescM, SOL_IP, MCAST_LEAVE_SOURCE_GROUP, &gsr, sizeof(gsr)) < 0, "setsockopt(MCAST_LEAVE_SOURCE_GROUP)", return false); } else { - struct ip_mreq mreq; - mreq.imr_multiaddr.s_addr = streamAddrM; - mreq.imr_interface.s_addr = htonl(INADDR_ANY); - ERROR_IF_RET(setsockopt(socketDescM, SOL_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0, "setsockopt(IP_DROP_MEMBERSHIP)", return false); + if (IN_MULTICAST(ntohl(streamAddrM))) { + struct ip_mreq mreq; + mreq.imr_multiaddr.s_addr = streamAddrM; + mreq.imr_interface.s_addr = htonl(INADDR_ANY); + ERROR_IF_RET(setsockopt(socketDescM, SOL_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0, "setsockopt(IP_DROP_MEMBERSHIP)", return false); } + } // Update multicasting flag isActiveM = false; } diff --git a/statistics.c b/statistics.c index a1b37bd..ac77137 100644 --- a/statistics.c +++ b/statistics.c @@ -173,7 +173,6 @@ void cIptvStreamerStatistics::AddStreamerStatistic(long bytesP) // Buffer statistics class cIptvBufferStatistics::cIptvBufferStatistics() : dataBytesM(0), - freeSpaceM(0), usedSpaceM(0), timerM(), mutexM() diff --git a/statistics.h b/statistics.h index 7c4b4d4..14a2c3d 100644 --- a/statistics.h +++ b/statistics.h @@ -78,7 +78,6 @@ class cIptvBufferStatistics { private: long dataBytesM; - long freeSpaceM; long usedSpaceM; cTimeMs timerM; cMutex mutexM;