]> git.zerfleddert.de Git - record-dvb/blobdiff - sap.c
use recvd instead of BUFFSIZE, so we only process really received
[record-dvb] / sap.c
diff --git a/sap.c b/sap.c
index 8dfa6944eb0e4aefad2383de7db3cd3bcf58ff21..232c0c3f80ea00a2d1ae239b4558c9776b2845f4 100644 (file)
--- a/sap.c
+++ b/sap.c
@@ -8,6 +8,8 @@
 #include <time.h>
 #include <string.h>
 #include <strings.h>
+#include <unistd.h>
+#include <sys/select.h>
 
 #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=<network type> <address type> <connection address> */
-                                                       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=<media> <port> <transport> <fmt list> */
-                                                       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;
 }
Impressum, Datenschutz