X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/record-dvb/blobdiff_plain/5c2e3e4489486a30d8f14338277de093b4d94cf0..fbc24ab023eb1ae6572fccff3fa1140c3e01c8b7:/mcast.c diff --git a/mcast.c b/mcast.c index a8be22f..5f7dadc 100644 --- a/mcast.c +++ b/mcast.c @@ -2,6 +2,11 @@ #include #include #include +#include +#include +#include + +#include "common.h" #include "mcast.h" int is_mcast(char *url) @@ -17,7 +22,41 @@ int is_mcast(char *url) int open_mcast(char *url) { - fprintf(stderr,"multicast currently unimplemented!\n"); + static struct dvb_host *dvbhost = NULL; + struct sockaddr_in server; + struct ip_mreq mreq; + int fd; + + if(!is_mcast(url)) + return -1; + + if (!dvbhost) { + dvbhost = parse(&(url[6]), "2000"); + dvbhost->socktype = SOCK_DGRAM; + } + + if (resolve(dvbhost, &server) < 0) { + return -1; + } + + bzero(&mreq, sizeof(mreq)); + mreq.imr_multiaddr = server.sin_addr; + mreq.imr_interface.s_addr = htonl(INADDR_ANY); + + if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { + perror("socket"); + return -1; + } + + if (bind(fd, (struct sockaddr*)&server, sizeof(server)) < 0) { + perror("bind"); + return -1; + } + + if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { + perror("setsockopt"); + return -1; + } - exit(EXIT_FAILURE); + return fd; }