]> git.sesse.net Git - vlc/commitdiff
* src/extras/libc.c: Added an implementation of scandir (from directory.c).
authorChristophe Massiot <massiot@videolan.org>
Fri, 5 Aug 2005 19:25:38 +0000 (19:25 +0000)
committerChristophe Massiot <massiot@videolan.org>
Fri, 5 Aug 2005 19:25:38 +0000 (19:25 +0000)
 * modules/control/http.c: Use scandir instead of readdir since it allows
   to sort the files alphanumerically.
 * src/misc/charset.c: Fixed the declaration of vlc_fix_readdir_charset.

configure.ac
include/charset.h
include/vlc_common.h
include/vlc_symbols.h
modules/access/directory.c
modules/control/http.c
src/extras/libc.c
src/misc/charset.c

index d89c3fc344efa1ff01df6821a6045541e480f282..3ad5d77398e764ab528e3e4df42f0225f1ecbcd5 100644 (file)
@@ -310,7 +310,7 @@ CPPFLAGS_save="${CPPFLAGS_save} -DSYS_`echo ${SYS} | sed -e 's/-.*//' | tr 'abcd
 dnl Check for system libs needed
 need_libc=false
 
-AC_CHECK_FUNCS(gettimeofday select strerror strtod strtol strtof strtoll strtoull strsep isatty vasprintf asprintf swab sigrelse getpwuid memalign posix_memalign if_nametoindex atoll getenv putenv setenv gmtime_r ctime_r localtime_r lrintf daemon)
+AC_CHECK_FUNCS(gettimeofday select strerror strtod strtol strtof strtoll strtoull strsep isatty vasprintf asprintf swab sigrelse getpwuid memalign posix_memalign if_nametoindex atoll getenv putenv setenv gmtime_r ctime_r localtime_r lrintf daemon scandir)
 
 dnl Check for usual libc functions
 AC_CHECK_FUNCS(strdup strndup atof)
index 56c0cba5a58e833438633fda95592dbfb378fab9..39d0994b93d7cc56246cdfbc5b41478fe402263c 100644 (file)
@@ -30,7 +30,8 @@ VLC_EXPORT( void, LocaleFree, ( const char * ) );
 VLC_EXPORT( char *, FromLocale, ( const char * ) );
 VLC_EXPORT( char *, ToLocale, ( const char * ) );
 VLC_EXPORT( char *, EnsureUTF8, ( char * ) );
-VLC_EXPORT( char *, vlc_fix_readdir_charset, ( vlc_object_t *, const char * ) );
+VLC_EXPORT( char *, __vlc_fix_readdir_charset, ( vlc_object_t *, const char * ) );
+#define vlc_fix_readdir_charset(a,b) __vlc_fix_readdir_charset(VLC_OBJECT(a),b)
 
 # ifdef __cplusplus
 }
index 158122b282d98c316d5351f9a80dcd5a67bbb28b..43575a17e10eedcafa2ac9b14d5f0f9265060aef 100644 (file)
@@ -838,6 +838,20 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
 #   define vlc_strtoll NULL
 #endif
 
+#ifndef HAVE_SCANDIR
+#   define scandir vlc_scandir
+#   define alphasort vlc_alphasort
+    VLC_EXPORT( int, vlc_scandir, ( const char *name, struct dirent ***namelist,
+                                    int (*filter) ( const struct dirent * ),
+                                    int (*compar) ( const struct dirent **,
+                                                    const struct dirent ** ) ) );
+    VLC_EXPORT( int, vlc_alphasort, ( const struct dirent **a,
+                                      const struct dirent **b ) );
+#elif !defined(__PLUGIN__)
+#   define vlc_scandir NULL
+#   define vlc_alphasort NULL
+#endif
+
 #ifndef HAVE_GETENV
 #   define getenv vlc_getenv
     VLC_EXPORT( char *, vlc_getenv, ( const char *name ) );
