Moved SaveOnlyUpdatedKeys to wine.ini.
Use get_config_dir() instead of hardcoding ~/.wine
Simplified loading and saving routines.
diff --git a/misc/registry.c b/misc/registry.c
index 66754d2..78dc094 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -54,8 +54,6 @@
static void REGISTRY_Init(void);
/* FIXME: following defines should be configured global ... */
-/* NOTE: do not append a /. linux' mkdir() WILL FAIL if you do that */
-#define WINE_PREFIX "/.wine"
#define SAVE_USERS_DEFAULT ETCDIR"/wine.userreg"
#define SAVE_LOCAL_MACHINE_DEFAULT ETCDIR"/wine.systemreg"
@@ -64,10 +62,6 @@
#define SAVE_LOCAL_USERS_DEFAULT "wine.userreg"
#define SAVE_LOCAL_MACHINE "system.reg"
-#define KEY_REGISTRY "Software\\The WINE team\\WINE\\Registry"
-#define VAL_SAVEUPDATED "SaveOnlyUpdatedKeys"
-
-
/* what valuetypes do we need to convert? */
#define UNICONVMASK ((1<<REG_SZ)|(1<<REG_MULTI_SZ)|(1<<REG_EXPAND_SZ))
@@ -229,136 +223,58 @@
/******************************************************************************
- * SHELL_SaveRegistryBranch [Internal]
- *
- * Saves main registry branch specified by hkey.
- */
-static void SHELL_SaveRegistryBranch(HKEY hkey)
-{
- char *fn, *home;
-
- /* Find out what to save to, get from config file */
- BOOL writeToHome = PROFILE_GetWineIniBool("registry","WritetoHomeRegistries",1);
- BOOL writeToAlt = PROFILE_GetWineIniBool("registry","WritetoAltRegistries",1);
-
- /* FIXME: does this check apply to all keys written below ? */
- if (!(home = getenv( "HOME" )))
- ERR("Failed to get homedirectory of UID %ld.\n",(long) getuid());
-
- /* HKEY_LOCAL_MACHINE contains the HKEY_CLASSES_ROOT branch */
- if (hkey == HKEY_CLASSES_ROOT) hkey = HKEY_LOCAL_MACHINE;
-
- switch (hkey)
- {
- case HKEY_CURRENT_USER:
- fn = xmalloc( MAX_PATHNAME_LEN );
- if (writeToAlt && PROFILE_GetWineIniString( "registry", "AltCurrentUserFile", "",
- fn, MAX_PATHNAME_LEN - 1))
- save_key( HKEY_CURRENT_USER, fn );
- free (fn);
-
- if (home && writeToHome)
- {
- fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) +
- strlen(SAVE_CURRENT_USER) + 2 );
- strcpy(fn,home);
- strcat(fn,WINE_PREFIX);
-
- /* create the directory. don't care about errorcodes. */
- mkdir(fn,0755); /* drwxr-xr-x */
- strcat(fn,"/"SAVE_CURRENT_USER);
- save_key( HKEY_CURRENT_USER, fn );
- free(fn);
- }
- break;
- case HKEY_LOCAL_MACHINE:
- /* Try first saving according to the defined location in .winerc */
- fn = xmalloc ( MAX_PATHNAME_LEN);
- if (writeToAlt && PROFILE_GetWineIniString( "Registry", "AltLocalMachineFile", "",
- fn, MAX_PATHNAME_LEN - 1))
- save_key( HKEY_LOCAL_MACHINE, fn );
- free (fn);
-
- if (home && writeToHome)
- {
- fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) +
- strlen(SAVE_LOCAL_MACHINE) + 2);
- strcpy(fn,home);
- strcat(fn,WINE_PREFIX"/"SAVE_LOCAL_MACHINE);
- save_key( HKEY_LOCAL_MACHINE, fn );
- free(fn);
- }
- break;
- case HKEY_USERS:
- fn = xmalloc( MAX_PATHNAME_LEN );
- if (writeToAlt && PROFILE_GetWineIniString( "Registry", "AltUserFile", "",
- fn, MAX_PATHNAME_LEN - 1))
- save_key( HKEY_USERS, fn );
- free (fn);
-
- if (home && writeToHome)
- {
- fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) +
- strlen(SAVE_LOCAL_USERS_DEFAULT) + 2);
- strcpy(fn,home);
- strcat(fn,WINE_PREFIX"/"SAVE_LOCAL_USERS_DEFAULT);
- save_key( HKEY_USERS, fn );
- free(fn);
- }
- break;
- default:
- ERR("unknown/invalid key handle !\n");
- break;
- }
-}
-
-
-/******************************************************************************
* SHELL_SaveRegistry [Internal]
*/
void SHELL_SaveRegistry( void )
{
+ const char *confdir = get_config_dir();
struct set_registry_levels_request *req = get_req_buffer();
- char buf[4];
- HKEY hkey;
- int all, version;
+ char *fn;
- TRACE("(void)\n");
+ int all = PROFILE_GetWineIniBool( "registry", "SaveOnlyUpdatedKeys", 1 );
+ int version = PROFILE_GetWineIniBool( "registry", "UseNewFormat", 1 ) ? 2 : 1;
- all=0;
- if (RegOpenKeyA(HKEY_CURRENT_USER,KEY_REGISTRY,&hkey)!=ERROR_SUCCESS)
- {
- strcpy(buf,"yes");
- }
- else
- {
- DWORD len,junk,type;
-
- len=4;
- if ((ERROR_SUCCESS!=RegQueryValueExA( hkey,
- VAL_SAVEUPDATED,
- &junk,
- &type,
- buf,
- &len)) || (type!=REG_SZ))
- {
- strcpy(buf,"yes");
- }
- RegCloseKey(hkey);
- }
-
- if (lstrcmpiA(buf,"yes")) all = 1;
-
- version = PROFILE_GetWineIniBool( "registry", "UseNewFormat", 1 ) ? 2 : 1;
/* set saving level (0 for saving everything, 1 for saving only modified keys) */
req->current = 1;
req->saving = !all;
req->version = version;
server_call( REQ_SET_REGISTRY_LEVELS );
- SHELL_SaveRegistryBranch(HKEY_CURRENT_USER);
- SHELL_SaveRegistryBranch(HKEY_LOCAL_MACHINE);
- SHELL_SaveRegistryBranch(HKEY_USERS);
+ if (!(fn = HeapAlloc( GetProcessHeap(), 0, MAX_PATHNAME_LEN )))
+ {
+ ERR( "Not enough memory to save registry\n" );
+ return;
+ }
+
+ if (PROFILE_GetWineIniBool("registry","WritetoAltRegistries",1))
+ {
+ if (PROFILE_GetWineIniString( "registry", "AltCurrentUserFile", "", fn, MAX_PATHNAME_LEN ))
+ save_key( HKEY_CURRENT_USER, fn );
+ if (PROFILE_GetWineIniString( "Registry", "AltLocalMachineFile", "", fn, MAX_PATHNAME_LEN ))
+ save_key( HKEY_LOCAL_MACHINE, fn );
+ if (PROFILE_GetWineIniString( "Registry", "AltUserFile", "", fn, MAX_PATHNAME_LEN ))
+ save_key( HKEY_USERS, fn );
+
+ }
+
+ if (PROFILE_GetWineIniBool("registry","WritetoHomeRegistries",1))
+ {
+ char *str;
+ strcpy( fn, confdir );
+ str = fn + strlen(fn);
+ *str++ = '/';
+
+ strcpy( str, SAVE_CURRENT_USER );
+ save_key( HKEY_CURRENT_USER, fn );
+
+ strcpy( str, SAVE_LOCAL_MACHINE );
+ save_key( HKEY_LOCAL_MACHINE, fn );
+
+ strcpy( str, SAVE_LOCAL_USERS_DEFAULT );
+ save_key( HKEY_USERS, fn );
+ }
+
+ HeapFree( GetProcessHeap(), 0, fn );
}
/* Periodic save callback */
@@ -1577,7 +1493,6 @@
void SHELL_LoadRegistry( void )
{
- char *fn, *home;
HKEY hkey;
char windir[MAX_PATHNAME_LEN];
char path[MAX_PATHNAME_LEN];
@@ -1734,35 +1649,34 @@
/*
* Load the user saved registries
*/
- if (!(home = getenv( "HOME" )))
- WARN("Failed to get homedirectory of UID %ld.\n",(long) getuid());
- else if (PROFILE_GetWineIniBool("registry", "LoadHomeRegistryFiles", 1))
+ if (PROFILE_GetWineIniBool("registry", "LoadHomeRegistryFiles", 1))
{
+ const char *confdir = get_config_dir();
+ int len = strlen(confdir) + 20;
+ char *fn = path;
+
+ if (len > sizeof(path)) fn = HeapAlloc( GetProcessHeap(), 0, len );
/*
* Load user's personal versions of global HKU/.Default keys
*/
- fn=(char*)xmalloc( strlen(home)+ strlen(WINE_PREFIX) +
- strlen(SAVE_LOCAL_USERS_DEFAULT)+2);
- strcpy(fn, home);
- strcat(fn, WINE_PREFIX"/"SAVE_LOCAL_USERS_DEFAULT);
- _wine_loadreg( HKEY_USERS, fn );
- free(fn);
+ if (fn)
+ {
+ char *str;
+ strcpy( fn, confdir );
+ str = fn + strlen(fn);
+ *str++ = '/';
- fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) + strlen(SAVE_CURRENT_USER)+2);
- strcpy(fn, home);
- strcat(fn, WINE_PREFIX"/"SAVE_CURRENT_USER);
- _wine_loadreg( HKEY_CURRENT_USER, fn );
- free(fn);
+ strcpy( str, SAVE_LOCAL_USERS_DEFAULT );
+ _wine_loadreg( HKEY_USERS, fn );
- /*
- * Load HKLM, attempt to get the registry location from the config
- * file first, if exist, load and keep going.
- */
- fn=(char*)xmalloc( strlen(home)+ strlen(WINE_PREFIX)+ strlen(SAVE_LOCAL_MACHINE)+2);
- strcpy(fn,home);
- strcat(fn,WINE_PREFIX"/"SAVE_LOCAL_MACHINE);
- _wine_loadreg( HKEY_LOCAL_MACHINE, fn );
- free(fn);
+ strcpy( str, SAVE_CURRENT_USER );
+ _wine_loadreg( HKEY_CURRENT_USER, fn );
+
+ strcpy( str, SAVE_LOCAL_MACHINE );
+ _wine_loadreg( HKEY_LOCAL_MACHINE, fn );
+
+ if (fn != path) HeapFree( GetProcessHeap(), 0, fn );
+ }
}
/*
@@ -1771,37 +1685,23 @@
*/
if (PROFILE_GetWineIniBool ( "registry", "LoadAltRegistryFiles", 1))
{
- fn = xmalloc( MAX_PATHNAME_LEN );
- if ( PROFILE_GetWineIniString( "registry", "AltCurrentUserFile", "",
- fn, MAX_PATHNAME_LEN - 1))
- {
- _wine_loadreg( HKEY_CURRENT_USER, fn );
- }
- free (fn);
+ if (PROFILE_GetWineIniString( "registry", "AltCurrentUserFile", "", path, sizeof(path) ))
+ _wine_loadreg( HKEY_CURRENT_USER, path );
+
/*
* Load HKU, get the registry location from the config
* file, if exist, load and keep going.
*/
- fn = xmalloc ( MAX_PATHNAME_LEN );
- if ( PROFILE_GetWineIniString ( "registry", "AltUserFile", "",
- fn, MAX_PATHNAME_LEN - 1))
- {
- _wine_loadreg( HKEY_USERS, fn );
- }
- free (fn);
+ if (PROFILE_GetWineIniString ( "registry", "AltUserFile", "", path, sizeof(path) ))
+ _wine_loadreg( HKEY_USERS, path );
+
/*
* Load HKLM, get the registry location from the config
* file, if exist, load and keep going.
*/
- fn = xmalloc ( MAX_PATHNAME_LEN );
- if (PROFILE_GetWineIniString ( "registry", "AltLocalMachineFile", "",
- fn, MAX_PATHNAME_LEN - 1))
- {
- _wine_loadreg( HKEY_LOCAL_MACHINE, fn );
- }
- free (fn);
+ if (PROFILE_GetWineIniString ( "registry", "AltLocalMachineFile", "", path, sizeof(path) ))
+ _wine_loadreg( HKEY_LOCAL_MACHINE, path );
}
-
}
/* start the periodic saving timer */