* src/extras/dirent.c, ALL: fixed win32/ce dirent replacement and made it accessible from plugins as well.

This commit is contained in:
Gildas Bazin 2005-02-21 13:00:20 +00:00
parent f08cca3863
commit dffe74e2d2
10 changed files with 157 additions and 86 deletions

View File

@ -327,7 +327,6 @@ SOURCES_libvlc_win32 = \
SOURCES_libvlc_dirent = \
src/extras/dirent.c \
src/extras/dirent.h \
$(NULL)
SOURCES_libvlc_getopt = \

View File

@ -872,6 +872,30 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
# define vlc_strcasestr NULL
#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 */
#if !defined(WIN32) && !defined(UNDER_CE)
# define I64Fd "%lld"

View File

@ -50,8 +50,7 @@
# include <io.h>
#endif
#if (!defined( WIN32 ) || defined(__MINGW32__))
/* Mingw has its own version of dirent */
#ifdef HAVE_DIRENT_H
# include <dirent.h>
#endif

View File

@ -57,8 +57,7 @@
# include <io.h>
#endif
#if (!defined( WIN32 ) || defined(__MINGW32__))
/* Mingw has its own version of dirent */
#ifdef HAVE_DIRENT_H
# include <dirent.h>
#endif
@ -302,16 +301,12 @@ static int Open( vlc_object_t *p_this )
p_sys->i_files = 0;
p_sys->pp_files = NULL;
#if defined(SYS_DARWIN) || defined(SYS_BEOS) || \
( defined(WIN32) && !defined(UNDER_CE ) )
#if defined(SYS_DARWIN) || defined(SYS_BEOS) || defined(WIN32)
if ( ( psz_src = config_GetPsz( p_intf, "http-src" )) == NULL )
{
char * psz_vlcpath = p_intf->p_libvlc->psz_vlcpath;
psz_src = malloc( strlen(psz_vlcpath) + strlen("/share/http" ) + 1 );
if( !psz_src )
{
return VLC_ENOMEM;
}
if( !psz_src ) return VLC_ENOMEM;
#if defined(WIN32)
sprintf( psz_src, "%s/http", psz_vlcpath);
#else

View File

@ -47,8 +47,6 @@
#ifdef HAVE_DIRENT_H
# include <dirent.h>
#else
# include "../../src/extras/dirent.h"
#endif
/* libebml and matroska */

View File

@ -42,8 +42,7 @@
# include <direct.h>
#endif
#if (!defined( WIN32 ) || defined(__MINGW32__))
/* Mingw has its own version of dirent */
#ifdef HAVE_DIRENT_H
# include <dirent.h>
#endif

View File

@ -30,8 +30,7 @@
#elif defined( WIN32 )
# include <direct.h>
#endif
#if (!defined( WIN32 ) || defined(__MINGW32__))
/* Mingw has its own version of dirent */
#ifdef HAVE_DIRENT_H
# include <dirent.h>
#endif

View File

@ -534,13 +534,13 @@ protected:
static inline wchar_t *_FROMMB( const char *psz_in )
{
mbstowcs( pwsz_mbtow, psz_in, 2048 );
pwsz_mbtow[2048] = 0;
pwsz_mbtow[2048-1] = 0;
return pwsz_mbtow;
}
static inline char *_TOMB( const wchar_t *pwsz_in )
{
wcstombs( psz_wtomb, pwsz_in, 2048 );
psz_wtomb[2048] = 0;
psz_wtomb[2048-1] = 0;
return psz_wtomb;
}
#else

View File

@ -18,6 +18,8 @@
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#ifdef HAVE_ERRNO_H
# include <errno.h>
#else
@ -33,16 +35,50 @@
#ifndef UNDER_CE
# include <io.h>
# include <direct.h>
#else
# define FILENAME_MAX (260)
#endif
#define WIN32_LEAN_AND_MEAN
#include <windows.h> /* for GetFileAttributes */
#include "dirent.h"
#include <tchar.h>
#define SUFFIX "*"
#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
*
@ -50,7 +86,7 @@
* searching a directory.
*/
DIR *
opendir (const CHAR *szPath)
vlc_opendir (const CHAR *szPath)
{
DIR *nd;
unsigned int rc;
@ -71,8 +107,17 @@ opendir (const CHAR *szPath)
}
/* 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);
if (rc == -1)
#endif
if (rc == (unsigned int)-1)
{
/* call GetLastError for more error info */
errno = ENOENT;
@ -89,13 +134,22 @@ opendir (const CHAR *szPath)
#if defined( UNDER_CE )
if (szPath[0] == '\\' || szPath[0] == '/')
{
sprintf (szFullPath, MAX_PATH, "%s", szPath);
sprintf (szFullPath, "%s", szPath);
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
{
/* FIXME: if I wasn't lazy, I'd check for overflows here. */
sprintf (szFullPath, MAX_PATH, "\\%s", szPath );
sprintf (szFullPath, "\\%s", szPath );
}
}
#else
_fullpath (szFullPath, szPath, MAX_PATH);
@ -103,8 +157,8 @@ opendir (const CHAR *szPath)
/* Allocate enough space to store DIR structure and the complete
* directory path given. */
nd = (DIR *) malloc (sizeof (DIR) + strlen (szFullPath) + strlen (SLASH) +
strlen (SUFFIX));
nd = (DIR *) malloc (sizeof (DIR) + strlen (szFullPath) + sizeof (SLASH) +
sizeof (SUFFIX));
if (!nd)
{
@ -127,9 +181,9 @@ opendir (const CHAR *szPath)
/* Add on the search pattern */
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. */
nd->dd_handle = -1;
nd->dd_handle = INVALID_HANDLE_VALUE;
/* Initialize the status. */
nd->dd_stat = 0;
@ -140,7 +194,7 @@ opendir (const CHAR *szPath)
nd->dd_dir.d_ino = 0;
nd->dd_dir.d_reclen = 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;
}
@ -153,7 +207,7 @@ opendir (const CHAR *szPath)
* next entry in the directory.
*/
struct dirent *
readdir (DIR * dirp)
vlc_readdir (DIR * dirp)
{
errno = 0;
@ -164,13 +218,6 @@ readdir (DIR * dirp)
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)
{
/* We have already returned all files in the directory
@ -179,11 +226,18 @@ readdir (DIR * dirp)
}
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. */
/* 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
* directory. */
@ -197,11 +251,11 @@ readdir (DIR * dirp)
else
{
/* 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. */
FindClose ((HANDLE)dirp->dd_handle);
dirp->dd_handle = -1;
dirp->dd_handle = INVALID_HANDLE_VALUE;
dirp->dd_stat = -1;
}
else
@ -214,9 +268,17 @@ readdir (DIR * dirp)
if (dirp->dd_stat > 0)
{
/* Successfully got an entry. Everything about the file is
* already appropriately filled in except the length of the
* file name. */
/* Successfully got an entry */
#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);
return &dirp->dd_dir;
}
@ -231,7 +293,7 @@ readdir (DIR * dirp)
* Frees up resources allocated by opendir.
*/
int
closedir (DIR * dirp)
vlc_closedir (DIR * dirp)
{
int rc;
@ -244,7 +306,7 @@ closedir (DIR * dirp)
return -1;
}
if (dirp->dd_handle != -1)
if (dirp->dd_handle != INVALID_HANDLE_VALUE)
{
rc = FindClose ((HANDLE)dirp->dd_handle);
}
@ -262,7 +324,7 @@ closedir (DIR * dirp)
* and then reset things like an opendir.
*/
void
rewinddir (DIR * dirp)
vlc_rewinddir (DIR * dirp)
{
errno = 0;
@ -272,12 +334,12 @@ rewinddir (DIR * dirp)
return;
}
if (dirp->dd_handle != -1)
if (dirp->dd_handle != INVALID_HANDLE_VALUE)
{
FindClose ((HANDLE)dirp->dd_handle);
}
dirp->dd_handle = -1;
dirp->dd_handle = INVALID_HANDLE_VALUE;
dirp->dd_stat = 0;
}
@ -288,7 +350,7 @@ rewinddir (DIR * dirp)
* seekdir to go back to an old entry. We simply return the value in stat.
*/
long
telldir (DIR * dirp)
vlc_telldir (DIR * dirp)
{
errno = 0;
@ -310,7 +372,7 @@ telldir (DIR * dirp)
* any such system.
*/
void
seekdir (DIR * dirp, long lPos)
vlc_seekdir (DIR * dirp, long lPos)
{
errno = 0;
@ -329,19 +391,19 @@ seekdir (DIR * dirp, long lPos)
else if (lPos == -1)
{
/* Seek past end. */
if (dirp->dd_handle != -1)
if (dirp->dd_handle != INVALID_HANDLE_VALUE)
{
FindClose ((HANDLE)dirp->dd_handle);
}
dirp->dd_handle = -1;
dirp->dd_handle = INVALID_HANDLE_VALUE;
dirp->dd_stat = -1;
}
else
{
/* 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))
;
}
}

View File

@ -33,8 +33,6 @@
#ifdef HAVE_DIRENT_H
# include <dirent.h>
#else
# include "../extras/dirent.h"
#endif
#include <ctype.h>
@ -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 );
j++)
{
#ifdef HAVE_DIRENT_H
d = opendir( j < 0 ? f_dir : *subdirs );
if( d )
{
@ -378,7 +375,6 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
}
closedir( d );
}
#endif
if( j >= 0 ) free( *subdirs++ );
}