From dffe74e2d2eb9591cc08cf03a97e449d0091cf8b Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Mon, 21 Feb 2005 13:00:20 +0000 Subject: [PATCH] * src/extras/dirent.c, ALL: fixed win32/ce dirent replacement and made it accessible from plugins as well. --- Makefile.am | 1 - include/vlc_common.h | 24 +++ modules/access/directory.c | 3 +- modules/control/http.c | 11 +- modules/demux/mkv.cpp | 2 - modules/gui/skins2/src/theme_loader.cpp | 3 +- modules/gui/skins2/src/theme_repository.cpp | 3 +- modules/gui/wince/wince.h | 4 +- src/extras/dirent.c | 190 +++++++++++++------- src/input/subtitles.c | 4 - 10 files changed, 158 insertions(+), 87 deletions(-) diff --git a/Makefile.am b/Makefile.am index 0f930e6c65..a6d53140c5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -327,7 +327,6 @@ SOURCES_libvlc_win32 = \ SOURCES_libvlc_dirent = \ src/extras/dirent.c \ - src/extras/dirent.h \ $(NULL) SOURCES_libvlc_getopt = \ diff --git a/include/vlc_common.h b/include/vlc_common.h index 65aeab7abd..dfde7ac4f9 100644 --- a/include/vlc_common.h +++ b/include/vlc_common.h @@ -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" diff --git a/modules/access/directory.c b/modules/access/directory.c index 2ec55d5f9a..342df80ff4 100644 --- a/modules/access/directory.c +++ b/modules/access/directory.c @@ -50,8 +50,7 @@ # include #endif -#if (!defined( WIN32 ) || defined(__MINGW32__)) -/* Mingw has its own version of dirent */ +#ifdef HAVE_DIRENT_H # include #endif diff --git a/modules/control/http.c b/modules/control/http.c index bafc5cad39..6118271893 100644 --- a/modules/control/http.c +++ b/modules/control/http.c @@ -57,8 +57,7 @@ # include #endif -#if (!defined( WIN32 ) || defined(__MINGW32__)) -/* Mingw has its own version of dirent */ +#ifdef HAVE_DIRENT_H # include #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 diff --git a/modules/demux/mkv.cpp b/modules/demux/mkv.cpp index 27c04d0386..2cf9c914c8 100644 --- a/modules/demux/mkv.cpp +++ b/modules/demux/mkv.cpp @@ -47,8 +47,6 @@ #ifdef HAVE_DIRENT_H # include -#else -# include "../../src/extras/dirent.h" #endif /* libebml and matroska */ diff --git a/modules/gui/skins2/src/theme_loader.cpp b/modules/gui/skins2/src/theme_loader.cpp index 57ee84f65b..0295a6ddd0 100644 --- a/modules/gui/skins2/src/theme_loader.cpp +++ b/modules/gui/skins2/src/theme_loader.cpp @@ -42,8 +42,7 @@ # include #endif -#if (!defined( WIN32 ) || defined(__MINGW32__)) -/* Mingw has its own version of dirent */ +#ifdef HAVE_DIRENT_H # include #endif diff --git a/modules/gui/skins2/src/theme_repository.cpp b/modules/gui/skins2/src/theme_repository.cpp index b6c3f2898a..a4f2d484f2 100644 --- a/modules/gui/skins2/src/theme_repository.cpp +++ b/modules/gui/skins2/src/theme_repository.cpp @@ -30,8 +30,7 @@ #elif defined( WIN32 ) # include #endif -#if (!defined( WIN32 ) || defined(__MINGW32__)) -/* Mingw has its own version of dirent */ +#ifdef HAVE_DIRENT_H # include #endif diff --git a/modules/gui/wince/wince.h b/modules/gui/wince/wince.h index 072df8c8b9..bd8dd1c8a0 100644 --- a/modules/gui/wince/wince.h +++ b/modules/gui/wince/wince.h @@ -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 diff --git a/src/extras/dirent.c b/src/extras/dirent.c index b70635c2b9..073cc137da 100644 --- a/src/extras/dirent.c +++ b/src/extras/dirent.c @@ -8,7 +8,7 @@ * Updated by Jeremy Bettis * Significantly revised and rewinddir, seekdir and telldir added by Colin * Peters - * + * * $Revision: 1.6 $ * $Author: sam $ * $Date: 2002/11/13 20:51:04 $ @@ -18,6 +18,8 @@ #include "config.h" #include +#include + #ifdef HAVE_ERRNO_H # include #else @@ -33,15 +35,49 @@ #ifndef UNDER_CE # include # include +#else +# define FILENAME_MAX (260) #endif #define WIN32_LEAN_AND_MEAN #include /* for GetFileAttributes */ -#include "dirent.h" +#include +#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; -#define SUFFIX "*" -#define SLASH "\\" + /* given path for dir with search pattern (struct is extended) */ + char dd_name[1]; +} DIR; /* * opendir @@ -50,12 +86,12 @@ * searching a directory. */ DIR * -opendir (const CHAR *szPath) +vlc_opendir (const CHAR *szPath) { DIR *nd; unsigned int rc; CHAR szFullPath[MAX_PATH]; - + errno = 0; if (!szPath) @@ -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 { - /* FIXME: if I wasn't lazy, I'd check for overflows here. */ - sprintf (szFullPath, MAX_PATH, "\\%s", szPath ); + 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, "\\%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,44 +226,59 @@ 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)); - - if (dirp->dd_handle == -1) - { - /* Whoops! Seems there are no files in that - * directory. */ - dirp->dd_stat = -1; - } + dirp->dd_handle = FindFirstFile (dd_name, &(dirp->dd_dta)); + + if (dirp->dd_handle == INVALID_HANDLE_VALUE) + { + /* Whoops! Seems there are no files in that + * directory. */ + dirp->dd_stat = -1; + } else - { - dirp->dd_stat = 1; - } + { + dirp->dd_stat = 1; + } } else { /* Get the next search entry. */ - 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_stat = -1; - } + 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 = INVALID_HANDLE_VALUE; + dirp->dd_stat = -1; + } else - { - /* Update the status to indicate the correct - * number. */ - dirp->dd_stat++; - } + { + /* Update the status to indicate the correct + * number. */ + dirp->dd_stat++; + } } 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) - { - FindClose ((HANDLE)dirp->dd_handle); - } - dirp->dd_handle = -1; + if (dirp->dd_handle != INVALID_HANDLE_VALUE) + { + FindClose ((HANDLE)dirp->dd_handle); + } + 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)) + ; } } diff --git a/src/input/subtitles.c b/src/input/subtitles.c index 310d1de49f..c0e6f7ae72 100644 --- a/src/input/subtitles.c +++ b/src/input/subtitles.c @@ -33,8 +33,6 @@ #ifdef HAVE_DIRENT_H # include -#else -# include "../extras/dirent.h" #endif #include @@ -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++ ); } -- 2.39.2