summaryrefslogtreecommitdiff
path: root/server/componentIGMP.c
diff options
context:
space:
mode:
authorFrank Schmirler <vdr@schmirler.de>2011-11-25 00:24:37 +0100
committerFrank Schmirler <vdr@schmirler.de>2011-11-25 00:24:37 +0100
commit9b91301d943cfbec5208419704cfece84267223d (patch)
treef1fa7c428490eb8ee03cfa26297559c62f4d81c7 /server/componentIGMP.c
parent7347e24123ec0b852091ec035cabce0e10278a72 (diff)
downloadvdr-plugin-streamdev-9b91301d943cfbec5208419704cfece84267223d.tar.gz
vdr-plugin-streamdev-9b91301d943cfbec5208419704cfece84267223d.tar.bz2
Don't keep a pointer to the connection in components MulticastGroup
structure as the connection may now be deleted from outside via menu.
Diffstat (limited to 'server/componentIGMP.c')
-rw-r--r--server/componentIGMP.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/server/componentIGMP.c b/server/componentIGMP.c
index 223aa3c..7398c67 100644
--- a/server/componentIGMP.c
+++ b/server/componentIGMP.c
@@ -6,6 +6,7 @@
#include "server/componentIGMP.h"
#include "server/connectionIGMP.h"
+#include "server/server.h"
#include "server/setup.h"
#ifndef IGMP_ALL_HOSTS
@@ -37,7 +38,6 @@
class cMulticastGroup: public cListObject
{
public:
- cConnectionIGMP *connection;
in_addr_t group;
in_addr_t reporter;
struct timeval timeout;
@@ -48,7 +48,6 @@ public:
};
cMulticastGroup::cMulticastGroup(in_addr_t Group) :
- connection(NULL),
group(Group),
reporter(0)
{
@@ -235,10 +234,7 @@ cServerConnection* cComponentIGMP::ProcessMessage(struct igmp *Igmp, in_addr_t G
group = new cMulticastGroup(Group);
m_Groups.Add(group);
}
- if (!group->connection) {
- IGMPStartMulticast(group);
- conn = group->connection;
- }
+ conn = IGMPStartMulticast(group);
IGMPStartTimer(group, Sender);
if (Igmp->igmp_type == IGMP_V1_MEMBERSHIP_REPORT)
IGMPStartV1HostTimer(group);
@@ -430,20 +426,36 @@ void cComponentIGMP::IGMPSendGroupQuery(cMulticastGroup* Group)
IGMPSendQuery(Group->group, IGMP_LAST_MEMBER_QUERY_INTERVAL_TS);
}
-void cComponentIGMP::IGMPStartMulticast(cMulticastGroup* Group)
+cServerConnection* cComponentIGMP::IGMPStartMulticast(cMulticastGroup* Group)
{
+ cServerConnection *conn = NULL;
in_addr_t g = ntohl(Group->group);
if (g > MULTICAST_PRIV_MIN && g <= MULTICAST_PRIV_MAX) {
+ cThreadLock lock;
cChannel *channel = Channels.GetByNumber(g - MULTICAST_PRIV_MIN);
- Group->connection = (cConnectionIGMP*) NewClient();
- if (!Group->connection->SetChannel(channel, Group->group)) {
- DELETENULL(Group->connection);
+ const cList<cServerConnection>& clients = cStreamdevServer::Clients(lock);
+ cServerConnection *s = clients.First();
+ while (s) {
+ if (s->RemoteIpAddr() == Group->group)
+ break;
+ s = clients.Next(s);
+ }
+ if (!s) {
+ conn = NewClient();
+ if (!((cConnectionIGMP *)conn)->SetChannel(channel, Group->group)) {
+ DELETENULL(conn);
+ }
}
}
+ return conn;
}
void cComponentIGMP::IGMPStopMulticast(cMulticastGroup* Group)
{
- if (Group->connection)
- Group->connection->Stop();
+ cThreadLock lock;
+ const cList<cServerConnection>& clients = cStreamdevServer::Clients(lock);
+ for (cServerConnection *s = clients.First(); s; s = clients.Next(s)) {
+ if (s->RemoteIpAddr() == Group->group)
+ s->Close();
+ }
}