Alexandre Julliard : ntdll: Automatically setup the dosdevices directory if it doesn't exist.
Alexandre Julliard
julliard at winehq.org
Tue Apr 22 06:46:46 CDT 2008
Module: wine
Branch: master
Commit: 870bba3ee17e9f1a65fc4e97197adf5948d7b9cf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=870bba3ee17e9f1a65fc4e97197adf5948d7b9cf
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Apr 21 14:55:32 2008 +0200
ntdll: Automatically setup the dosdevices directory if it doesn't exist.
---
dlls/ntdll/server.c | 152 +++++++++++++++++++++++++++------------------------
1 files changed, 81 insertions(+), 71 deletions(-)
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
index c5146e2..c38a023 100644
--- a/dlls/ntdll/server.c
+++ b/dlls/ntdll/server.c
@@ -730,6 +730,81 @@ static void start_server(void)
/***********************************************************************
+ * setup_config_dir
+ *
+ * Setup the wine configuration dir.
+ */
+static void setup_config_dir(void)
+{
+ const char *p, *config_dir = wine_get_config_dir();
+ pid_t pid, wret;
+
+ if (chdir( config_dir ) == -1)
+ {
+ if (errno != ENOENT) fatal_perror( "chdir to %s\n", 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())
+ fatal_error( "'%s' is not owned by you, refusing to create a configuration directory there\n",
+ tmp_dir );
+ free( tmp_dir );
+ }
+
+ mkdir( config_dir, 0777 );
+ if (chdir( config_dir ) == -1) fatal_perror( "chdir to %s\n", config_dir );
+ MESSAGE( "wine: creating configuration directory '%s'...\n", config_dir );
+ }
+
+ if (mkdir( "dosdevices", 0777 ) == -1)
+ {
+ if (errno == EEXIST) return;
+ fatal_perror( "cannot create %s/dosdevices\n", config_dir );
+ }
+
+ /* create the drive symlinks */
+
+ mkdir( "drive_c", 0777 );
+ symlink( "../drive_c", "dosdevices/c:" );
+ symlink( "/", "dosdevices/z:" );
+
+ pid = fork();
+ if (pid == -1) fatal_perror( "fork" );
+
+ if (!pid)
+ {
+ char *argv[3];
+ static char argv0[] = "tools/wineprefixcreate",
+ argv1[] = "--quiet";
+
+ argv[0] = argv0;
+ argv[1] = argv1;
+ argv[2] = NULL;
+ wine_exec_wine_binary( argv[0], argv, NULL );
+ fatal_perror( "could not exec wineprefixcreate" );
+ }
+ else
+ {
+ int status;
+
+ while ((wret = waitpid( pid, &status, 0 )) != pid)
+ {
+ if (wret == -1 && errno != EINTR) fatal_perror( "wait4" );
+ }
+ if (!WIFEXITED(status) || WEXITSTATUS(status))
+ fatal_error( "wineprefixcreate failed while creating '%s'.\n", config_dir );
+ }
+ MESSAGE( "wine: '%s' created successfully.\n", config_dir );
+}
+
+
+/***********************************************************************
* server_connect_error
*
* Try to display a meaningful explanation of why we couldn't connect
@@ -768,8 +843,9 @@ static void server_connect_error( const char *serverdir )
* Attempt to connect to an existing server socket.
* We need to be in the server directory already.
*/
-static int server_connect( const char *serverdir )
+static int server_connect(void)
{
+ const char *serverdir;
struct sockaddr_un addr;
struct stat st;
int s, slen, retry, fd_cwd;
@@ -778,6 +854,9 @@ static int server_connect( const char *serverdir )
fd_cwd = open( ".", O_RDONLY );
if (fd_cwd != -1) fcntl( fd_cwd, F_SETFD, 1 ); /* set close on exec flag */
+ setup_config_dir();
+ serverdir = wine_get_server_dir();
+
/* chdir to the server directory */
if (chdir( serverdir ) == -1)
{
@@ -838,63 +917,6 @@ static int server_connect( const char *serverdir )
}
-/***********************************************************************
- * create_config_dir
- *
- * Create the wine configuration dir (~/.wine).
- */
-static void create_config_dir(void)
-{
- const char *p, *config_dir = wine_get_config_dir();
- pid_t pid, wret;
-
- 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())
- fatal_error( "'%s' is not owned by you, refusing to create a configuration directory there\n",
- tmp_dir );
- free( tmp_dir );
- }
- if (mkdir( config_dir, 0777 ) == -1 && errno != EEXIST)
- fatal_perror( "cannot create directory %s", config_dir );
-
- MESSAGE( "wine: creating configuration directory '%s'...\n", config_dir );
- pid = fork();
- if (pid == -1) fatal_perror( "fork" );
-
- if (!pid)
- {
- char *argv[3];
- static char argv0[] = "tools/wineprefixcreate",
- argv1[] = "--quiet";
-
- argv[0] = argv0;
- argv[1] = argv1;
- argv[2] = NULL;
- wine_exec_wine_binary( argv[0], argv, NULL );
- fatal_perror( "could not exec wineprefixcreate" );
- }
- else
- {
- int status;
-
- while ((wret = waitpid( pid, &status, 0 )) != pid)
- {
- if (wret == -1 && errno != EINTR) fatal_perror( "wait4" );
- }
- if (!WIFEXITED(status) || WEXITSTATUS(status))
- fatal_error( "wineprefixcreate failed while creating '%s'.\n", config_dir );
- }
- MESSAGE( "wine: '%s' created successfully.\n", config_dir );
-}
-
-
#ifdef __APPLE__
#include <mach/mach.h>
#include <mach/mach_error.h>
@@ -955,19 +977,7 @@ void server_init_process(void)
fatal_perror( "Bad server socket %d", fd_socket );
unsetenv( "WINESERVERSOCKET" );
}
- else
- {
- const char *server_dir = wine_get_server_dir();
-
- if (!server_dir) /* this means the config dir doesn't exist */
- {
- create_config_dir();
- server_dir = wine_get_server_dir();
- }
-
- /* connect to the server */
- fd_socket = server_connect( server_dir );
- }
+ else fd_socket = server_connect();
/* setup the signal mask */
sigemptyset( &server_block_set );
More information about the wine-cvs
mailing list