index 2c2f0a983210fa4e99d6ed8fd73efdb7931aa7e7..ea42ef5d2b8cf781c0473c751dffc282f5b22045 100644 (file)
@@ -387,7 +387,8 @@ struct module_symbols_t
     void (*LocaleFree_inner) (const char *);
     char * (*ToLocale_inner) (const char *);
     char * (*EnsureUTF8_inner) (char *);
-    char * (*vlc_fix_readdir_charset_inner) (vlc_object_t *, const char *);
+    void *vlc_fix_readdir_charset_deprecated;
+    char * (*__vlc_fix_readdir_charset_inner) (vlc_object_t *, const char *);
 };
 # if defined (__PLUGIN__)
 #  define aout_FiltersCreatePipeline (p_symbols)->aout_FiltersCreatePipeline_inner
@@ -760,7 +761,7 @@ struct module_symbols_t
 #  define LocaleFree (p_symbols)->LocaleFree_inner
 #  define ToLocale (p_symbols)->ToLocale_inner
 #  define EnsureUTF8 (p_symbols)->EnsureUTF8_inner
-#  define vlc_fix_readdir_charset (p_symbols)->vlc_fix_readdir_charset_inner
+#  define __vlc_fix_readdir_charset (p_symbols)->__vlc_fix_readdir_charset_inner
 # elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__)
 /******************************************************************
  * STORE_SYMBOLS: store VLC APIs into p_symbols for plugin access.
@@ -1136,8 +1137,9 @@ struct module_symbols_t
     ((p_symbols)->LocaleFree_inner) = LocaleFree; \
     ((p_symbols)->ToLocale_inner) = ToLocale; \
     ((p_symbols)->EnsureUTF8_inner) = EnsureUTF8; \
-    ((p_symbols)->vlc_fix_readdir_charset_inner) = vlc_fix_readdir_charset; \
+    ((p_symbols)->__vlc_fix_readdir_charset_inner) = __vlc_fix_readdir_charset; \
     (p_symbols)->net_ConvertIPv4_deprecated = NULL; \
+    (p_symbols)->vlc_fix_readdir_charset_deprecated = NULL; \
 
 # endif /* __PLUGIN__ */
 #endif /* __VLC_SYMBOLS_H */
index 827ba6f39e81a1d5cd6e81bf4fc1edf1f215a974..178f42dcc41ed21b0bebc0500c9532855ba0ad70 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) 2002-2004 the VideoLAN team
  * $Id$
  *
- * Authors: Derk-Jan Hartman <hartman at videolan dot org>>
+ * Authors: Derk-Jan Hartman <hartman at videolan dot org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -364,53 +364,6 @@ static int DemuxControl( demux_t *p_demux, int i_query, va_list args )
     return demux2_vaControlHelper( p_demux->s, 0, 0, 0, 1, i_query, args );
 }
 
