mirror of
git://sourceware.org/git/lvm2.git
synced 2025-08-02 04:22:02 +03:00
conf: make time format configurable
Make it possible to define format for time that is displayed. The way the format is defined is equal to the way that is used for strftime function, although not all formatting options as used in strftime are available for LVM2 - the set is restricted (e.g. we do not allow newline to be printed). The lvm.conf comments contain the whole list that LVM2 accepts for time format together with brief description (copied from strftime man page). For example: (defaults used - the format is the same as used before this patch) $ lvs -o+time vg/lvol0 vg/lvol1 LV VG Attr LSize Time lvol0 vg -wi-a----- 4.00m 2015-06-25 16:18:34 +0200 lvol1 vg -wi-a----- 4.00m 2015-06-29 09:17:11 +0200 (using 'time_format = "@%s"' in lvm.conf - number of seconds since the Epoch) $ lvs -o+time vg/lvol0 vg/lvol1 LV VG Attr LSize Time lvol0 vg -wi-a----- 4.00m @1435241914 lvol1 vg -wi-a----- 4.00m @1435562231
This commit is contained in:
@ -413,6 +413,57 @@ static int _check_config(struct cmd_context *cmd)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const char *_set_time_format(struct cmd_context *cmd)
|
||||
{
|
||||
/* Compared to strftime, we do not allow "newline" character - the %n in format. */
|
||||
static const char *allowed_format_chars = "aAbBcCdDeFGghHIjklmMpPrRsStTuUVwWxXyYzZ%";
|
||||
static const char *allowed_alternative_format_chars_e = "cCxXyY";
|
||||
static const char *allowed_alternative_format_chars_o = "deHImMSuUVwWy";
|
||||
static const char *chars_to_check;
|
||||
const char *tf = find_config_tree_str(cmd, report_time_format_CFG, NULL);
|
||||
const char *p_fmt;
|
||||
size_t i;
|
||||
char c;
|
||||
|
||||
if (!*tf) {
|
||||
log_error("Configured time format is empty string.");
|
||||
goto bad;
|
||||
} else {
|
||||
p_fmt = tf;
|
||||
while ((c = *p_fmt)) {
|
||||
if (c == '%') {
|
||||
c = *++p_fmt;
|
||||
if (c == 'E') {
|
||||
c = *++p_fmt;
|
||||
chars_to_check = allowed_alternative_format_chars_e;
|
||||
} else if (c == 'O') {
|
||||
c = *++p_fmt;
|
||||
chars_to_check = allowed_alternative_format_chars_o;
|
||||
} else
|
||||
chars_to_check = allowed_format_chars;
|
||||
|
||||
for (i = 0; chars_to_check[i]; i++) {
|
||||
if (c == allowed_format_chars[i])
|
||||
break;
|
||||
}
|
||||
if (!allowed_format_chars[i])
|
||||
goto_bad;
|
||||
}
|
||||
else if (isprint(c))
|
||||
p_fmt++;
|
||||
else {
|
||||
log_error("Configured time format contains non-printable characters.");
|
||||
goto bad;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tf;
|
||||
bad:
|
||||
log_error("Incorrect time format specified. Using default time format instead.");
|
||||
return DEFAULT_TIME_FORMAT;
|
||||
}
|
||||
|
||||
int process_profilable_config(struct cmd_context *cmd)
|
||||
{
|
||||
if (!(cmd->default_settings.unit_factor =
|
||||
@ -426,6 +477,7 @@ int process_profilable_config(struct cmd_context *cmd)
|
||||
cmd->report_binary_values_as_numeric = find_config_tree_bool(cmd, report_binary_values_as_numeric_CFG, NULL);
|
||||
cmd->default_settings.suffix = find_config_tree_bool(cmd, global_suffix_CFG, NULL);
|
||||
cmd->report_list_item_separator = find_config_tree_str(cmd, report_list_item_separator_CFG, NULL);
|
||||
cmd->time_format = _set_time_format(cmd);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -95,6 +95,8 @@ struct cmd_context {
|
||||
unsigned ignore_clustered_vgs:1;
|
||||
unsigned threaded:1; /* Set if running within a thread e.g. clvmd */
|
||||
|
||||
const char *time_format;
|
||||
|
||||
unsigned independent_metadata_areas:1; /* Active formats have MDAs outside PVs */
|
||||
unsigned unknown_system_id:1;
|
||||
unsigned include_foreign_vgs:1;
|
||||
|
Reference in New Issue
Block a user