X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/record-dvb/blobdiff_plain/8447845ff6a909797551483cab14a24e5bcf7888..647c7747f9b9c0776fd4e12ef55d11e24b3495cb:/sap.c diff --git a/sap.c b/sap.c index 8dfa694..232c0c3 100644 --- a/sap.c +++ b/sap.c @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include "mcast.h" #include "sap.h" @@ -41,6 +43,25 @@ char *get_url_from_sap(char *service) unsigned char auth_len; unsigned short msgid; unsigned char *payload, *pos, *host = NULL, *proto = NULL, *port = NULL, *sname = NULL; + fd_set rfds; + struct timeval tv; + int retval; + + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + + tv.tv_sec = 0; + tv.tv_usec = 100000; + + if ((retval = select(fd+1, &rfds, NULL, NULL, &tv)) == -1) { + perror("select"); + return NULL; + } + + if (!retval) { + gettimeofday(&curr, NULL); + continue; + } if ((recvd = recv(fd, buffer, BUFFSIZE, 0)) < 1) { perror("recv"); @@ -81,6 +102,7 @@ char *get_url_from_sap(char *service) if (sap_encrypted || sap_compressed) continue; + /* RFC 2327 * v=0 * o=- 6dca 1 IN IP4 192.168.100.17:2000 @@ -93,10 +115,9 @@ char *get_url_from_sap(char *service) */ pos = payload; - while(*pos != 0 && (pos-buffer) < BUFFSIZE) { - if (*pos == 0x0d) { + while(*pos != 0 && (pos-buffer) < recvd) { + if (*pos == 0x0d) *pos = 0; - } if (*pos == 0x0a) { *pos = 0; @@ -118,13 +139,11 @@ char *get_url_from_sap(char *service) poscnt++; /* c=
*/ - if (poscnt == 2) { + if (poscnt == 2) host = payload + 1; - } - if (poscnt > 2) { + if (poscnt > 2) break; - } } payload++; } @@ -138,17 +157,14 @@ char *get_url_from_sap(char *service) poscnt++; /* m= */ - if (poscnt == 1) { + if (poscnt == 1) port = payload + 1; - } - if (poscnt == 2) { + if (poscnt == 2) proto = payload + 1; - } - if (poscnt > 2) { + if (poscnt > 2) break; - } } payload++; } @@ -196,5 +212,7 @@ char *get_url_from_sap(char *service) mreq.imr_interface.s_addr = INADDR_ANY; setsockopt (fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); + close(fd); + return url; }