server: Store modification time as a key comment to avoid losing precision.
This commit is contained in:
parent
d2890778f9
commit
1baf01fc24
|
@ -265,6 +265,7 @@ static void save_subkeys( const struct key *key, const struct key *base, FILE *f
|
||||||
fprintf( f, "\n[" );
|
fprintf( f, "\n[" );
|
||||||
if (key != base) dump_path( key, base, f );
|
if (key != base) dump_path( key, base, f );
|
||||||
fprintf( f, "] %u\n", (unsigned int)((key->modif - ticks_1601_to_1970) / TICKS_PER_SEC) );
|
fprintf( f, "] %u\n", (unsigned int)((key->modif - ticks_1601_to_1970) / TICKS_PER_SEC) );
|
||||||
|
fprintf( f, "#time=%x%08x\n", (unsigned int)(key->modif >> 32), (unsigned int)key->modif );
|
||||||
if (key->class)
|
if (key->class)
|
||||||
{
|
{
|
||||||
fprintf( f, "#class=\"" );
|
fprintf( f, "#class=\"" );
|
||||||
|
@ -1341,14 +1342,13 @@ static int get_data_type( const char *buffer, int *type, int *parse_type )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* load and create a key from the input file */
|
/* load and create a key from the input file */
|
||||||
static struct key *load_key( struct key *base, const char *buffer,
|
static struct key *load_key( struct key *base, const char *buffer, int prefix_len,
|
||||||
int prefix_len, struct file_load_info *info )
|
struct file_load_info *info, timeout_t *modif )
|
||||||
{
|
{
|
||||||
WCHAR *p;
|
WCHAR *p;
|
||||||
struct unicode_str name;
|
struct unicode_str name;
|
||||||
int res;
|
int res;
|
||||||
unsigned int mod;
|
unsigned int mod;
|
||||||
timeout_t modif = current_time;
|
|
||||||
data_size_t len;
|
data_size_t len;
|
||||||
|
|
||||||
if (!get_file_tmp_space( info, strlen(buffer) * sizeof(WCHAR) )) return NULL;
|
if (!get_file_tmp_space( info, strlen(buffer) * sizeof(WCHAR) )) return NULL;
|
||||||
|
@ -1360,7 +1360,9 @@ static struct key *load_key( struct key *base, const char *buffer,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (sscanf( buffer + res, " %u", &mod ) == 1)
|
if (sscanf( buffer + res, " %u", &mod ) == 1)
|
||||||
modif = (timeout_t)mod * TICKS_PER_SEC + ticks_1601_to_1970;
|
*modif = (timeout_t)mod * TICKS_PER_SEC + ticks_1601_to_1970;
|
||||||
|
else
|
||||||
|
*modif = current_time;
|
||||||
|
|
||||||
p = info->tmp;
|
p = info->tmp;
|
||||||
while (prefix_len && *p) { if (*p++ == '\\') prefix_len--; }
|
while (prefix_len && *p) { if (*p++ == '\\') prefix_len--; }
|
||||||
|
@ -1377,7 +1379,17 @@ static struct key *load_key( struct key *base, const char *buffer,
|
||||||
}
|
}
|
||||||
name.str = p;
|
name.str = p;
|
||||||
name.len = len - (p - info->tmp + 1) * sizeof(WCHAR);
|
name.len = len - (p - info->tmp + 1) * sizeof(WCHAR);
|
||||||
return create_key_recursive( base, &name, modif );
|
return create_key_recursive( base, &name, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update the modification time of a key (and its parents) after it has been loaded from a file */
|
||||||
|
static void update_key_time( struct key *key, timeout_t modif )
|
||||||
|
{
|
||||||
|
while (key && !key->modif)
|
||||||
|
{
|
||||||
|
key->modif = modif;
|
||||||
|
key = key->parent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* load a global option from the input file */
|
/* load a global option from the input file */
|
||||||
|
@ -1415,6 +1427,18 @@ static int load_key_option( struct key *key, const char *buffer, struct file_loa
|
||||||
const char *p;
|
const char *p;
|
||||||
data_size_t len;
|
data_size_t len;
|
||||||
|
|
||||||
|
if (!strncmp( buffer, "#time=", 6 ))
|
||||||
|
{
|
||||||
|
timeout_t modif = 0;
|
||||||
|
for (p = buffer + 6; *p; p++)
|
||||||
|
{
|
||||||
|
if (*p >= '0' && *p <= '9') modif = (modif << 4) | (*p - '0');
|
||||||
|
else if (*p >= 'A' && *p <= 'F') modif = (modif << 4) | (*p - 'A' + 10);
|
||||||
|
else if (*p >= 'a' && *p <= 'f') modif = (modif << 4) | (*p - 'a' + 10);
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
update_key_time( key, modif );
|
||||||
|
}
|
||||||
if (!strncmp( buffer, "#class=", 7 ))
|
if (!strncmp( buffer, "#class=", 7 ))
|
||||||
{
|
{
|
||||||
p = buffer + 7;
|
p = buffer + 7;
|
||||||
|
@ -1589,6 +1613,7 @@ static void load_keys( struct key *key, const char *filename, FILE *f, int prefi
|
||||||
{
|
{
|
||||||
struct key *subkey = NULL;
|
struct key *subkey = NULL;
|
||||||
struct file_load_info info;
|
struct file_load_info info;
|
||||||
|
timeout_t modif = current_time;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
info.filename = filename;
|
info.filename = filename;
|
||||||
|
@ -1617,9 +1642,13 @@ static void load_keys( struct key *key, const char *filename, FILE *f, int prefi
|
||||||
switch(*p)
|
switch(*p)
|
||||||
{
|
{
|
||||||
case '[': /* new key */
|
case '[': /* new key */
|
||||||
if (subkey) release_object( subkey );
|
if (subkey)
|
||||||
|
{
|
||||||
|
update_key_time( subkey, modif );
|
||||||
|
release_object( subkey );
|
||||||
|
}
|
||||||
if (prefix_len == -1) prefix_len = get_prefix_len( key, p + 1, &info );
|
if (prefix_len == -1) prefix_len = get_prefix_len( key, p + 1, &info );
|
||||||
if (!(subkey = load_key( key, p + 1, prefix_len, &info )))
|
if (!(subkey = load_key( key, p + 1, prefix_len, &info, &modif )))
|
||||||
file_read_error( "Error creating key", &info );
|
file_read_error( "Error creating key", &info );
|
||||||
break;
|
break;
|
||||||
case '@': /* default value */
|
case '@': /* default value */
|
||||||
|
@ -1641,7 +1670,11 @@ static void load_keys( struct key *key, const char *filename, FILE *f, int prefi
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (subkey) release_object( subkey );
|
if (subkey)
|
||||||
|
{
|
||||||
|
update_key_time( subkey, modif );
|
||||||
|
release_object( subkey );
|
||||||
|
}
|
||||||
free( info.buffer );
|
free( info.buffer );
|
||||||
free( info.tmp );
|
free( info.tmp );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue