Moved wine_get_unix_file_name implementation to ntdll, and changed it

to return an allocated buffer instead of a fixed size one.
This commit is contained in:
Alexandre Julliard 2004-04-14 19:40:53 +00:00
parent ac05d0dd29
commit 1cb0cf4ced
11 changed files with 75 additions and 56 deletions

View File

@ -851,13 +851,16 @@ INT WineEngAddFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv)
{
if (ft_handle) /* do it only if we have freetype up and running */
{
char unixname[MAX_PATH];
char *unixname;
if(flags)
FIXME("Ignoring flags %lx\n", flags);
if(wine_get_unix_file_name(file, unixname, sizeof(unixname)))
if((unixname = wine_get_unix_file_name(file)))
{
AddFontFileToList(unixname, NULL, FALSE);
HeapFree(GetProcessHeap(), 0, unixname);
}
}
return 1;
}
@ -884,7 +887,7 @@ BOOL WineEngInit(void)
DWORD valuelen, datalen, i = 0, type, dlen, vlen;
LPVOID data;
WCHAR windowsdir[MAX_PATH];
char unixname[MAX_PATH];
char *unixname;
HANDLE font_mutex;
TRACE("\n");
@ -958,8 +961,11 @@ BOOL WineEngInit(void)
/* load in the fonts from %WINDOWSDIR%\\Fonts first of all */
GetWindowsDirectoryW(windowsdir, sizeof(windowsdir) / sizeof(WCHAR));
strcatW(windowsdir, fontsW);
if(wine_get_unix_file_name(windowsdir, unixname, sizeof(unixname)))
if((unixname = wine_get_unix_file_name(windowsdir)))
{
ReadFontDir(unixname, FALSE);
HeapFree(GetProcessHeap(), 0, unixname);
}
/* now look under HKLM\Software\Microsoft\Windows[ NT]\CurrentVersion\Fonts
for any fonts not installed in %WINDOWSDIR%\Fonts. They will have their
@ -981,8 +987,11 @@ BOOL WineEngInit(void)
while(RegEnumValueW(hkey, i++, valueW, &vlen, NULL, &type, data,
&dlen) == ERROR_SUCCESS) {
if(((LPWSTR)data)[0] && ((LPWSTR)data)[1] == ':')
if(wine_get_unix_file_name((LPWSTR)data, unixname, sizeof(unixname)))
if((unixname = wine_get_unix_file_name((LPWSTR)data)))
{
AddFontFileToList(unixname, NULL, FALSE);
HeapFree(GetProcessHeap(), 0, unixname);
}
/* reset dlen and vlen */
dlen = datalen;
vlen = valuelen;

View File

@ -511,7 +511,7 @@ static int CreateSpoolFile(LPCSTR pszOutput)
}
else
{
char buffer[MAX_PATH];
char *buffer;
WCHAR psCmdPW[MAX_PATH];
TRACE("Just assume it's a file\n");
@ -521,12 +521,14 @@ static int CreateSpoolFile(LPCSTR pszOutput)
* Unix correspondant file name
*/
MultiByteToWideChar(CP_ACP, 0, psCmdP, -1, psCmdPW, MAX_PATH);
wine_get_unix_file_name(psCmdPW, buffer, sizeof(buffer));
if ((fd = open(buffer, O_CREAT | O_TRUNC | O_WRONLY , 0600)) < 0)
if ((buffer = wine_get_unix_file_name(psCmdPW)))
{
ERR("Failed to create spool file '%s' ('%s'). (error %s)\n",
buffer, psCmdP, strerror(errno));
if ((fd = open(buffer, O_CREAT | O_TRUNC | O_WRONLY , 0600)) < 0)
{
ERR("Failed to create spool file '%s' ('%s'). (error %s)\n",
buffer, psCmdP, strerror(errno));
}
HeapFree(GetProcessHeap(), 0, buffer);
}
}
return fd;

View File

@ -1154,7 +1154,7 @@
@ varargs __wine_call_from_16_regs()
# Unix files
@ stdcall wine_get_unix_file_name(wstr ptr long)
@ cdecl wine_get_unix_file_name(wstr) ntdll.wine_get_unix_file_name
# Init code
@ cdecl __wine_kernel_init()

View File

@ -893,13 +893,13 @@ void __wine_kernel_init(void)
ExitProcess(1);
case BINARY_UNIX_LIB:
{
DOS_FULL_NAME full_name;
char *unix_name;
TRACE( "starting Winelib app %s\n", debugstr_w(main_exe_name) );
CloseHandle( main_exe_file );
main_exe_file = 0;
if (DOSFS_GetFullName( main_exe_name, TRUE, &full_name ) &&
wine_dlopen( full_name.long_name, RTLD_NOW, error, sizeof(error) ))
if ((unix_name = wine_get_unix_file_name( main_exe_name )) &&
wine_dlopen( unix_name, RTLD_NOW, error, sizeof(error) ))
{
static const WCHAR soW[] = {'.','s','o',0};
if ((p = strrchrW( main_exe_name, '.' )) && !strcmpW( p, soW ))
@ -908,6 +908,7 @@ void __wine_kernel_init(void)
/* update the unicode string */
RtlInitUnicodeString( &peb->ProcessParameters->ImagePathName, main_exe_name );
}
HeapFree( GetProcessHeap(), 0, unix_name );
goto found;
}
MESSAGE( "wine: could not load %s: %s\n", debugstr_w(main_exe_name), error );
@ -1606,8 +1607,7 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB
{
BOOL retv = FALSE;
HANDLE hFile = 0;
const char *unixdir = NULL;
DOS_FULL_NAME full_dir;
char *unixdir = NULL;
WCHAR name[MAX_PATH];
WCHAR *tidy_cmdline, *p, *envW = env;
@ -1629,15 +1629,12 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB
if (cur_dir)
{
if (DOSFS_GetFullName( cur_dir, TRUE, &full_dir )) unixdir = full_dir.long_name;
unixdir = wine_get_unix_file_name( cur_dir );
}
else
{
WCHAR buf[MAX_PATH];
if (GetCurrentDirectoryW(MAX_PATH, buf))
{
if (DOSFS_GetFullName( buf, TRUE, &full_dir )) unixdir = full_dir.long_name;
}
if (GetCurrentDirectoryW(MAX_PATH, buf)) unixdir = wine_get_unix_file_name( buf );
}
if (env && !(flags & CREATE_UNICODE_ENVIRONMENT)) /* convert environment to unicode */
@ -1715,12 +1712,15 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB
case BINARY_UNIX_EXE:
{
/* unknown file, try as unix executable */
DOS_FULL_NAME full_name;
char *unix_name;
TRACE( "starting %s as Unix binary\n", debugstr_w(name) );
if (DOSFS_GetFullName( name, TRUE, &full_name ))
retv = (fork_and_exec( full_name.long_name, tidy_cmdline, envW, unixdir ) != -1);
if ((unix_name = wine_get_unix_file_name( name )))
{
retv = (fork_and_exec( unix_name, tidy_cmdline, envW, unixdir ) != -1);
HeapFree( GetProcessHeap(), 0, unix_name );
}
}
break;
}
@ -1729,6 +1729,7 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB
done:
if (tidy_cmdline != cmd_line) HeapFree( GetProcessHeap(), 0, tidy_cmdline );
if (envW != env) HeapFree( GetProcessHeap(), 0, envW );
if (unixdir) HeapFree( GetProcessHeap(), 0, unixdir );
return retv;
}

View File

@ -915,6 +915,26 @@ done:
}
/***********************************************************************
* wine_get_unix_file_name (NTDLL.@) Not a Windows API
*
* Return the full Unix file name for a given path.
* Returned buffer must be freed by caller.
*/
char *wine_get_unix_file_name( LPCWSTR dosW )
{
UNICODE_STRING nt_name;
ANSI_STRING unix_name;
NTSTATUS status;
if (!RtlDosPathNameToNtPathName_U( dosW, &nt_name, NULL, NULL )) return NULL;
status = DIR_nt_to_unix( &nt_name, &unix_name, FALSE, FALSE );
RtlFreeUnicodeString( &nt_name );
if (status) return NULL;
return unix_name.Buffer;
}
/******************************************************************
* RtlDoesFileExists_U (NTDLL.@)
*/

