Module: wine Branch: master Commit: e5030a4ac0a303d6788ae79ffdcd88e66cf78bd2 URL: https://source.winehq.org/git/wine.git/?a=commit;h=e5030a4ac0a303d6788ae79ff...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Apr 27 12:34:07 2020 +0200
ntdll: Avoid using wine_get_config_dir() from libwine.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/directory.c | 7 +--- dlls/ntdll/env.c | 2 +- dlls/ntdll/ntdll_misc.h | 1 + dlls/ntdll/server.c | 101 +++++++++++++++++++++++++++++++++--------------- 4 files changed, 72 insertions(+), 39 deletions(-)
diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c index b8cfe507ed..1adc0c9b0d 100644 --- a/dlls/ntdll/directory.c +++ b/dlls/ntdll/directory.c @@ -106,7 +106,6 @@ #include "ntdll_misc.h" #include "wine/server.h" #include "wine/list.h" -#include "wine/library.h" #include "wine/debug.h" #include "wine/exception.h"
@@ -564,7 +563,6 @@ unsigned int DIR_get_drives_info( struct drive_info info[MAX_DOS_DRIVES] ) RtlEnterCriticalSection( &dir_section ); if (now != last_update) { - const char *config_dir = wine_get_config_dir(); char *buffer, *p; struct stat st; unsigned int i; @@ -1261,7 +1259,7 @@ static DWORD WINAPI init_options( RTL_RUN_ONCE *once, void *param, void **contex NtClose( root );
/* a couple of directories that we don't want to return in directory searches */ - ignore_file( wine_get_config_dir() ); + ignore_file( config_dir ); ignore_file( "/dev" ); ignore_file( "/proc" ); #ifdef linux @@ -2219,7 +2217,6 @@ static unsigned int nb_redirects; static void init_redirects(void) { static const char windows_dir[] = "/dosdevices/c:/windows"; - const char *config_dir = wine_get_config_dir(); char *dir; struct stat st;
@@ -2322,7 +2319,6 @@ void init_directories(void) */ static NTSTATUS get_dos_device( const WCHAR *name, UINT name_len, ANSI_STRING *unix_name_ret ) { - const char *config_dir = wine_get_config_dir(); struct stat st; char *unix_name, *new_name, *dev; unsigned int i; @@ -2747,7 +2743,6 @@ NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRI static const WCHAR invalid_charsW[] = { INVALID_NT_CHARS, 0 };
NTSTATUS status = STATUS_SUCCESS; - const char *config_dir = wine_get_config_dir(); const WCHAR *name, *p; struct stat st; char *unix_name; diff --git a/dlls/ntdll/env.c b/dlls/ntdll/env.c index 6670786def..efb5270a2c 100644 --- a/dlls/ntdll/env.c +++ b/dlls/ntdll/env.c @@ -396,7 +396,7 @@ static void set_wow64_environment( WCHAR **env ) set_wine_path_variable( env, winedatadirW, wine_get_data_dir() ); set_wine_path_variable( env, winehomedirW, getenv("HOME") ); set_wine_path_variable( env, winebuilddirW, wine_get_build_dir() ); - set_wine_path_variable( env, wineconfigdirW, wine_get_config_dir() ); + set_wine_path_variable( env, wineconfigdirW, config_dir ); for (i = 0; (p = wine_dll_enum_load_path( i )); i++) { NTDLL_swprintf( buf, winedlldirW, i ); diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 7dca506aad..11ff0d7bb3 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -104,6 +104,7 @@ extern char **__wine_main_argv; extern WCHAR **__wine_main_wargv;
/* server support */ +extern const char *config_dir DECLSPEC_HIDDEN; extern timeout_t server_start_time DECLSPEC_HIDDEN; extern unsigned int server_cpus DECLSPEC_HIDDEN; extern BOOL is_wow64 DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c index c0dd0f35fc..4beee9e6e1 100644 --- a/dlls/ntdll/server.c +++ b/dlls/ntdll/server.c @@ -34,6 +34,9 @@ #ifdef HAVE_PTHREAD_NP_H # include <pthread_np.h> #endif +#ifdef HAVE_PWD_H +# include <pwd.h> +#endif #include <signal.h> #include <stdarg.h> #include <stdio.h> @@ -110,6 +113,8 @@ static const enum cpu_type client_cpu = CPU_ARM64; #error Unsupported CPU #endif
+const char *config_dir = NULL; + unsigned int server_cpus = 0; BOOL is_wow64 = FALSE;
@@ -171,6 +176,17 @@ static void fatal_perror( const char *err, ... ) exit(1); }
+/* build a path from the specified dir and name */ +static char *build_path( const char *dir, const char *name ) +{ + size_t len = strlen( dir ); + char *ret = malloc( len + strlen( name ) + 2 ); + + memcpy( ret, dir, len ); + if (len && ret[len - 1] != '/') ret[len++] = '/'; + strcpy( ret + len, name ); + return ret; +}
/*********************************************************************** * server_protocol_error @@ -1199,6 +1215,37 @@ static void start_server(void) }
+/*********************************************************************** + * init_config_dir + */ +static const char *init_config_dir(void) +{ + char *p, *dir; + const char *prefix = getenv( "WINEPREFIX" ); + + if (prefix) + { + if (prefix[0] != '/') + fatal_error( "invalid directory %s in WINEPREFIX: not an absolute path\n", prefix ); + dir = strdup( prefix ); + for (p = dir + strlen(dir) - 1; p > dir && *p == '/'; p--) *p = 0; + } + else + { + const char *home = getenv( "HOME" ); + if (!home) + { + struct passwd *pwd = getpwuid( getuid() ); + if (pwd) home = pwd->pw_dir; + } + if (!home) fatal_error( "could not determine your home directory\n" ); + if (home[0] != '/') fatal_error( "your home directory %s is not an absolute path\n", home ); + dir = build_path( home, ".wine" ); + } + return dir; +} + + /*********************************************************************** * setup_config_dir * @@ -1206,46 +1253,38 @@ static void start_server(void) */ static int setup_config_dir(void) { - const char *p, *config_dir = wine_get_config_dir(); + char *p; + struct stat st; int fd_cwd = open( ".", O_RDONLY );
if (chdir( config_dir ) == -1) { - if (errno != ENOENT) fatal_perror( "chdir to %s", config_dir ); - + if (errno != ENOENT) fatal_perror( "cannot use directory %s", config_dir ); if ((p = strrchr( config_dir, '/' )) && p != config_dir) { - struct stat st; - char *tmp_dir; - - if (!(tmp_dir = malloc( p + 1 - config_dir ))) fatal_error( "out of memory\n" ); - memcpy( tmp_dir, config_dir, p - config_dir ); - tmp_dir[p - config_dir] = 0; - if (!stat( tmp_dir, &st ) && st.st_uid != getuid()) + while (p > config_dir + 1 && p[-1] == '/') p--; + *p = 0; + if (!stat( config_dir, &st ) && st.st_uid != getuid()) fatal_error( "'%s' is not owned by you, refusing to create a configuration directory there\n", - tmp_dir ); - free( tmp_dir ); + config_dir ); + *p = '/'; } - mkdir( config_dir, 0777 ); if (chdir( config_dir ) == -1) fatal_perror( "chdir to %s", config_dir ); - MESSAGE( "wine: created the configuration directory '%s'\n", config_dir ); }
- if (mkdir( "dosdevices", 0777 ) == -1) + if (stat( ".", &st ) == -1) fatal_perror( "stat %s", config_dir ); + if (st.st_uid != getuid()) fatal_error( "'%s' is not owned by you\n", config_dir ); + + if (!mkdir( "dosdevices", 0777 )) { - if (errno == EEXIST) goto done; - fatal_perror( "cannot create %s/dosdevices", config_dir ); + mkdir( "drive_c", 0777 ); + symlink( "../drive_c", "dosdevices/c:" ); + symlink( "/", "dosdevices/z:" ); } + else if (errno != EEXIST) fatal_perror( "cannot create %s/dosdevices", config_dir );
- /* create the drive symlinks */ - - mkdir( "drive_c", 0777 ); - symlink( "../drive_c", "dosdevices/c:" ); - symlink( "/", "dosdevices/z:" ); - -done: if (fd_cwd == -1) fd_cwd = open( "dosdevices/c:", O_RDONLY ); fcntl( fd_cwd, F_SETFD, FD_CLOEXEC ); return fd_cwd; @@ -1452,6 +1491,8 @@ void server_init_process(void) obj_handle_t version; const char *env_socket = getenv( "WINESERVERSOCKET" );
+ config_dir = init_config_dir(); + server_pid = -1; if (env_socket) { @@ -1610,19 +1651,15 @@ size_t server_init_thread( void *entry_point, BOOL *suspend ) if (arch) { if (!strcmp( arch, "win32" ) && (is_win64 || is_wow64)) - fatal_error( "WINEARCH set to win32 but '%s' is a 64-bit installation.\n", - wine_get_config_dir() ); + fatal_error( "WINEARCH set to win32 but '%s' is a 64-bit installation.\n", config_dir ); if (!strcmp( arch, "win64" ) && !is_win64 && !is_wow64) - fatal_error( "WINEARCH set to win64 but '%s' is a 32-bit installation.\n", - wine_get_config_dir() ); + fatal_error( "WINEARCH set to win64 but '%s' is a 32-bit installation.\n", config_dir ); } return info_size; case STATUS_INVALID_IMAGE_WIN_64: - fatal_error( "'%s' is a 32-bit installation, it cannot support 64-bit applications.\n", - wine_get_config_dir() ); + fatal_error( "'%s' is a 32-bit installation, it cannot support 64-bit applications.\n", config_dir ); case STATUS_NOT_SUPPORTED: - fatal_error( "'%s' is a 64-bit installation, it cannot be used with a 32-bit wineserver.\n", - wine_get_config_dir() ); + fatal_error( "'%s' is a 64-bit installation, it cannot be used with a 32-bit wineserver.\n", config_dir ); case STATUS_INVALID_IMAGE_FORMAT: fatal_error( "wineserver doesn't support the %s architecture\n", cpu_names[client_cpu] ); default: