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