Commit dffe74e2 authored by Gildas Bazin's avatar Gildas Bazin

* src/extras/dirent.c, ALL: fixed win32/ce dirent replacement and made it...

* src/extras/dirent.c, ALL: fixed win32/ce dirent replacement and made it accessible from plugins as well.
parent f08cca38
...@@ -327,7 +327,6 @@ SOURCES_libvlc_win32 = \ ...@@ -327,7 +327,6 @@ SOURCES_libvlc_win32 = \
SOURCES_libvlc_dirent = \ SOURCES_libvlc_dirent = \
src/extras/dirent.c \ src/extras/dirent.c \
src/extras/dirent.h \
$(NULL) $(NULL)
SOURCES_libvlc_getopt = \ SOURCES_libvlc_getopt = \
......
...@@ -872,6 +872,30 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) ...@@ -872,6 +872,30 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
# define vlc_strcasestr NULL # define vlc_strcasestr NULL
#endif #endif
#ifndef HAVE_DIRENT_H
typedef struct DIR DIR;
# ifndef FILENAME_MAX
# define FILENAME_MAX (260)
# endif
struct dirent
{
long d_ino; /* Always zero. */
unsigned short d_reclen; /* Always zero. */
unsigned short d_namlen; /* Length of name in d_name. */
char d_name[FILENAME_MAX]; /* File name. */
};
# define opendir vlc_opendir
# define readdir vlc_readdir
# define closedir vlc_closedir
VLC_EXPORT( DIR *, vlc_opendir, ( const char * ) );
VLC_EXPORT( struct dirent *, vlc_readdir, ( DIR * ) );
VLC_EXPORT( int, vlc_closedir, ( DIR * ) );
#elif !defined(__PLUGIN__)
# define vlc_opendir NULL
# define vlc_readdir NULL
# define vlc_closedir NULL
#endif
/* Format type specifiers for 64 bits numbers */ /* Format type specifiers for 64 bits numbers */
#if !defined(WIN32) && !defined(UNDER_CE) #if !defined(WIN32) && !defined(UNDER_CE)
# define I64Fd "%lld" # define I64Fd "%lld"
......
...@@ -50,8 +50,7 @@ ...@@ -50,8 +50,7 @@
# include <io.h> # include <io.h>
#endif #endif
#if (!defined( WIN32 ) || defined(__MINGW32__)) #ifdef HAVE_DIRENT_H
/* Mingw has its own version of dirent */
# include <dirent.h> # include <dirent.h>
#endif #endif
......
...@@ -57,8 +57,7 @@ ...@@ -57,8 +57,7 @@
# include <io.h> # include <io.h>
#endif #endif
#if (!defined( WIN32 ) || defined(__MINGW32__)) #ifdef HAVE_DIRENT_H
/* Mingw has its own version of dirent */
# include <dirent.h> # include <dirent.h>
#endif #endif
...@@ -302,16 +301,12 @@ static int Open( vlc_object_t *p_this ) ...@@ -302,16 +301,12 @@ static int Open( vlc_object_t *p_this )
p_sys->i_files = 0; p_sys->i_files = 0;
p_sys->pp_files = NULL; p_sys->pp_files = NULL;
#if defined(SYS_DARWIN) || defined(SYS_BEOS) || \ #if defined(SYS_DARWIN) || defined(SYS_BEOS) || defined(WIN32)
( defined(WIN32) && !defined(UNDER_CE ) )
if ( ( psz_src = config_GetPsz( p_intf, "http-src" )) == NULL ) if ( ( psz_src = config_GetPsz( p_intf, "http-src" )) == NULL )
{ {
char * psz_vlcpath = p_intf->p_libvlc->psz_vlcpath; char * psz_vlcpath = p_intf->p_libvlc->psz_vlcpath;
psz_src = malloc( strlen(psz_vlcpath) + strlen("/share/http" ) + 1 ); psz_src = malloc( strlen(psz_vlcpath) + strlen("/share/http" ) + 1 );
if( !psz_src ) if( !psz_src ) return VLC_ENOMEM;
{
return VLC_ENOMEM;
}
#if defined(WIN32) #if defined(WIN32)
sprintf( psz_src, "%s/http", psz_vlcpath); sprintf( psz_src, "%s/http", psz_vlcpath);
#else #else
......
...@@ -47,8 +47,6 @@ ...@@ -47,8 +47,6 @@
#ifdef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H
# include <dirent.h> # include <dirent.h>
#else
# include "../../src/extras/dirent.h"
#endif #endif
/* libebml and matroska */ /* libebml and matroska */
......
...@@ -42,8 +42,7 @@ ...@@ -42,8 +42,7 @@
# include <direct.h> # include <direct.h>
#endif #endif
#if (!defined( WIN32 ) || defined(__MINGW32__)) #ifdef HAVE_DIRENT_H
/* Mingw has its own version of dirent */
# include <dirent.h> # include <dirent.h>
#endif #endif
......
...@@ -30,8 +30,7 @@ ...@@ -30,8 +30,7 @@
#elif defined( WIN32 ) #elif defined( WIN32 )
# include <direct.h> # include <direct.h>
#endif #endif
#if (!defined( WIN32 ) || defined(__MINGW32__)) #ifdef HAVE_DIRENT_H
/* Mingw has its own version of dirent */
# include <dirent.h> # include <dirent.h>
#endif #endif
......
...@@ -534,13 +534,13 @@ protected: ...@@ -534,13 +534,13 @@ protected:
static inline wchar_t *_FROMMB( const char *psz_in ) static inline wchar_t *_FROMMB( const char *psz_in )
{ {
mbstowcs( pwsz_mbtow, psz_in, 2048 ); mbstowcs( pwsz_mbtow, psz_in, 2048 );
pwsz_mbtow[2048] = 0; pwsz_mbtow[2048-1] = 0;
return pwsz_mbtow; return pwsz_mbtow;
} }
static inline char *_TOMB( const wchar_t *pwsz_in ) static inline char *_TOMB( const wchar_t *pwsz_in )
{ {
wcstombs( psz_wtomb, pwsz_in, 2048 ); wcstombs( psz_wtomb, pwsz_in, 2048 );
psz_wtomb[2048] = 0; psz_wtomb[2048-1] = 0;
return psz_wtomb; return psz_wtomb;
} }
#else #else
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#include "config.h" #include "config.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
#ifdef HAVE_ERRNO_H #ifdef HAVE_ERRNO_H
# include <errno.h> # include <errno.h>
#else #else
...@@ -33,16 +35,50 @@ ...@@ -33,16 +35,50 @@
#ifndef UNDER_CE #ifndef UNDER_CE
# include <io.h> # include <io.h>
# include <direct.h> # include <direct.h>
#else
# define FILENAME_MAX (260)
#endif #endif
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> /* for GetFileAttributes */ #include <windows.h> /* for GetFileAttributes */
#include "dirent.h" #include <tchar.h>
#define SUFFIX "*" #define SUFFIX "*"
#define SLASH "\\" #define SLASH "\\"
struct dirent
{
long d_ino; /* Always zero. */
unsigned short d_reclen; /* Always zero. */
unsigned short d_namlen; /* Length of name in d_name. */
char d_name[FILENAME_MAX]; /* File name. */
};
typedef struct
{
/* disk transfer area for this dir */
WIN32_FIND_DATA dd_dta;
/* dirent struct to return from dir (NOTE: this makes this thread
* safe as long as only one thread uses a particular DIR struct at
* a time) */
struct dirent dd_dir;
/* findnext handle */
HANDLE dd_handle;
/*
* Status of search:
* 0 = not started yet (next entry to read is first entry)
* -1 = off the end
* positive = 0 based index of next entry
*/
int dd_stat;
/* given path for dir with search pattern (struct is extended) */
char dd_name[1];
} DIR;
/* /*
* opendir * opendir
* *
...@@ -50,7 +86,7 @@ ...@@ -50,7 +86,7 @@
* searching a directory. * searching a directory.
*/ */
DIR * DIR *
opendir (const CHAR *szPath) vlc_opendir (const CHAR *szPath)
{ {
DIR *nd; DIR *nd;
unsigned int rc; unsigned int rc;
...@@ -71,8 +107,17 @@ opendir (const CHAR *szPath) ...@@ -71,8 +107,17 @@ opendir (const CHAR *szPath)
} }
/* Attempt to determine if the given path really is a directory. */ /* Attempt to determine if the given path really is a directory. */
#ifdef UNICODE
{
wchar_t szPathTmp[MAX_PATH];
mbstowcs( szPathTmp, szPath, MAX_PATH );
szPathTmp[MAX_PATH-1] = 0;
rc = GetFileAttributes (szPathTmp);
}
#else
rc = GetFileAttributes (szPath); rc = GetFileAttributes (szPath);
if (rc == -1) #endif
if (rc == (unsigned int)-1)
{ {
/* call GetLastError for more error info */ /* call GetLastError for more error info */
errno = ENOENT; errno = ENOENT;
...@@ -89,13 +134,22 @@ opendir (const CHAR *szPath) ...@@ -89,13 +134,22 @@ opendir (const CHAR *szPath)
#if defined( UNDER_CE ) #if defined( UNDER_CE )
if (szPath[0] == '\\' || szPath[0] == '/') if (szPath[0] == '\\' || szPath[0] == '/')
{ {
sprintf (szFullPath, MAX_PATH, "%s", szPath); sprintf (szFullPath, "%s", szPath);
szFullPath[0] = '\\'; szFullPath[0] = '\\';
} }
else
{
wchar_t szFullPathTmp[MAX_PATH];
if (GetModuleFileName( NULL, szFullPathTmp, MAX_PATH ) )
{
wcstombs( szFullPath, szFullPathTmp, MAX_PATH );
szFullPath[MAX_PATH-1] = 0;
}
else else
{ {
/* FIXME: if I wasn't lazy, I'd check for overflows here. */ /* FIXME: if I wasn't lazy, I'd check for overflows here. */
sprintf (szFullPath, MAX_PATH, "\\%s", szPath ); sprintf (szFullPath, "\\%s", szPath );
}
} }
#else #else
_fullpath (szFullPath, szPath, MAX_PATH); _fullpath (szFullPath, szPath, MAX_PATH);
...@@ -103,8 +157,8 @@ opendir (const CHAR *szPath) ...@@ -103,8 +157,8 @@ opendir (const CHAR *szPath)
/* Allocate enough space to store DIR structure and the complete /* Allocate enough space to store DIR structure and the complete
* directory path given. */ * directory path given. */
nd = (DIR *) malloc (sizeof (DIR) + strlen (szFullPath) + strlen (SLASH) + nd = (DIR *) malloc (sizeof (DIR) + strlen (szFullPath) + sizeof (SLASH) +
strlen (SUFFIX)); sizeof (SUFFIX));
if (!nd) if (!nd)
{ {
...@@ -127,9 +181,9 @@ opendir (const CHAR *szPath) ...@@ -127,9 +181,9 @@ opendir (const CHAR *szPath)
/* Add on the search pattern */ /* Add on the search pattern */
strcat (nd->dd_name, SUFFIX); strcat (nd->dd_name, SUFFIX);
/* Initialize handle to -1 so that a premature closedir doesn't try /* Initialize handle so that a premature closedir doesn't try
* to call FindClose on it. */ * to call FindClose on it. */
nd->dd_handle = -1; nd->dd_handle = INVALID_HANDLE_VALUE;
/* Initialize the status. */ /* Initialize the status. */
nd->dd_stat = 0; nd->dd_stat = 0;
...@@ -140,7 +194,7 @@ opendir (const CHAR *szPath) ...@@ -140,7 +194,7 @@ opendir (const CHAR *szPath)
nd->dd_dir.d_ino = 0; nd->dd_dir.d_ino = 0;
nd->dd_dir.d_reclen = 0; nd->dd_dir.d_reclen = 0;
nd->dd_dir.d_namlen = 0; nd->dd_dir.d_namlen = 0;
nd->dd_dir.d_name = nd->dd_dta.cFileName; memset (nd->dd_dir.d_name, 0, FILENAME_MAX);
return nd; return nd;
} }
...@@ -153,7 +207,7 @@ opendir (const CHAR *szPath) ...@@ -153,7 +207,7 @@ opendir (const CHAR *szPath)
* next entry in the directory. * next entry in the directory.
*/ */
struct dirent * struct dirent *
readdir (DIR * dirp) vlc_readdir (DIR * dirp)
{ {
errno = 0; errno = 0;
...@@ -164,13 +218,6 @@ readdir (DIR * dirp) ...@@ -164,13 +218,6 @@ readdir (DIR * dirp)
return (struct dirent *) 0; return (struct dirent *) 0;
} }
if (dirp->dd_dir.d_name != dirp->dd_dta.cFileName)
{
/* The structure does not seem to be set up correctly. */
errno = EINVAL;
return (struct dirent *) 0;
}
if (dirp->dd_stat < 0) if (dirp->dd_stat < 0)
{ {
/* We have already returned all files in the directory /* We have already returned all files in the directory
...@@ -179,11 +226,18 @@ readdir (DIR * dirp) ...@@ -179,11 +226,18 @@ readdir (DIR * dirp)
} }
else if (dirp->dd_stat == 0) else if (dirp->dd_stat == 0)
{ {
#ifdef UNICODE
wchar_t dd_name[MAX_PATH];
mbstowcs( dd_name, dirp->dd_name, MAX_PATH );
dd_name[MAX_PATH-1] = 0;
#else
char *dd_name = dirp->dd_name;
#endif
/* We haven't started the search yet. */ /* We haven't started the search yet. */
/* Start the search */ /* Start the search */
dirp->dd_handle = (long)FindFirstFile (dirp->dd_name, &(dirp->dd_dta)); dirp->dd_handle = FindFirstFile (dd_name, &(dirp->dd_dta));
if (dirp->dd_handle == -1) if (dirp->dd_handle == INVALID_HANDLE_VALUE)
{ {
/* Whoops! Seems there are no files in that /* Whoops! Seems there are no files in that
* directory. */ * directory. */
...@@ -197,11 +251,11 @@ readdir (DIR * dirp) ...@@ -197,11 +251,11 @@ readdir (DIR * dirp)
else else
{ {
/* Get the next search entry. */ /* Get the next search entry. */
if (FindNextFile ((HANDLE)dirp->dd_handle, &(dirp->dd_dta))) if (!FindNextFile ((HANDLE)dirp->dd_handle, &(dirp->dd_dta)))
{ {
/* We are off the end or otherwise error. */ /* We are off the end or otherwise error. */
FindClose ((HANDLE)dirp->dd_handle); FindClose ((HANDLE)dirp->dd_handle);
dirp->dd_handle = -1; dirp->dd_handle = INVALID_HANDLE_VALUE;
dirp->dd_stat = -1; dirp->dd_stat = -1;
} }
else else
...@@ -214,9 +268,17 @@ readdir (DIR * dirp) ...@@ -214,9 +268,17 @@ readdir (DIR * dirp)
if (dirp->dd_stat > 0) if (dirp->dd_stat > 0)
{ {
/* Successfully got an entry. Everything about the file is /* Successfully got an entry */
* already appropriately filled in except the length of the
* file name. */ #ifdef UNICODE
char d_name[MAX_PATH];
wcstombs( d_name, dirp->dd_dta.cFileName, MAX_PATH );
d_name[MAX_PATH-1] = 0;
#else
char *d_name = dirp->dd_dta.cFileName;
#endif
strcpy (dirp->dd_dir.d_name, d_name);
dirp->dd_dir.d_namlen = strlen (dirp->dd_dir.d_name); dirp->dd_dir.d_namlen = strlen (dirp->dd_dir.d_name);
return &dirp->dd_dir; return &dirp->dd_dir;
} }
...@@ -231,7 +293,7 @@ readdir (DIR * dirp) ...@@ -231,7 +293,7 @@ readdir (DIR * dirp)
* Frees up resources allocated by opendir. * Frees up resources allocated by opendir.
*/ */
int int
closedir (DIR * dirp) vlc_closedir (DIR * dirp)
{ {
int rc; int rc;
...@@ -244,7 +306,7 @@ closedir (DIR * dirp) ...@@ -244,7 +306,7 @@ closedir (DIR * dirp)
return -1; return -1;
} }
if (dirp->dd_handle != -1) if (dirp->dd_handle != INVALID_HANDLE_VALUE)
{ {
rc = FindClose ((HANDLE)dirp->dd_handle); rc = FindClose ((HANDLE)dirp->dd_handle);
} }
...@@ -262,7 +324,7 @@ closedir (DIR * dirp) ...@@ -262,7 +324,7 @@ closedir (DIR * dirp)
* and then reset things like an opendir. * and then reset things like an opendir.
*/ */
void void
rewinddir (DIR * dirp) vlc_rewinddir (DIR * dirp)
{ {
errno = 0; errno = 0;
...@@ -272,12 +334,12 @@ rewinddir (DIR * dirp) ...@@ -272,12 +334,12 @@ rewinddir (DIR * dirp)
return; return;
} }
if (dirp->dd_handle != -1) if (dirp->dd_handle != INVALID_HANDLE_VALUE)
{ {
FindClose ((HANDLE)dirp->dd_handle); FindClose ((HANDLE)dirp->dd_handle);
} }
dirp->dd_handle = -1; dirp->dd_handle = INVALID_HANDLE_VALUE;
dirp->dd_stat = 0; dirp->dd_stat = 0;
} }
...@@ -288,7 +350,7 @@ rewinddir (DIR * dirp) ...@@ -288,7 +350,7 @@ rewinddir (DIR * dirp)
* seekdir to go back to an old entry. We simply return the value in stat. * seekdir to go back to an old entry. We simply return the value in stat.
*/ */
long long
telldir (DIR * dirp) vlc_telldir (DIR * dirp)
{ {
errno = 0; errno = 0;
...@@ -310,7 +372,7 @@ telldir (DIR * dirp) ...@@ -310,7 +372,7 @@ telldir (DIR * dirp)
* any such system. * any such system.
*/ */
void void
seekdir (DIR * dirp, long lPos) vlc_seekdir (DIR * dirp, long lPos)
{ {
errno = 0; errno = 0;
...@@ -329,19 +391,19 @@ seekdir (DIR * dirp, long lPos) ...@@ -329,19 +391,19 @@ seekdir (DIR * dirp, long lPos)
else if (lPos == -1) else if (lPos == -1)
{ {
/* Seek past end. */ /* Seek past end. */
if (dirp->dd_handle != -1) if (dirp->dd_handle != INVALID_HANDLE_VALUE)
{ {
FindClose ((HANDLE)dirp->dd_handle); FindClose ((HANDLE)dirp->dd_handle);
} }
dirp->dd_handle = -1; dirp->dd_handle = INVALID_HANDLE_VALUE;
dirp->dd_stat = -1; dirp->dd_stat = -1;
} }
else else
{ {
/* Rewind and read forward to the appropriate index. */ /* Rewind and read forward to the appropriate index. */
rewinddir (dirp); vlc_rewinddir (dirp);
while ((dirp->dd_stat < lPos) && readdir (dirp)) while ((dirp->dd_stat < lPos) && vlc_readdir (dirp))
; ;
} }
} }
...@@ -33,8 +33,6 @@ ...@@ -33,8 +33,6 @@
#ifdef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H
# include <dirent.h> # include <dirent.h>
#else
# include "../extras/dirent.h"
#endif #endif
#include <ctype.h> #include <ctype.h>
...@@ -299,7 +297,6 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path, ...@@ -299,7 +297,6 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
for( j = -1; j == -1 || ( j >= 0 && subdirs != NULL && *subdirs != NULL ); for( j = -1; j == -1 || ( j >= 0 && subdirs != NULL && *subdirs != NULL );
j++) j++)
{ {
#ifdef HAVE_DIRENT_H
d = opendir( j < 0 ? f_dir : *subdirs ); d = opendir( j < 0 ? f_dir : *subdirs );
if( d ) if( d )
{ {
...@@ -378,7 +375,6 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path, ...@@ -378,7 +375,6 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
} }
closedir( d ); closedir( d );
} }
#endif
if( j >= 0 ) free( *subdirs++ ); if( j >= 0 ) free( *subdirs++ );
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment