/// Wrapper around FromWide, to avoid the need to call free() static inline std::string sFromWide( const std::wstring &rWide ) { char *s = FromWide( rWide.c_str() ); std::string res = s; free( s ); return res; }
// FIXME: could become a skins2 OS factory function or a vlc core function std::string ThemeLoader::getTmpDir( ) { #if defined( _WIN32 ) wchar_t *tmpdir = _wtempnam( NULL, L"vlt" ); if( tmpdir == NULL ) return ""; char* utf8 = FromWide( tmpdir ); free( tmpdir ); std::string tempPath( utf8 ? utf8 : "" ); free( utf8 ); return tempPath; #elif defined( __OS2__ ) char *tmpdir = tempnam( NULL, "vlt" ); if( tmpdir == NULL ) return ""; std::string tempPath( sFromLocale( tmpdir )); free( tmpdir ); return tempPath; #else char templ[] = "/tmp/vltXXXXXX"; char *tmpdir = mkdtemp( templ ); return std::string( tmpdir ? tmpdir : ""); #endif }
static char *config_GetShellDir (int csidl) { wchar_t wdir[MAX_PATH]; if (SHGetFolderPathW (NULL, csidl | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, wdir ) == S_OK) return FromWide (wdir); return NULL; }
static char* GetWindowsFontPath() { wchar_t wdir[MAX_PATH]; if( S_OK != SHGetFolderPathW( NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, wdir ) ) { GetWindowsDirectoryW( wdir, MAX_PATH ); wcscat( wdir, L"\\fonts" ); } return FromWide( wdir ); }
char *vlc_getcwd (void) { wchar_t *wdir = _wgetcwd (NULL, 0); if (wdir == NULL) return NULL; char *dir = FromWide (wdir); free (wdir); return dir; }
/** * It describes our Direct3D object */ static char *DxDescribe(directx_sys_t *dx_sys) { static const struct { unsigned id; char name[32]; } vendors [] = { { 0x1002, "ATI" }, { 0x10DE, "NVIDIA" }, { 0x1106, "VIA" }, { 0x8086, "Intel" }, { 0x5333, "S3 Graphics" }, { 0, "" } }; IDXGIDevice *pDXGIDevice = NULL; HRESULT hr = ID3D11Device_QueryInterface( (ID3D11Device*) dx_sys->d3ddev, &IID_IDXGIDevice, (void **)&pDXGIDevice); if (FAILED(hr)) { return NULL; } IDXGIAdapter *p_adapter; hr = IDXGIDevice_GetAdapter(pDXGIDevice, &p_adapter); if (FAILED(hr)) { IDXGIDevice_Release(pDXGIDevice); return NULL; } DXGI_ADAPTER_DESC adapterDesc; if (SUCCEEDED(IDXGIAdapter_GetDesc(p_adapter, &adapterDesc))) { const char *vendor = "Unknown"; for (int i = 0; vendors[i].id != 0; i++) { if (vendors[i].id == adapterDesc.VendorId) { vendor = vendors[i].name; break; } } char *description; if (asprintf(&description, "D3D11VA (%s, vendor %u(%s), device %u, revision %u)", FromWide(adapterDesc.Description), adapterDesc.VendorId, vendor, adapterDesc.DeviceId, adapterDesc.Revision) < 0) return NULL; IDXGIAdapter_Release(p_adapter); IDXGIDevice_Release(pDXGIDevice); return description; } IDXGIAdapter_Release(p_adapter); IDXGIDevice_Release(pDXGIDevice); return NULL; }
char *vlc_getcwd (void) { #ifndef UNDER_CE wchar_t *wdir = _wgetcwd (NULL, 0); if (wdir == NULL) return NULL; char *dir = FromWide (wdir); free (wdir); return dir; #else return NULL; #endif }
static char *config_GetShellDir (int csidl) { wchar_t wdir[MAX_PATH]; #if defined (UNDER_CE) /*There are some errors in cegcc headers*/ #undef SHGetSpecialFolderPath BOOL WINAPI SHGetSpecialFolderPath(HWND,LPWSTR,int,BOOL); if (SHGetSpecialFolderPath (NULL, wdir, CSIDL_APPDATA, 1)) #else if (SHGetFolderPathW (NULL, csidl | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, wdir ) == S_OK) #endif return FromWide (wdir); return NULL; }
char *config_GetLibDir (void) { /* Get our full path */ MEMORY_BASIC_INFORMATION mbi; if (!VirtualQuery (config_GetLibDir, &mbi, sizeof(mbi))) goto error; wchar_t wpath[MAX_PATH]; if (!GetModuleFileName ((HMODULE) mbi.AllocationBase, wpath, MAX_PATH)) goto error; wchar_t *file = wcsrchr (wpath, L'\\'); if (file == NULL) goto error; *file = L'\0'; return FromWide (wpath); error: abort (); }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int argc; /* VLC does not change the thread locale, so gettext/libintil will use the * user default locale as reference. */ /* gettext versions 0.18-0.18.1 will use the Windows Vista locale name * if the GETTEXT_MUI environment variable is set. If not set or if running * on Windows 2000/XP/2003 an hard-coded language ID list is used. This * putenv() call may become redundant with later versions of gettext. */ putenv("GETTEXT_MUI=1"); #ifdef TOP_BUILDDIR putenv("VLC_PLUGIN_PATH=Z:"TOP_BUILDDIR"/modules"); putenv("VLC_DATA_PATH=Z:"TOP_SRCDIR"/share"); #endif SetErrorMode(SEM_FAILCRITICALERRORS); HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); /* SetProcessDEPPolicy */ HINSTANCE h_Kernel32 = LoadLibraryW(L"kernel32.dll"); if(h_Kernel32) { BOOL (WINAPI * mySetProcessDEPPolicy)( DWORD dwFlags); BOOL (WINAPI * mySetDllDirectoryA)(const char* lpPathName); # define PROCESS_DEP_ENABLE 1 mySetProcessDEPPolicy = (BOOL WINAPI (*)(DWORD)) GetProcAddress(h_Kernel32, "SetProcessDEPPolicy"); if(mySetProcessDEPPolicy) mySetProcessDEPPolicy(PROCESS_DEP_ENABLE); /* Do NOT load any library from cwd. */ mySetDllDirectoryA = (BOOL WINAPI (*)(const char*)) GetProcAddress(h_Kernel32, "SetDllDirectoryA"); if(mySetDllDirectoryA) mySetDllDirectoryA(""); FreeLibrary(h_Kernel32); } /* Args */ wchar_t **wargv = CommandLineToArgvW (GetCommandLine (), &argc); if (wargv == NULL) return 1; char *argv[argc + 4]; BOOL crash_handling = TRUE; int j = 0; char *lang = NULL; argv[j++] = FromWide( L"--media-library" ); argv[j++] = FromWide( L"--stats" ); argv[j++] = FromWide( L"--no-ignore-config" ); for (int i = 1; i < argc; i++) { if(!wcscmp(wargv[i], L"--no-crashdump")) { crash_handling = FALSE; continue; /* don't give argument to libvlc */ } if (!wcsncmp(wargv[i], L"--language", 10) ) { if (i < argc - 1 && wcsncmp( wargv[i + 1], L"--", 2 )) lang = FromWide (wargv[++i]); continue; } argv[j++] = FromWide (wargv[i]); } argc = j; argv[argc] = NULL; LocalFree (wargv); if(crash_handling) { static wchar_t path[MAX_PATH]; if( S_OK != SHGetFolderPathW( NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, path ) ) fprintf( stderr, "Can't open the vlc conf PATH\n" ); _snwprintf( path+wcslen( path ), MAX_PATH, L"%s", L"\\vlc\\crashdump" ); crashdump_path = &path[0]; check_crashdump(); SetUnhandledExceptionFilter(vlc_exception_filter); } _setmode( STDIN_FILENO, _O_BINARY ); /* Needed for pipes */ /* */ if (!lang) { HKEY h_key; if( RegOpenKeyEx( HKEY_CURRENT_USER, TEXT("Software\\VideoLAN\\VLC\\"), 0, KEY_READ, &h_key ) == ERROR_SUCCESS ) { TCHAR szData[256]; DWORD len = 256; if( RegQueryValueEx( h_key, TEXT("Lang"), NULL, NULL, (LPBYTE) &szData, &len ) == ERROR_SUCCESS ) lang = FromWide( szData ); } } if (lang && strncmp( lang, "auto", 4 ) ) { char tmp[11]; snprintf(tmp, 11, "LANG=%s", lang); putenv(tmp); } free(lang); /* Initialize libvlc */ libvlc_instance_t *vlc; vlc = libvlc_new (argc, (const char **)argv); if (vlc != NULL) { libvlc_set_app_id (vlc, "org.VideoLAN.VLC", PACKAGE_VERSION, PACKAGE_NAME); libvlc_set_user_agent (vlc, "VLC media player", "VLC/"PACKAGE_VERSION); libvlc_add_intf (vlc, "hotkeys,none"); libvlc_add_intf (vlc, "globalhotkeys,none"); libvlc_add_intf (vlc, NULL); libvlc_playlist_play (vlc, -1, 0, NULL); libvlc_wait (vlc); libvlc_release (vlc); } else MessageBox (NULL, TEXT("VLC media player could not start.\n" "Either the command line options were invalid or no plugins were found.\n"), TEXT("VLC media player"), MB_OK|MB_ICONERROR); for (int i = 0; i < argc; i++) free (argv[i]); (void)hInstance; (void)hPrevInstance; (void)lpCmdLine; (void)nCmdShow; return 0; }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int argc; /* VLC does not change the thread locale, so gettext/libintil will use the * user default locale as reference. */ /* gettext versions 0.18-0.18.1 will use the Windows Vista locale name * if the GETTEXT_MUI environment variable is set. If not set or if running * on Windows 2000/XP/2003 an hard-coded language ID list is used. This * putenv() call may become redundant with later versions of gettext. */ putenv("GETTEXT_MUI=1"); #ifdef TOP_BUILDDIR putenv("VLC_PLUGIN_PATH=Z:"TOP_BUILDDIR"/modules"); putenv("VLC_DATA_PATH=Z:"TOP_SRCDIR"/share"); #endif HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); /* SetProcessDEPPolicy */ HINSTANCE h_Kernel32 = LoadLibraryW(L"kernel32.dll"); if(h_Kernel32) { BOOL (WINAPI * mySetProcessDEPPolicy)( DWORD dwFlags); BOOL (WINAPI * mySetDllDirectoryA)(const char* lpPathName); # define PROCESS_DEP_ENABLE 1 mySetProcessDEPPolicy = (BOOL WINAPI (*)(DWORD)) GetProcAddress(h_Kernel32, "SetProcessDEPPolicy"); if(mySetProcessDEPPolicy) mySetProcessDEPPolicy(PROCESS_DEP_ENABLE); /* Do NOT load any library from cwd. */ mySetDllDirectoryA = (BOOL WINAPI (*)(const char*)) GetProcAddress(h_Kernel32, "SetDllDirectoryA"); if(mySetDllDirectoryA) mySetDllDirectoryA(""); FreeLibrary(h_Kernel32); } /* Args */ wchar_t **wargv = CommandLineToArgvW (GetCommandLine (), &argc); if (wargv == NULL) return 1; char *argv[argc + 3]; BOOL crash_handling = TRUE; int j = 0; argv[j++] = FromWide( L"--media-library" ); argv[j++] = FromWide( L"--no-ignore-config" ); for (int i = 1; i < argc; i++) { if(!wcscmp(wargv[i], L"--no-crashdump")) { crash_handling = FALSE; continue; /* don't give argument to libvlc */ } argv[j++] = FromWide (wargv[i]); } argc = j; argv[argc] = NULL; LocalFree (wargv); if(crash_handling) { static wchar_t path[MAX_PATH]; if( S_OK != SHGetFolderPathW( NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, path ) ) fprintf( stderr, "Can't open the vlc conf PATH\n" ); _snwprintf( path+wcslen( path ), MAX_PATH, L"%s", L"\\vlc\\crashdump" ); crashdump_path = &path[0]; check_crashdump(); SetUnhandledExceptionFilter(vlc_exception_filter); } _setmode( STDIN_FILENO, _O_BINARY ); /* Needed for pipes */ /* Initialize libvlc */ libvlc_instance_t *vlc; vlc = libvlc_new (argc, (const char **)argv); if (vlc != NULL) { libvlc_set_user_agent (vlc, "VLC media player", "VLC/"PACKAGE_VERSION); libvlc_add_intf (vlc, "hotkeys,none"); libvlc_add_intf (vlc, "globalhotkeys,none"); libvlc_add_intf (vlc, NULL); libvlc_playlist_play (vlc, -1, 0, NULL); libvlc_wait (vlc); libvlc_release (vlc); } for (int i = 0; i < argc; i++) free (argv[i]); (void)hInstance; (void)hPrevInstance; (void)lpCmdLine; (void)nCmdShow; return 0; }
/** * This function will return the default directory used for snapshots */ static char *VoutSnapshotGetDefaultDirectory( vout_thread_t *p_vout ) { char *psz_path = NULL; #if defined(__APPLE__) || defined(SYS_BEOS) if( asprintf( &psz_path, "%s/Desktop", config_GetHomeDir() ) == -1 ) psz_path = NULL; #elif defined(WIN32) && !defined(UNDER_CE) /* Get the My Pictures folder path */ char *p_mypicturesdir = NULL; typedef HRESULT (WINAPI *SHGETFOLDERPATH)( HWND, int, HANDLE, DWORD, LPWSTR ); #ifndef CSIDL_FLAG_CREATE # define CSIDL_FLAG_CREATE 0x8000 #endif #ifndef CSIDL_MYPICTURES # define CSIDL_MYPICTURES 0x27 #endif #ifndef SHGFP_TYPE_CURRENT # define SHGFP_TYPE_CURRENT 0 #endif HINSTANCE shfolder_dll; SHGETFOLDERPATH SHGetFolderPath ; /* load the shfolder dll to retrieve SHGetFolderPath */ if( ( shfolder_dll = LoadLibrary( _T("SHFolder.dll") ) ) != NULL ) { wchar_t wdir[PATH_MAX]; SHGetFolderPath = (void *)GetProcAddress( shfolder_dll, _T("SHGetFolderPathW") ); if ((SHGetFolderPath != NULL ) && SUCCEEDED (SHGetFolderPath (NULL, CSIDL_MYPICTURES | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, wdir))) p_mypicturesdir = FromWide (wdir); FreeLibrary( shfolder_dll ); } if( p_mypicturesdir == NULL ) psz_path = strdup( config_GetHomeDir() ); else psz_path = p_mypicturesdir; #else /* XXX: This saves in the data directory. Shouldn't we try saving * to psz_homedir/Desktop or something nicer ? */ char *psz_datadir = config_GetUserDataDir(); if( psz_datadir ) { if( asprintf( &psz_path, "%s", psz_datadir ) == -1 ) psz_path = NULL; free( psz_datadir ); } #endif return psz_path; }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, #ifndef UNDER_CE LPSTR lpCmdLine, #else LPWSTR lpCmdLine, #endif int nCmdShow ) { int argc; #ifndef UNDER_CE HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); HINSTANCE h_Kernel32 = LoadLibraryW(L"kernel32.dll"); if(h_Kernel32) { BOOL (WINAPI * mySetProcessDEPPolicy)( DWORD dwFlags); BOOL (WINAPI * mySetDllDirectoryA)(const char* lpPathName); # define PROCESS_DEP_ENABLE 1 mySetProcessDEPPolicy = (BOOL WINAPI (*)(DWORD)) GetProcAddress(h_Kernel32, "SetProcessDEPPolicy"); if(mySetProcessDEPPolicy) mySetProcessDEPPolicy(PROCESS_DEP_ENABLE); /* Do NOT load any library from cwd. */ mySetDllDirectoryA = (BOOL WINAPI (*)(const char*)) GetProcAddress(h_Kernel32, "SetDllDirectoryA"); if(mySetDllDirectoryA) mySetDllDirectoryA(""); FreeLibrary(h_Kernel32); } wchar_t **wargv = CommandLineToArgvW (GetCommandLine (), &argc); if (wargv == NULL) return 1; char *argv[argc + 1]; BOOL crash_handling = TRUE; int j = 0; argv[j++] = FromWide( L"--no-ignore-config" ); for (int i = 1; i < argc; i++) { if(!wcscmp(wargv[i], L"--no-crashdump")) { crash_handling = FALSE; } else { argv[j] = FromWide (wargv[i]); j++; } } argc = j; argv[argc] = NULL; LocalFree (wargv); # ifndef _WIN64 if(crash_handling) { check_crashdump(); SetUnhandledExceptionFilter(vlc_exception_filter); } # endif /* WIN64 */ #else char **argv, psz_cmdline[wcslen(lpCmdLine) * 4]; WideCharToMultiByte( CP_UTF8, 0, lpCmdLine, -1, psz_cmdline, sizeof (psz_cmdline), NULL, NULL ); argc = parse_cmdline (psz_cmdline, &argv); #endif /* Initialize libvlc */ libvlc_instance_t *vlc; vlc = libvlc_new (argc, (const char **)argv); if (vlc != NULL) { libvlc_add_intf (vlc, "globalhotkeys,none"); libvlc_add_intf (vlc, NULL); libvlc_playlist_play (vlc, -1, 0, NULL); libvlc_wait (vlc); libvlc_release (vlc); } for (int i = 0; i < argc; i++) free (argv[i]); (void)hInstance; (void)hPrevInstance; (void)lpCmdLine; (void)nCmdShow; return 0; }
/***************************************************************************** * DirRead: *****************************************************************************/ static int DirRead (stream_t *p_access, input_item_node_t *p_node ) { access_sys_t *p_sys = p_access->p_sys; int i_ret = VLC_SUCCESS; struct vlc_readdir_helper rdh; vlc_readdir_helper_init( &rdh, p_access, p_node ); #ifndef _WIN32 struct smbc_dirent *p_entry; while( i_ret == VLC_SUCCESS && ( p_entry = smbc_readdir( p_sys->i_smb ) ) ) { char *psz_uri; const char *psz_server = p_sys->url.psz_host; const char *psz_path = p_sys->url.psz_path; const char *psz_name = p_entry->name; int i_type; switch( p_entry->smbc_type ) { case SMBC_SERVER: case SMBC_WORKGROUP: psz_server = p_sys->url.psz_host; psz_path = NULL; psz_name = NULL; case SMBC_FILE_SHARE: case SMBC_DIR: i_type = ITEM_TYPE_DIRECTORY; break; case SMBC_FILE: i_type = ITEM_TYPE_FILE; break; default: case SMBC_PRINTER_SHARE: case SMBC_COMMS_SHARE: case SMBC_IPC_SHARE: case SMBC_LINK: continue; } char *psz_encoded_name = NULL; if( psz_name != NULL && ( psz_encoded_name = vlc_uri_encode( psz_name ) ) == NULL ) { i_ret = VLC_ENOMEM; break; } if( smb_get_uri( p_access, &psz_uri, NULL, NULL, NULL, psz_server, psz_path, psz_encoded_name ) < 0 ) { free(psz_encoded_name); i_ret = VLC_ENOMEM; break; } free(psz_encoded_name); i_ret = vlc_readdir_helper_additem( &rdh, psz_uri, NULL, p_entry->name, i_type, ITEM_NET ); free( psz_uri ); } #else // Handle share listing from here. Directory browsing is handled by the // usual filesystem module. SHARE_INFO_1 *p_info; DWORD i_share_enum_res; DWORD i_nb_elem; DWORD i_resume_handle = 0; DWORD i_total_elements; // Unused, but needs to be passed wchar_t *wpsz_host = ToWide( p_sys->url.psz_host ); if( wpsz_host == NULL ) return VLC_ENOMEM; do { i_share_enum_res = NetShareEnum( wpsz_host, 1, (LPBYTE*)&p_info, MAX_PREFERRED_LENGTH, &i_nb_elem, &i_total_elements, &i_resume_handle ); if( i_share_enum_res == ERROR_SUCCESS || i_share_enum_res == ERROR_MORE_DATA ) { for ( DWORD i = 0; i < i_nb_elem; ++i ) { SHARE_INFO_1 *p_current = p_info + i; if( p_current->shi1_type & STYPE_SPECIAL ) continue; char* psz_name = FromWide( p_current->shi1_netname ); if( psz_name == NULL ) { i_ret = VLC_ENOMEM; break; } char* psz_path; if( smb_get_uri( p_access, &psz_path, NULL, NULL, NULL, p_sys->url.psz_host, p_sys->url.psz_path, psz_name ) < 0 ) { free( psz_name ); i_ret = VLC_ENOMEM; break; } free( psz_name ); // We need to concatenate the scheme before, as the window version // of smb_get_uri generates a path (and the other call site needs // a path). The path is already prefixed by "//" so we just need // to add "file:" char* psz_uri; if( asprintf( &psz_uri, "file:%s", psz_path ) < 0 ) { free( psz_path ); i_ret = VLC_ENOMEM; break; } free( psz_path ); i_ret = vlc_readdir_helper_additem( &rdh, psz_uri, NULL, psz_name, ITEM_TYPE_DIRECTORY, ITEM_NET ); free( psz_uri ); } } NetApiBufferFree( p_info ); } while( i_share_enum_res == ERROR_MORE_DATA && i_ret == VLC_SUCCESS ); free( wpsz_host ); #endif vlc_readdir_helper_finish( &rdh, i_ret == VLC_SUCCESS ); return i_ret; }
static int DirRead(stream_t *p_access, input_item_node_t *p_node) { access_sys_t *p_sys = p_access->p_sys; int i_ret = VLC_SUCCESS; struct vlc_readdir_helper rdh; vlc_readdir_helper_init( &rdh, p_access, p_node ); // Handle share listing from here. Directory browsing is handled by the // usual filesystem module. SHARE_INFO_1 *p_info; DWORD i_share_enum_res; DWORD i_nb_elem; DWORD i_resume_handle = 0; DWORD i_total_elements; // Unused, but needs to be passed wchar_t *wpsz_host = ToWide( p_sys->url.psz_host ); if( wpsz_host == NULL ) return VLC_ENOMEM; do { i_share_enum_res = NetShareEnum( wpsz_host, 1, (LPBYTE*)&p_info, MAX_PREFERRED_LENGTH, &i_nb_elem, &i_total_elements, &i_resume_handle ); if( i_share_enum_res == ERROR_SUCCESS || i_share_enum_res == ERROR_MORE_DATA ) { for ( DWORD i = 0; i < i_nb_elem; ++i ) { SHARE_INFO_1 *p_current = p_info + i; if( p_current->shi1_type & STYPE_SPECIAL ) continue; char* psz_name = FromWide( p_current->shi1_netname ); if( psz_name == NULL ) { i_ret = VLC_ENOMEM; break; } char* psz_path; if( smb_get_uri( p_access, &psz_path, NULL, NULL, NULL, p_sys->url.psz_host, p_sys->url.psz_path, psz_name ) < 0 ) { free( psz_name ); i_ret = VLC_ENOMEM; break; } // We need to concatenate the scheme before, as the window version // of smb_get_uri generates a path (and the other call site needs // a path). The path is already prefixed by "//" so we just need // to add "file:" char* psz_uri; if( asprintf( &psz_uri, "file:%s", psz_path ) < 0 ) { free( psz_name ); free( psz_path ); i_ret = VLC_ENOMEM; break; } free( psz_path ); i_ret = vlc_readdir_helper_additem( &rdh, psz_uri, NULL, psz_name, ITEM_TYPE_DIRECTORY, ITEM_NET ); free( psz_name ); free( psz_uri ); } } NetApiBufferFree( p_info ); } while( i_share_enum_res == ERROR_MORE_DATA && i_ret == VLC_SUCCESS ); free( wpsz_host ); vlc_readdir_helper_finish( &rdh, i_ret == VLC_SUCCESS ); return i_ret; }