Alexandre Julliard : wineboot: Rewrite wininit. ini processing to use GetPrivateProfileSectionW. Convert to Unicode.

Alexandre Julliard julliard at winehq.org
Fri Dec 21 07:28:22 CST 2007


Module: wine
Branch: master
Commit: e34244a3b9c7cb0be4de3c24c99d8de82b5d3815
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e34244a3b9c7cb0be4de3c24c99d8de82b5d3815

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Dec 20 15:53:53 2007 +0100

wineboot: Rewrite wininit.ini processing to use GetPrivateProfileSectionW. Convert to Unicode.

---

 programs/wineboot/wineboot.c |  137 +++++++++++------------------------------
 1 files changed, 37 insertions(+), 100 deletions(-)

diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index e63bbbe..6e21b17 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -61,6 +61,7 @@
 # include <getopt.h>
 #endif
 #include <windows.h>
+#include <wine/unicode.h>
 #include <wine/debug.h>
 
 #define COBJMACROS
@@ -76,123 +77,59 @@ WINE_DEFAULT_DEBUG_CHANNEL(wineboot);
 extern BOOL shutdown_close_windows( BOOL force );
 extern void kill_processes( BOOL kill_desktop );
 
-static BOOL GetLine( HANDLE hFile, char *buf, size_t buflen )
-{
-    unsigned int i=0;
-    DWORD r;
-    buf[0]='\0';
-
-    do
-    {
-        DWORD read;
-        if( !ReadFile( hFile, buf, 1, &read, NULL ) || read!=1 )
-        {
-            return FALSE;
-        }
-
-    } while( isspace( *buf ) );
-
-    while( buf[i]!='\n' && i<=buflen &&
-            ReadFile( hFile, buf+i+1, 1, &r, NULL ) )
-    {
-        ++i;
-    }
-
-
-    if( buf[i]!='\n' )
-    {
-	return FALSE;
-    }
-
-    if( i>0 && buf[i-1]=='\r' )
-        --i;
-
-    buf[i]='\0';
-
-    return TRUE;
-}
 
 /* Performs the rename operations dictated in %SystemRoot%\Wininit.ini.
  * Returns FALSE if there was an error, or otherwise if all is ok.
  */
 static BOOL wininit(void)
 {
-    const char * const RENAME_FILE="wininit.ini";
-    const char * const RENAME_FILE_TO="wininit.bak";
-    const char * const RENAME_FILE_SECTION="[rename]";
-    char buffer[MAX_LINE_LENGTH];
-    HANDLE hFile;
-
+    static const WCHAR nulW[] = {'N','U','L',0};
+    static const WCHAR renameW[] = {'r','e','n','a','m','e',0};
+    static const WCHAR wininitW[] = {'w','i','n','i','n','i','t','.','i','n','i',0};
+    static const WCHAR wininitbakW[] = {'w','i','n','i','n','i','t','.','b','a','k',0};
+    WCHAR initial_buffer[1024];
+    WCHAR *str, *buffer = initial_buffer;
+    DWORD size = sizeof(initial_buffer)/sizeof(WCHAR);
+    DWORD res;
 
-    hFile=CreateFileA(RENAME_FILE, GENERIC_READ,
-		    FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
-		    NULL );
-    
-    if( hFile==INVALID_HANDLE_VALUE )
+    for (;;)
     {
-	DWORD err=GetLastError();
-	
-	if( err==ERROR_FILE_NOT_FOUND )
-	{
-	    /* No file - nothing to do. Great! */
-	    WINE_TRACE("Wininit.ini not present - no renaming to do\n");
-
-	    return TRUE;
-	}
-
-	WINE_ERR("There was an error in reading wininit.ini file - %d\n",
-		GetLastError() );
-
-	return FALSE;
+        if (!(res = GetPrivateProfileSectionW( renameW, buffer, size, wininitW ))) return TRUE;
+        if (res < size - 2) break;
+        if (buffer != initial_buffer) HeapFree( GetProcessHeap(), 0, buffer );
+        size *= 2;
+        if (!(buffer = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) ))) return FALSE;
     }
 
-    while( GetLine( hFile, buffer, sizeof(buffer) ) &&
-	    lstrcmpiA(buffer,RENAME_FILE_SECTION)!=0  )
-	; /* Read the lines until we match the rename section */
-
-    while( GetLine( hFile, buffer, sizeof(buffer) ) && buffer[0]!='[' )
+    for (str = buffer; *str; str += strlenW(str) + 1)
     {
-	/* First, make sure this is not a comment */
-	if( buffer[0]!=';' && buffer[0]!='\0' )
-	{
-	    char * value;
+        WCHAR *value;
 
-	    value=strchr(buffer, '=');
+        if (*str == ';') continue;  /* comment */
+        if (!(value = strchrW( str, '=' ))) continue;
 
-	    if( value==NULL )
-	    {
-		WINE_WARN("Line with no \"=\" in it in wininit.ini - %s\n",
-			buffer);
-	    } else
-	    {
-		/* split the line into key and value */
-		*(value++)='\0';
+        /* split the line into key and value */
+        *value++ = 0;
 
-                if( lstrcmpiA( "NUL", buffer )==0 )
-                {
-                    WINE_TRACE("Deleting file \"%s\"\n", value );
-                    /* A file to delete */
-                    if( !DeleteFileA( value ) )
-                        WINE_WARN("Error deleting file \"%s\"\n", value);
-                } else
-                {
-                    WINE_TRACE("Renaming file \"%s\" to \"%s\"\n", value,
-                            buffer );
-
-                    if( !MoveFileExA(value, buffer, MOVEFILE_COPY_ALLOWED|
-                            MOVEFILE_REPLACE_EXISTING) )
-                    {
-                        WINE_WARN("Error renaming \"%s\" to \"%s\"\n", value,
-                                buffer );
-                    }
-                }
-	    }
-	}
+        if (!lstrcmpiW( nulW, str ))
+        {
+            WINE_TRACE("Deleting file %s\n", wine_dbgstr_w(value) );
+            if( !DeleteFileW( value ) )
+                WINE_WARN("Error deleting file %s\n", wine_dbgstr_w(value) );
+        }
+        else
+        {
+            WINE_TRACE("Renaming file %s to %s\n", wine_dbgstr_w(value), wine_dbgstr_w(str) );
+
+            if( !MoveFileExW(value, str, MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING) )
+                WINE_WARN("Error renaming %s to %s\n", wine_dbgstr_w(value), wine_dbgstr_w(str) );
+        }
+        str = value;
     }
 
-    CloseHandle( hFile );
+    if (buffer != initial_buffer) HeapFree( GetProcessHeap(), 0, buffer );
 
-    if( !MoveFileExA( RENAME_FILE, RENAME_FILE_TO, MOVEFILE_REPLACE_EXISTING) )
+    if( !MoveFileExW( wininitW, wininitbakW, MOVEFILE_REPLACE_EXISTING) )
     {
         WINE_ERR("Couldn't rename wininit.ini, error %d\n", GetLastError() );
 




More information about the wine-cvs mailing list