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)
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
}
# 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 ) );
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
# 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.
((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 */
* 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
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;
/* 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,
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 );
}
#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 )
{
#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 */
}
#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;
#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 );
* 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
}
#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.
*****************************************************************************/
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 )