Hi all, Initial version, cleaned up and with all files in a single diff. Changelog: Shachar Shemesh <winecode@sun.consumer.org.il> configure.ac and programs/Makefile.in * Added the new directory (programs/wineboot) to the list of makefiles to create programs/wineboot/* * Initial implementation Bugs: * At this stage only wininit.ini processing has been written. Lots more work to do.
Index: configure.ac =================================================================== RCS file: /home/sun/sources/cvs/wine/configure.ac,v retrieving revision 1.114 diff -u -r1.114 configure.ac --- configure.ac 24 Dec 2002 02:39:47 -0000 1.114 +++ configure.ac 28 Dec 2002 21:01:43 -0000 @@ -1499,6 +1499,7 @@ programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile +programs/wineboot/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile Index: programs/Makefile.in =================================================================== RCS file: /home/sun/sources/cvs/wine/programs/Makefile.in,v retrieving revision 1.32 diff -u -r1.32 Makefile.in --- programs/Makefile.in 2 Dec 2002 21:17:05 -0000 1.32 +++ programs/Makefile.in 28 Dec 2002 21:02:18 -0000 @@ -22,6 +22,7 @@ uninstaller \ view \ wcmd \ + wineboot \ wineconsole \ winedbg \ winefile \ --- /dev/null 2002-12-28 16:16:18.000000000 +0200 +++ programs/wineboot/wineboot.c 2003-01-02 20:31:17.000000000 +0200 @@ -0,0 +1,161 @@ +#include <stdio.h> +#include "winbase.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wineboot); + +const char * const RENAME_FILE="wininit.ini"; +const char * const RENAME_FILE_SECTION="[rename]"; +#define MAX_LINE_LENGTH (2*MAX_PATH+2) + +static BOOL GetLine( HANDLE hFile, char *buf, size_t buflen ) +{ + int i=0; + 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, NULL, 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() +{ + char buffer[MAX_LINE_LENGTH]; + char ini_path[MAX_PATH]; + HANDLE hFile; + DWORD res; + + res=GetWindowsDirectoryA( ini_path, sizeof(ini_path) ); + + if( res==0 ) + { + WINE_ERR("Couldn't get the windows directory - error %ld\n", + GetLastError() ); + + return FALSE; + } + + if( res>=sizeof(ini_path) ) + { + WINE_ERR("Windows path too long (%ld)\n", res ); + + return FALSE; + } + + sprintf( ini_path+res, "\\%s", RENAME_FILE ); + + hFile=CreateFileA(ini_path, GENERIC_READ, + FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, + NULL ); + + if( hFile==INVALID_HANDLE_VALUE ) + { + 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 - %ld\n", + GetLastError() ); + + return FALSE; + } + + printf("Wine is finalizing your software installation. This may take a few minutes,\n"); + printf("though it never actually does.\n"); + + 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]!='[' ) + { + /* First, make sure this is not a comment */ + if( buffer[0]!=';' && buffer[0]!='\0' ) + { + char * value; + + value=strchr(buffer, '='); + + 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'; + + 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 ); + } + } + } + } + } + + CloseHandle( hFile ); + + if( !DeleteFileA( ini_path ) ) + { + WINE_ERR("Couldn't erase %s, error %ld\n", ini_path, GetLastError() ); + + return FALSE; + } + + return TRUE; +} + +int main( int argc, char *argv[] ) +{ + wininit(); + + return 0; +} --- /dev/null 2002-12-28 16:16:18.000000000 +0200 +++ programs/wineboot/Makefile.in 2003-01-02 20:30:02.000000000 +0200 @@ -0,0 +1,19 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = wineboot.exe +#EXTRALIBS = @CURSESLIBS@ +APPMODE = cui +#IMPORTS = msvcrt +#DELAYIMPORTS = comctl32 user32 gdi32 + +C_SRCS = \ + wineboot.c + +#RC_SRCS = wineboot_res.rc + +@MAKE_PROG_RULES@ + + +### Dependencies: --- /dev/null 2002-12-28 16:16:18.000000000 +0200 +++ programs/wineboot/.cvsignore 2003-01-01 19:38:55.000000000 +0200 @@ -0,0 +1,8 @@ +Makefile +wineboot +wineboot.exe.dbg.c +wineboot.exe.dbg.o +wineboot.exe.so +wineboot.exe.spec.c +wineboot.exe.spec.o +wineboot.o