From: michael Date: Sun, 2 Jul 2006 11:45:25 +0000 (+0000) Subject: handle IPv6 sources X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/record-dvb/commitdiff_plain/1e3fa14af893f0e51d2a30b8b2e9d37669dc6257 handle IPv6 sources --- diff --git a/sap.c b/sap.c index d8b0284..85ec2c3 100644 --- a/sap.c +++ b/sap.c @@ -118,6 +118,7 @@ char *get_url_from_sap(char *service) struct timeval start, curr; struct ip_mreq mreq; unsigned char buffer[BUFFSIZE]; + struct in_addr sapinaddr; char *url = NULL; int fd; @@ -133,7 +134,7 @@ char *get_url_from_sap(char *service) struct timeval tv; int retval; int sap_version, sap_addrtype, sap_messagetype, sap_encrypted, sap_compressed; - in_addr_t sender_address; + uint8_t sender_address[16]; /* This might be IPv6! */ unsigned char auth_len; unsigned short msgid; unsigned char *sdp; @@ -147,7 +148,7 @@ char *get_url_from_sap(char *service) if ((retval = select(fd+1, &rfds, NULL, NULL, &tv)) == -1) { perror("select"); - return NULL; + break; } if (!retval) { @@ -158,7 +159,7 @@ char *get_url_from_sap(char *service) bzero(buffer, BUFFSIZE); if ((recvd = recv(fd, buffer, BUFFSIZE, 0)) < 1) { perror("recv"); - return NULL; + break; } gettimeofday(&curr, NULL); @@ -170,7 +171,7 @@ char *get_url_from_sap(char *service) sap_compressed = buffer[0] & 0x1; auth_len = buffer[1]; msgid = buffer[2] << 8 | buffer[3]; - memcpy(&sender_address, buffer+4, (sap_addrtype?16:4)); + memcpy(sender_address, buffer+4, (sap_addrtype?16:4)); sdp = buffer + 4 /* (sap_*, auth_len, msgid) */ + (sap_addrtype?16:4) + auth_len; #ifdef DEBUG @@ -181,13 +182,10 @@ char *get_url_from_sap(char *service) printf("Encrypted: %d\n", sap_encrypted); printf("Compressed: %d\n", sap_compressed); printf("Authentication Length: %d\n", auth_len); - printf("Sender: %u\n", sender_address); + printf("Sender: %u\n", *((in_addr_t*)sender_address)); printf("Message Identifier Hash: %u\n", msgid); #endif - if (sap_addrtype) - continue; /* We don't support IPv6 for now */ - #if 0 /* Getstream gets this wrong, see rfc2974 */ if (sap_messagetype) continue; /* We are not interested in deletions */ @@ -199,11 +197,27 @@ char *get_url_from_sap(char *service) sdpinfo = parse_sdp(sdp, recvd-(sdp-buffer)); if (sdpinfo->service && sdpinfo->proto && sdpinfo->port) { + char hostbuf[INET6_ADDRSTRLEN]; + if (!sdpinfo->host) { - struct in_addr inaddr; - inaddr.s_addr = sender_address; - sdpinfo->host = inet_ntoa(inaddr); + if (sap_addrtype) { + struct in6_addr in6addr; + + memcpy(in6addr.in6_u.u6_addr8, sender_address, 16); + if (!(sdpinfo->host = (char*)inet_ntop(AF_INET6, &in6addr, hostbuf, INET6_ADDRSTRLEN))) { + perror("inet_ntop"); + continue; + } + } else { + struct in_addr inaddr; + + inaddr.s_addr = *((in_addr_t*)sender_address); + if (!(sdpinfo->host = (char*)inet_ntop(AF_INET, &inaddr, hostbuf, INET6_ADDRSTRLEN))) { + perror("inet_ntop"); + continue; + } + } } #ifdef DEBUG @@ -219,7 +233,7 @@ char *get_url_from_sap(char *service) if (!(url = malloc(len))) { perror("malloc"); - return NULL; + break; } snprintf(url, len, "%s://%s:%s", sdpinfo->proto, sdpinfo->host, sdpinfo->port); @@ -230,7 +244,11 @@ char *get_url_from_sap(char *service) } while(curr.tv_sec < start.tv_sec+SAP_TIMEOUT); - mreq.imr_multiaddr.s_addr = inet_addr(SAP_ADDR); + if (!(inet_aton(SAP_ADDR, &sapinaddr))) { + perror("inet_aton"); + } + + mreq.imr_multiaddr.s_addr = sapinaddr.s_addr; mreq.imr_interface.s_addr = INADDR_ANY; setsockopt (fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));