View File

@ -1123,6 +1123,9 @@
# signal handling
@ cdecl __wine_set_signal_handler(long ptr)
# Filesystem
@ cdecl wine_get_unix_file_name(wstr)
################################################################
# Wine dll separation hacks, these will go away, don't use them
#

View File

@ -478,10 +478,13 @@ DOSCONF *DOSCONF_GetConfig(void)
if ((filename[0] != '*' || filename[1] != '\0') && *filename != '\0')
{
CHAR fullname[MAX_PATH];
char *fullname;
if (wine_get_unix_file_name(filename, fullname, sizeof(fullname)))
if ((fullname = wine_get_unix_file_name(filename)))
{
DOSCONF_fd = fopen(fullname, "r");
HeapFree( GetProcessHeap(), 0, fullname );
}
if (DOSCONF_fd)
{

View File

@ -848,26 +848,6 @@ BOOL DOSFS_GetFullName( LPCWSTR name, BOOL check_last, DOS_FULL_NAME *full )
}
/***********************************************************************
* wine_get_unix_file_name (KERNEL32.@) Not a Windows API
*
* Return the full Unix file name for a given path.
*/
BOOL WINAPI wine_get_unix_file_name( LPCWSTR dosW, LPSTR buffer, DWORD len )
{
BOOL ret;
DOS_FULL_NAME path;
ret = DOSFS_GetFullName( dosW, FALSE, &path );
if (ret && len)
{
strncpy( buffer, path.long_name, len );
buffer[len - 1] = 0; /* ensure 0 termination */
}
return ret;
}
/***********************************************************************
* MulDiv (KERNEL32.@)
* RETURNS

View File

@ -1988,7 +1988,7 @@ VOID WINAPI _LeaveSysLevel(SYSLEVEL*);
/* Wine internal functions */
BOOL WINAPI wine_get_unix_file_name( LPCWSTR dos, LPSTR buffer, DWORD len );
extern char *wine_get_unix_file_name( LPCWSTR dos );
/* a few optimizations for i386/gcc */

View File

@ -326,13 +326,9 @@ static BOOL ExtractFromEXEDLL(const char *szFileName, int nIndex, const char *sz
inline static char *get_unix_file_name( const char *dos )
{
WCHAR dosW[MAX_PATH];
char buffer[MAX_PATH], *ret;
MultiByteToWideChar(CP_ACP, 0, dos, -1, dosW, MAX_PATH);
if (!wine_get_unix_file_name( dosW, buffer, sizeof(buffer) )) return NULL;
ret = HeapAlloc( GetProcessHeap(), 0, lstrlenA( buffer ) + 1 );
lstrcpyA( ret, buffer );
return ret;
return wine_get_unix_file_name( dosW );
}
static int ExtractFromICO(const char *szFileName, const char *szXPMFileName)

View File

@ -36,7 +36,7 @@ static char *progname;
/* Wine specific functions */
extern BOOL process_init(char *argv[]);
typedef BOOL (WINAPI *wine_get_unix_file_name_t) ( LPCWSTR dos, LPSTR buffer, DWORD len );
typedef LPSTR (*wine_get_unix_file_name_t) ( LPCWSTR dos );
/*
* handle an option
*/
@ -162,10 +162,15 @@ int main(int argc, char *argv[])
}
if (outputformats & UNIXFORMAT) {
WCHAR dosW[MAX_PATH];
char *unix_name;
MultiByteToWideChar(CP_ACP, 0, argv[i], -1, dosW, MAX_PATH);
wine_get_unix_file_name_ptr(dosW, path, sizeof(path));
printf("%s\n", path);
if ((unix_name = wine_get_unix_file_name_ptr(dosW)))
{
printf("%s\n", unix_name);
HeapFree( GetProcessHeap(), 0, unix_name );
}
else printf( "\n" );
}
}