-#if defined(SYS_BEOS) || defined(WIN32) || defined(SYS_SOLARIS)
-/* BeOS doesn't have scandir/alphasort/versionsort */
-static int alphasort( const struct dirent **a, const struct dirent **b )
-{
-    return strcoll( (*a)->d_name, (*b)->d_name );
-}
-
-static int scandir( const char *name, struct dirent ***namelist,
-                    int (*filter) ( const struct dirent * ),
-                    int (*compar) ( const struct dirent **,
-                                    const struct dirent ** ) )
-{
-    DIR            * p_dir;
-    struct dirent  * p_content;
-    struct dirent ** pp_list;
-    int              ret, size;
-
-    if( !namelist || !( p_dir = opendir( name ) ) ) return -1;
-
-    ret     = 0;
-    pp_list = NULL;
-    while( ( p_content = readdir( p_dir ) ) )
-    {
-        if( filter && !filter( p_content ) )
-        {
-            continue;
-        }
-        pp_list = realloc( pp_list, ( ret + 1 ) * sizeof( struct dirent * ) );
-        size = sizeof( struct dirent ) + strlen( p_content->d_name ) + 1;
-        pp_list[ret] = malloc( size );
-        memcpy( pp_list[ret], p_content, size );
-        ret++;
-    }
-
-    closedir( p_dir );
-
-    if( compar )
-    {
-        qsort( pp_list, ret, sizeof( struct dirent * ),
-               (int (*)(const void *, const void *)) compar );
-    }
-
-    *namelist = pp_list;
-    return ret;
-}
-#endif
-
 static int Filter( const struct dirent *foo )
 {
     return VLC_TRUE;
@@ -507,14 +460,12 @@ static int ReadDir( playlist_t *p_playlist,
                         /* Skip the parent path + the separator */
                         psz_subdir += strlen( psz_name ) + 1;
                         psz_newname = vlc_fix_readdir_charset(
-                                                VLC_OBJECT(p_playlist),
-                                                psz_subdir );
+                                                p_playlist, psz_subdir );
                     }
                     else
                     {
                         psz_newname = vlc_fix_readdir_charset(
-                                                VLC_OBJECT(p_playlist),
-                                                psz_name );
+                                                p_playlist, psz_name );
                     }
                     p_node = playlist_NodeCreate( p_playlist,
                                        p_parent->pp_parents[0]->i_view,
index 7667b86b58aff500115525525fb60adbbc6adbe2..c25f47081d32a42d2f9def068d5584d245967f54 100644 (file)
@@ -713,11 +713,10 @@ static int ParseDirectory( intf_thread_t *p_intf, char *psz_root,
             f->p_file = NULL;
             f->p_redir = NULL;
             f->p_redir2 = NULL;
-            psz_tmp = vlc_fix_readdir_charset( VLC_OBJECT(p_intf),
-                                               dir );
+            psz_tmp = vlc_fix_readdir_charset( p_intf, dir );
             f->file = FromUTF8( p_intf, psz_tmp );
             free( psz_tmp );
-            psz_tmp = vlc_fix_readdir_charset( VLC_OBJECT(p_intf),
+            psz_tmp = vlc_fix_readdir_charset( p_intf,
                                                &dir[strlen( psz_root )] );
             f->name = FileToUrl( psz_tmp, &b_index );
             free( psz_tmp );
@@ -1208,6 +1207,12 @@ static mvar_t *mvar_HttpdInfoSetNew( char *name, httpd_t *p_httpd, int i_type )
 }
 #endif
 
+/* Utility function for scandir */
+static int Filter( const struct dirent *foo )
+{
+    return VLC_TRUE;
+}
+
 static mvar_t *mvar_FileSetNew( intf_thread_t *p_intf, char *name,
                                 char *psz_dir )
 {
@@ -1216,8 +1221,8 @@ static mvar_t *mvar_FileSetNew( intf_thread_t *p_intf, char *name,
 #ifdef HAVE_SYS_STAT_H
     struct stat   stat_info;
 #endif
-    DIR           *p_dir;
-    struct dirent *p_dir_content;
+    struct dirent **pp_dir_content;
+    int           i_dir_content, i;
     char          sep;
 
     /* convert all / to native separator */
@@ -1312,30 +1317,29 @@ static mvar_t *mvar_FileSetNew( intf_thread_t *p_intf, char *name,
     }
 #endif
 
-    if( ( p_dir = opendir( psz_dir ) ) == NULL )
+    /* parse psz_src dir */
+    if( ( i_dir_content = scandir( psz_dir, &pp_dir_content, Filter,
+                                   alphasort ) ) == -1 )
     {
-        fprintf( stderr, "cannot open dir (%s)", psz_dir );
+        msg_Warn( p_intf, "scandir error on %s (%s)", psz_dir,
+                  strerror(errno) );
         return s;
     }
 
-    /* remove traling / or \ */
+    /* remove trailing / or \ */
     for( p = &psz_dir[strlen( psz_dir) - 1];
          p >= psz_dir && ( *p =='/' || *p =='\\' ); p-- )
     {
         *p = '\0';
     }
 
-    for( ;; )
+    for( i = 0; i < i_dir_content; i++ )
     {
+        struct dirent *p_dir_content = pp_dir_content[i];
         mvar_t *f;
         const char *psz_ext;
         char *psz_name, *psz_tmp;
 
-        /* parse psz_src dir */
-        if( ( p_dir_content = readdir( p_dir ) ) == NULL )
-        {
-            break;
-        }
         if( !strcmp( p_dir_content->d_name, "." ) )
         {
             continue;
@@ -1351,8 +1355,7 @@ static mvar_t *mvar_FileSetNew( intf_thread_t *p_intf, char *name,
 #endif
         f = mvar_New( name, "set" );
 
-        psz_tmp = vlc_fix_readdir_charset( VLC_OBJECT(p_intf),
-                                           p_dir_content->d_name );
+        psz_tmp = vlc_fix_readdir_charset( p_intf, p_dir_content->d_name );
         psz_name = FromUTF8( p_intf, psz_tmp );
         free( psz_tmp );
         snprintf( tmp, sizeof(tmp), "%s/%s", psz_dir, psz_name );
index 1e30237b47fa554e479860f6e9e92b73ce258c2b..a8c425201feefb32741d85e95c31ccf8780d50b5 100644 (file)
@@ -7,6 +7,7 @@
  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
  *          Samuel Hocevar <sam@zoy.org>
  *          Gildas Bazin <gbazin@videolan.org>
+ *          Derk-Jan Hartman <hartman at videolan dot org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -321,6 +322,55 @@ int64_t vlc_atoll( const char *nptr )
 }
 #endif
 
+/*****************************************************************************
+ * scandir: scan a directory alpha-sorted
+ *****************************************************************************/
+#if !defined( HAVE_SCANDIR )
+int vlc_alphasort( const struct dirent **a, const struct dirent **b )
+{
+    return strcoll( (*a)->d_name, (*b)->d_name );
+}
+
+int vlc_scandir( const char *name, struct dirent ***namelist,
+                    int (*filter) ( const struct dirent * ),
+                    int (*compar) ( const struct dirent **,
+                                    const struct dirent ** ) )
+{
+    DIR            * p_dir;
+    struct dirent  * p_content;
+    struct dirent ** pp_list;
+    int              ret, size;
+
+    if( !namelist || !( p_dir = opendir( name ) ) ) return -1;
+
+    ret     = 0;
+    pp_list = NULL;
+    while( ( p_content = readdir( p_dir ) ) )
+    {
+        if( filter && !filter( p_content ) )
+        {
+            continue;
+        }
+        pp_list = realloc( pp_list, ( ret + 1 ) * sizeof( struct dirent * ) );
+        size = sizeof( struct dirent ) + strlen( p_content->d_name ) + 1;
+        pp_list[ret] = malloc( size );
+        memcpy( pp_list[ret], p_content, size );
+        ret++;
+    }
+
+    closedir( p_dir );
+
+    if( compar )
+    {
+        qsort( pp_list, ret, sizeof( struct dirent * ),
+               (int (*)(const void *, const void *)) compar );
+    }
+
+    *namelist = pp_list;
+    return ret;
+}
+#endif
+
 /*****************************************************************************
  * dgettext: gettext for plugins.
  *****************************************************************************/
index fda2df292d0018f3251f47a9402d9a0333df5fd8..a7980e028ee0be890daa056fce53255ba64b07bb 100644 (file)
@@ -336,7 +336,7 @@ vlc_bool_t vlc_current_charset( char **psz_charset )
     return VLC_FALSE;
 }
 
-char *vlc_fix_readdir_charset( vlc_object_t *p_this, const char *psz_string )
+char *__vlc_fix_readdir_charset( vlc_object_t *p_this, const char *psz_string )
 {
 #ifdef SYS_DARWIN
     if ( p_this->p_libvlc->iconv_macosx != (vlc_iconv_t)-1 )