Add option to read RTC LOCAL/UTC setting from hwclock's adjtime file

This commit is contained in:
Miroslav Lichvar 2013-12-11 11:20:58 +01:00
parent 3c5cf81e32
commit e77b0070af
4 changed files with 71 additions and 0 deletions

View file

@ -1132,6 +1132,7 @@ directives can occur in any order in the file.
* dumponexit directive:: Dump measurements when daemon exits
* fallbackdrift directive:: Specify fallback drift intervals
* generatecommandkey directive:: Generate command key automatically
* hwclockfile directive:: Specify location of hwclock's adjtime file
* include directive:: Include a configuration file
* initstepslew directive:: Trim the system clock on boot-up
* keyfile directive:: Specify location of file containing keys
@ -1644,6 +1645,20 @@ command key from the /dev/urandom file and write it to the key file.
The generated key will use SHA1 if @code{chronyd} is compiled with the support,
otherwise MD5 will be used.
@c }}}
@c {{{ hwclockfile
@node hwclockfile directive
@subsection hwclockfile
The @code{hwclockfile} directive sets the location of the adjtime file which is
used by the @file{/sbin/hwclock} program. With this directive, @code{chronyd}
will parse the file to find out if the RTC keeps local time or UTC. It
overrides the @code{rtconutc} directive (@pxref{rtconutc directive}).
An example of the command is
@example
hwclockfile /etc/adjtime
@end example
@c }}}
@c {{{ include
@node include directive
@subsection include
@ -2705,6 +2720,9 @@ or ends.
If the @code{rtconutc} directive appears, it means the RTC is required
to keep UTC. The directive takes no arguments. It is equivalent to
specifying the @code{-u} switch to the Linux @file{/sbin/hwclock} program.
Note that this setting is overriden when the @code{hwclockfile} directive
(@pxref{hwclockfile directive}) is used.
@c }}}
@c {{{ rtcsync
@node rtcsync directive

13
conf.c
View file

@ -124,6 +124,9 @@ static int enable_manual=0;
incl. daylight saving). */
static int rtc_on_utc = 0;
/* Filename used to read the hwclock(8) LOCAL/UTC setting */
static char *hwclock_file = NULL;
/* Flag set if the RTC should be automatically synchronised by kernel */
static int rtc_sync = 0;
@ -365,6 +368,8 @@ CNF_ReadFile(const char *filename)
parse_fallbackdrift(p);
} else if (!strcasecmp(command, "generatecommandkey")) {
generate_command_key = parse_null(p);
} else if (!strcasecmp(command, "hwclockfile")) {
parse_string(p, &hwclock_file);
} else if (!strcasecmp(command, "include")) {
parse_include(p);
} else if (!strcasecmp(command, "initstepslew")) {
@ -1620,3 +1625,11 @@ CNF_GetMinSamples(void)
{
return min_samples;
}
/* ================================================== */
char *
CNF_GetHwclockFile(void)
{
return hwclock_file;
}

1
conf.h
View file

@ -100,5 +100,6 @@ extern int CNF_GetMaxSamples(void);
extern int CNF_GetMinSamples(void);
extern double CNF_GetRtcAutotrim(void);
extern char *CNF_GetHwclockFile(void);
#endif /* GOT_CONF_H */

View file

@ -371,6 +371,43 @@ t_from_rtc(struct tm *stm) {
/* ================================================== */
static void
read_hwclock_file(const char *hwclock_file)
{
FILE *in;
char line[256];
int i;
if (!hwclock_file)
return;
in = fopen(hwclock_file, "r");
if (!in) {
LOG(LOGS_WARN, LOGF_RtcLinux, "Could not open hwclockfile %s",
hwclock_file);
return;
}
/* Read third line from the file. */
for (i = 0; i < 3; i++) {
if (!fgets(line, sizeof(line), in))
break;
}
fclose(in);
if (i == 3 && !strncmp(line, "LOCAL", 5)) {
rtc_on_utc = 0;
} else if (i == 3 && !strncmp(line, "UTC", 3)) {
rtc_on_utc = 1;
} else {
LOG(LOGS_WARN, LOGF_RtcLinux, "Could not read LOCAL/UTC setting from hwclockfile %s",
hwclock_file);
}
}
/* ================================================== */
static void
setup_config(void)
{
@ -380,6 +417,8 @@ setup_config(void)
rtc_on_utc = 0;
}
read_hwclock_file(CNF_GetHwclockFile());
autotrim_threshold = CNF_GetRtcAutotrim();
}