]> git.sesse.net Git - vlc/blobdiff - src/misc/modules.c
* Ported Glide and MGA plugins to the new module API. MGA never worked,
[vlc] / src / misc / modules.c
index 9fe25ed9b8629132c559a84d1efbfc7ef3bc5591..307ea544345f3fb8e7271232c8019a69f06edc9a 100644 (file)
 
 #include "config.h"
 
+/* Some faulty libcs have a broken struct dirent when _FILE_OFFSET_BITS
+ * is set to 64. Don't try to be cleverer. */
+#ifdef _FILE_OFFSET_BITS
+#undef _FILE_OFFSET_BITS
+#endif
+
 #include <stdlib.h>                                      /* free(), strtol() */
 #include <stdio.h>                                              /* sprintf() */
 #include <string.h>                                              /* strdup() */
@@ -81,13 +87,15 @@ module_bank_t * module_CreateBank( void )
  *****************************************************************************/
 void module_InitBank( module_bank_t * p_bank )
 {
-    static char * path[] = { ".", "lib", PLUGIN_PATH, NULL } ;
+    static char * path[] = { ".", "lib", PLUGIN_PATH, NULL };
 
     char **         ppsz_path = path;
+    char *          psz_fullpath;
     char *          psz_file;
 #ifdef SYS_BEOS
-    char *          psz_program_path = beos_GetProgramPath();
-    int             i_programlen = strlen( psz_program_path );
+    char *          psz_vlcpath = beos_GetProgramPath();
+    int             i_vlclen = strlen( psz_vlcpath );
+    boolean_t       b_notinroot;
 #endif
     DIR *           dir;
     struct dirent * file;
@@ -99,11 +107,35 @@ void module_InitBank( module_bank_t * p_bank )
 
     for( ; *ppsz_path != NULL ; ppsz_path++ )
     {
-        if( (dir = opendir( *ppsz_path )) )
+        /* Store strlen(*ppsz_path) for later use. */
+        int i_dirlen = strlen( *ppsz_path );
+
+#ifdef SYS_BEOS
+        b_notinroot = 0;
+        /* Under BeOS, we need to add beos_GetProgramPath() to access
+         * files under the current directory */
+        if( ( i_dirlen > 1 ) && strncmp( *ppsz_path, "/", 1 ) )
         {
-            /* Store strlen(*ppsz_path) for later use. */
-            int i_dirlen = strlen( *ppsz_path );
+            i_dirlen += i_vlclen + 2;
+            b_notinroot = 1;
 
+            psz_fullpath = malloc( i_dirlen );
+            if( psz_fullpath == NULL )
+            {
+                continue;
+            }
+            sprintf( psz_fullpath, "%s/%s", psz_vlcpath, *ppsz_path );
+        }
+        else
+#endif
+        {
+            psz_fullpath = *ppsz_path;
+        }
+
+        intf_WarnMsgImm( 2, "module: browsing %s", psz_fullpath );
+
+        if( (dir = opendir( psz_fullpath )) )
+        {
             /* Parse the directory and try to load all files it contains. */
             while( (file = readdir( dir )) )
             {
@@ -113,30 +145,13 @@ void module_InitBank( module_bank_t * p_bank )
                 if( i_filelen > 3
                         && !strncmp( file->d_name + i_filelen - 3, ".so", 3 ) )
                 {
-#ifdef SYS_BEOS
-                    /* Under BeOS, we need to add beos_GetProgramPath() to
-                     * access files under the current directory */
-                    if( strncmp( file->d_name, "/", 1 ) )
-                    {
-                        psz_file = malloc( i_programlen + i_dirlen
-                                               + i_filelen + 3 );
-                        if( psz_file == NULL )
-                        {
-                            continue;
-                        }
-                        sprintf( psz_file, "%s/%s/%s", psz_programlen,
-                                 *ppsz_path, file->d_name );
-                    }
-                    else
-#endif
+                    psz_file = malloc( i_dirlen + i_filelen + 2 );
+                    if( psz_file == NULL )
                     {
-                        psz_file = malloc( i_dirlen + i_filelen + 2 );
-                        if( psz_file == NULL )
-                        {
-                            continue;
-                        }
-                        sprintf( psz_file, "%s/%s", *ppsz_path, file->d_name );
+                        continue;
                     }
+                    sprintf( psz_file, "%s/%s", psz_fullpath, file->d_name );
+
                     /* We created a nice filename -- now we just try to load
                      * it as a dynamic module. */
                     AllocateDynModule( p_bank, psz_file );
@@ -145,7 +160,17 @@ void module_InitBank( module_bank_t * p_bank )
                     free( psz_file );
                 }
             }
+
+            /* Close the directory if successfully opened */
+            closedir( dir );
+        }
+
+#ifdef SYS_BEOS
+        if( b_notinroot )
+        {
+            free( psz_fullpath );
         }
+#endif
     }
 
     return;