]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
iptv: don't pass fatal error when limiting is active, fixes #4009
authorJaroslav Kysela <perex@perex.cz>
Tue, 4 Oct 2016 09:39:28 +0000 (11:39 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 4 Oct 2016 09:39:28 +0000 (11:39 +0200)
src/input/mpegts/iptv/iptv.c
src/input/mpegts/mpegts_service.c
src/service.c

index d59f09aa0b24af5500278bd505aad11224878b44..ff361882c28fc4eaf0b2edc6f39fff9bbc030617 100644 (file)
@@ -194,7 +194,7 @@ iptv_input_is_enabled
   ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags, int weight )
 {
   if (!mpegts_input_is_enabled(mi, mm, flags, weight)) return 0;
-  return iptv_input_is_free(mi, mm, 0, weight, NULL) == NULL;
+  return iptv_input_is_free(mi, mm, 0, weight, NULL) == NULL ? 1 : -1;
 }
 
 static int
index d03198e52f75794ade62760739c6537c8e7b7fe1..7bc7e5b75a029c44b9c7a3d644a3fa2ba9a2c16c 100644 (file)
@@ -288,7 +288,7 @@ mpegts_service_enlist_raw
   ( service_t *t, tvh_input_t *ti, struct service_instance_list *sil,
     int flags, int weight )
 {
-  int p = 0, w;
+  int p, w, r, added = 0, errcnt = 0;
   mpegts_service_t      *s = (mpegts_service_t*)t;
   mpegts_input_t        *mi;
   mpegts_mux_t          *m = s->s_dvb_mux;
@@ -309,7 +309,14 @@ mpegts_service_enlist_raw
     if (ti && (tvh_input_t *)mi != ti)
       continue;
 
-    if (!mi->mi_is_enabled(mi, mmi->mmi_mux, flags, weight)) continue;
+    r = mi->mi_is_enabled(mi, mmi->mmi_mux, flags, weight);
+    if (!r)
+      continue;
+    if (r < 0) {
+      /* temporary error - retry later */
+      errcnt++;
+      continue;
+    }
 
     /* Set weight to -1 (forced) for already active mux */
     if (mmi->mmi_mux->mm_active == mmi) {
@@ -324,9 +331,10 @@ mpegts_service_enlist_raw
     }
 
     service_instance_add(sil, t, mi->mi_instance, mi->mi_name, p, w);
+    added++;
   }
 
-  return 0;
+  return added ? 0 : (errcnt ? SM_CODE_NO_FREE_ADAPTER : 0);
 }
 
 /*
index 519b2cb457886c0142d6578595035516d61ab039..d29846777ae43fbda164e8ec165affa913422c16 100644 (file)
@@ -764,7 +764,7 @@ service_find_instance
           r1 = s->s_enlist(s, ti, sil, flags, weight);
           if (r1 == 0)
             enlisted++;
-          else if (enlisted == 0)
+          else if (r == 0)
             r = r1;
         }
       }
@@ -776,21 +776,17 @@ service_find_instance
           r1 = s->s_enlist(s, ti, sil, flags, weight);
           if (r1 == 0)
             enlisted++;
-          else if (enlisted == 0)
+          else if (r == 0)
             r = r1;
         }
       }
     }
+    if (enlisted)
+      r = 0;
   } else {
     r = s->s_enlist(s, ti, sil, flags, weight);
   }
 
-  if (r) {
-    if (*error < r)
-      *error = r;
-    return NULL;
-  }
-
   /* Clean */
   for(si = TAILQ_FIRST(sil); si != NULL; si = next) {
     next = TAILQ_NEXT(si, si_link);
@@ -798,6 +794,13 @@ service_find_instance
       service_instance_destroy(sil, si);
   }
 
+  /* Error handling */
+  if (r) {
+    if (*error < r)
+      *error = r;
+    return NULL;
+  }
+
   if (TAILQ_EMPTY(sil)) {
     if (*error < SM_CODE_NO_ADAPTERS)
       *error = SM_CODE_NO_ADAPTERS;