]> git.zerfleddert.de Git - record-dvb/commitdiff
enforce timeouts
authormichael <michael>
Sun, 2 Jul 2006 00:50:31 +0000 (00:50 +0000)
committermichael <michael>
Sun, 2 Jul 2006 00:50:31 +0000 (00:50 +0000)
record-dvb.c
sap.c

index d87d3e789ce362110c7161030ad1918e10398b12..9356348343fe4f81d20cc0cf580f8c63b95fd1f2 100644 (file)
@@ -6,6 +6,7 @@
 #include <sys/socket.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/select.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <strings.h>
@@ -25,6 +26,9 @@ void record(int(*open_fn)(char *), char *url, char *outfile, int duration)
        int error_sleep = 0;
        char buffer[CHUNKSIZE];
        int in, out;
+       fd_set rfds;
+       struct timeval tv;
+       int retval;
 
        if ((in = (*open_fn)(url)) < 0) {
                fprintf(stderr,"Can't open url %s!\n",url);
@@ -60,6 +64,22 @@ void record(int(*open_fn)(char *), char *url, char *outfile, int duration)
                        }
                }
 
+               FD_ZERO(&rfds);
+               FD_SET(in, &rfds);
+
+               tv.tv_sec = 1;
+               tv.tv_usec = 0;
+
+               if ((retval = select(in + 1, &rfds, NULL, NULL, &tv)) == -1) {
+                       error_sleep = 1;
+                       continue;
+               }
+
+               if (!retval) {
+                       gettimeofday(&curr, NULL);
+                       continue;
+               }
+
                if ((recvd = recv(in, buffer, CHUNKSIZE, 0)) < 1) {
                        error_sleep = 1;
                        continue;
diff --git a/sap.c b/sap.c
index 684c509bf25c81c27365b78bd01b7dcda25d95e0..49dfcc8d8f2d9f0c2d7074f129579410887d58d4 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 = 1000;
+
+               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");
Impressum, Datenschutz