]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
descrambler: avoid dlopen()
authorPim Zandbergen <pim@zandbergen.org>
Wed, 10 Jan 2024 11:15:29 +0000 (12:15 +0100)
committerFlole998 <Flole998@users.noreply.github.com>
Thu, 11 Jan 2024 13:04:08 +0000 (14:04 +0100)
src/descrambler/tvhcsa.c

index 0cd57c2920d4944937102fb4c156fdc9862d09d9..2c75f89693635de0f3695e8b94a7e41a707e464f 100644 (file)
@@ -20,6 +20,8 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <assert.h>
+#define _GNU_SOURCE
+#define __USE_GNU
 #include <dlfcn.h>
 
 #include "tvhcsa.h"
@@ -31,7 +33,7 @@
 #include "descrambler/algo/libdesdec.h"
 
 #if ENABLE_DVBCSA
-static int dvbcsa_dl_loaded;
+static int dvbcsa_dl_scanned;
 static dvbcsa_dl_bs_key_set_type dvbcsa_dl_bs_key_set_ecm;
 #endif
 
@@ -273,28 +275,16 @@ void
 tvhcsa_init ( tvhcsa_t *csa )
 {
 #if ENABLE_DVBCSA
-  void *dvbcsa_dlh;
-
-  if (!dvbcsa_dl_loaded)
+  if (!dvbcsa_dl_scanned)
   {
-    dvbcsa_dl_loaded++;
-    dvbcsa_dlh = dlopen(NULL, RTLD_LAZY);
-    if (dvbcsa_dlh)
-    {
-      dvbcsa_dl_bs_key_set_ecm = (dvbcsa_dl_bs_key_set_type) dlsym(dvbcsa_dlh, "dvbcsa_bs_key_set_ecm");
-      if (dvbcsa_dl_bs_key_set_ecm)
-        tvhinfo(LS_DESCRAMBLER, "dvbcsa_bs_key_set_ecm() function detected in libdvbcsa");
-      else
-      {
-        dlclose(dvbcsa_dlh);
-        tvhinfo(LS_DESCRAMBLER, "dvbcsa_bs_key_set_ecm() function not detected in libdvbcsa");
-      }
-    }
-    else
-    {
-      dvbcsa_dl_bs_key_set_ecm = NULL;
-      tvhwarn(LS_DESCRAMBLER, "could not dlopen libdvbcsa");
-    }
+    dvbcsa_dl_scanned++;
+#if defined RTLD_DEFAULT
+    dvbcsa_dl_bs_key_set_ecm = (dvbcsa_dl_bs_key_set_type) dlsym(RTLD_DEFAULT, "dvbcsa_bs_key_set_ecm");
+    tvhinfo(LS_DESCRAMBLER, "dvbcsa_bs_key_set_ecm() function%s detected in libdvbcsa", dvbcsa_dl_bs_key_set_ecm ? "" : " not");
+#else
+    dvbcsa_dl_bs_key_set_ecm = (dvbcsa_dl_bs_key_set_type) NULL;
+    tvhinfo(LS_DESCRAMBLER, "can not detect dvbcsa_bs_key_set_ecm() function: RTLD_DEFAULT not defined on this system");
+#endif
   }
 #endif
   csa->csa_type          = 0;