[libdvdcss-devel] [PATCH 38/47] libdvdcss: Factor out setting cache directory from dvdcss_open()

Diego Biurrun diego at biurrun.de
Wed Oct 29 21:33:38 CET 2014


---
 src/libdvdcss.c | 130 +++++++++++++++++++++++++++++---------------------------
 1 file changed, 67 insertions(+), 63 deletions(-)

diff --git a/src/libdvdcss.c b/src/libdvdcss.c
index c74ef7b..d886ad9 100644
--- a/src/libdvdcss.c
+++ b/src/libdvdcss.c
@@ -182,67 +182,11 @@ static int set_access_method( dvdcss_t dvdcss )
     return 0;
 }
 
-/**
- * \brief Open a DVD device or directory and return a dvdcss instance.
- *
- * \param psz_target a string containing the target name, for instance
- *        "/dev/hdc" or "E:"
- * \return a handle to a dvdcss instance or NULL on error.
- *
- * Initialize the \e libdvdcss library, open the requested DVD device or
- * directory, and return a handle to be used for all subsequent \e libdvdcss
- * calls. \e libdvdcss checks whether ioctls can be performed on the disc,
- * and when possible, the disc key is retrieved.
- */
-LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( const char *psz_target )
+static char *set_cache_directory( dvdcss_t dvdcss )
 {
     char psz_buffer[PATH_MAX];
-    int i_ret;
-
-    const char *psz_cache = getenv( "DVDCSS_CACHE" );
-#ifdef DVDCSS_RAW_OPEN
-    const char *psz_raw_device = getenv( "DVDCSS_RAW_DEVICE" );
-#endif
-
-    dvdcss_t dvdcss;
-
-    /*
-     *  Allocate the library structure
-     */
-    dvdcss = malloc( sizeof( struct dvdcss_s ) );
-    if( dvdcss == NULL )
-    {
-        return NULL;
-    }
+    char *psz_cache = getenv( "DVDCSS_CACHE" );
 
-    /*
-     *  Initialize structure with default values
-     */
-#ifdef DVDCSS_RAW_OPEN
-    dvdcss->i_raw_fd = -1;
-#endif
-    dvdcss->p_titles = NULL;
-    dvdcss->psz_device = strdup( psz_target );
-    dvdcss->psz_error = "no error";
-    dvdcss->i_method = DVDCSS_METHOD_KEY;
-    dvdcss->psz_cachefile[0] = '\0';
-
-    /*
-     *  Find verbosity from DVDCSS_VERBOSE environment variable
-     */
-    set_verbosity( dvdcss );
-
-    /*
-     *  Find method from DVDCSS_METHOD environment variable
-     */
-    if( set_access_method( dvdcss ) < 0 )
-    {
-        goto error;
-    }
-
-    /*
-     *  If DVDCSS_CACHE was not set, try to guess a default value
-     */
     if( psz_cache == NULL || psz_cache[0] == '\0' )
     {
 #if defined(_WIN32_IE) && _WIN32_IE >= 0x500
@@ -307,23 +251,83 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( const char *psz_target )
 #endif
     }
 
-    /*
-     *  Find cache dir from the DVDCSS_CACHE environment variable
-     */
+    /* sanity check psz_cache value */
     if( psz_cache != NULL )
     {
         if( psz_cache[0] == '\0' || !strcmp( psz_cache, "off" ) )
         {
-            psz_cache = NULL;
+            return NULL;
         }
         /* Check that we can add the ID directory and the block filename */
         else if( strlen( psz_cache ) + 1 + 32 + 1 + (KEY_SIZE * 2) + 10 + 1
                   > PATH_MAX )
         {
             print_error( dvdcss, "cache directory name is too long" );
-            psz_cache = NULL;
+            return NULL;
         }
     }
+    return psz_cache;
+}
+
+/**
+ * \brief Open a DVD device or directory and return a dvdcss instance.
+ *
+ * \param psz_target a string containing the target name, for instance
+ *        "/dev/hdc" or "E:"
+ * \return a handle to a dvdcss instance or NULL on error.
+ *
+ * Initialize the \e libdvdcss library, open the requested DVD device or
+ * directory, and return a handle to be used for all subsequent \e libdvdcss
+ * calls. \e libdvdcss checks whether ioctls can be performed on the disc,
+ * and when possible, the disc key is retrieved.
+ */
+LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( const char *psz_target )
+{
+    int i_ret;
+
+    const char *psz_cache;
+#ifdef DVDCSS_RAW_OPEN
+    const char *psz_raw_device = getenv( "DVDCSS_RAW_DEVICE" );
+#endif
+
+    dvdcss_t dvdcss;
+
+    /*
+     *  Allocate the library structure
+     */
+    dvdcss = malloc( sizeof( struct dvdcss_s ) );
+    if( dvdcss == NULL )
+    {
+        return NULL;
+    }
+
+    /*
+     *  Initialize structure with default values
+     */
+#ifdef DVDCSS_RAW_OPEN
+    dvdcss->i_raw_fd = -1;
+#endif
+    dvdcss->p_titles = NULL;
+    dvdcss->psz_device = strdup( psz_target );
+    dvdcss->psz_error = "no error";
+    dvdcss->i_method = DVDCSS_METHOD_KEY;
+    dvdcss->psz_cachefile[0] = '\0';
+
+    /*
+     *  Find verbosity from DVDCSS_VERBOSE environment variable
+     */
+    set_verbosity( dvdcss );
+
+    /*
+     *  Find method from DVDCSS_METHOD environment variable
+     */
+    if( set_access_method( dvdcss ) < 0 )
+    {
+        goto error;
+    }
+
+    /* Set CSS key cache directory. */
+    psz_cache = set_cache_directory( dvdcss );
 
     /*
      *  Open device
-- 
1.9.1



More information about the libdvdcss-devel mailing list