chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
shared: add is_efiboot()
[elogind.git]
/
src
/
shared
/
hwclock.c
diff --git
a/src/shared/hwclock.c
b/src/shared/hwclock.c
index d40bb2653f886b5ef70b70c53d94aaa15d7715b4..f9adf0369ea71cc38f23315b43b57d8b66a2dc08 100644
(file)
--- a/
src/shared/hwclock.c
+++ b/
src/shared/hwclock.c
@@
-61,10
+61,11
@@
static int rtc_open(int flags) {
for (;;) {
char *p, *v;
for (;;) {
char *p, *v;
- struct dirent buf, *de;
+ struct dirent *de;
+ union dirent_storage buf;
int r;
int r;
- r = readdir_r(d, &buf, &de);
+ r = readdir_r(d, &buf
.de
, &de);
if (r != 0)
goto fallback;
if (r != 0)
goto fallback;
@@
-74,7
+75,7
@@
static int rtc_open(int flags) {
if (ignore_file(de->d_name))
continue;
if (ignore_file(de->d_name))
continue;
- p = join("/sys/class/rtc/", de->d_name, "/hctosys", NULL);
+ p =
str
join("/sys/class/rtc/", de->d_name, "/hctosys", NULL);
if (!p) {
closedir(d);
return -ENOMEM;
if (!p) {
closedir(d);
return -ENOMEM;
@@
-93,6
+94,11
@@
static int rtc_open(int flags) {
continue;
p = strappend("/dev/", de->d_name);
continue;
p = strappend("/dev/", de->d_name);
+ if (!p) {
+ closedir(d);
+ return -ENOMEM;
+ }
+
fd = open(p, flags);
free(p);
fd = open(p, flags);
free(p);
@@
-154,6
+160,7
@@
int hwclock_set_time(const struct tm *tm) {
return err;
}
return err;
}
+
int hwclock_is_localtime(void) {
FILE *f;
bool local = false;
int hwclock_is_localtime(void) {
FILE *f;
bool local = false;
@@
-188,18
+195,18
@@
int hwclock_is_localtime(void) {
return local;
}
return local;
}
-int hwclock_
apply_localtime_delta
(int *min) {
+int hwclock_
set_timezone
(int *min) {
const struct timeval *tv_null = NULL;
struct timespec ts;
struct tm *tm;
const struct timeval *tv_null = NULL;
struct timespec ts;
struct tm *tm;
- int minutes
west
;
+ int minutes
delta
;
struct timezone tz;
assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
assert_se(tm = localtime(&ts.tv_sec));
struct timezone tz;
assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
assert_se(tm = localtime(&ts.tv_sec));
- minutes
west
= tm->tm_gmtoff / 60;
+ minutes
delta
= tm->tm_gmtoff / 60;
- tz.tz_minuteswest = -minutes
west
;
+ tz.tz_minuteswest = -minutes
delta
;
tz.tz_dsttime = 0; /* DST_NONE*/
/*
tz.tz_dsttime = 0; /* DST_NONE*/
/*
@@
-210,17
+217,22
@@
int hwclock_apply_localtime_delta(int *min) {
if (settimeofday(tv_null, &tz) < 0)
return -errno;
if (min)
if (settimeofday(tv_null, &tz) < 0)
return -errno;
if (min)
- *min = minutes
west
;
+ *min = minutes
delta
;
return 0;
}
return 0;
}
-int hwclock_reset_
localtime_delta
(void) {
+int hwclock_reset_
timezone
(void) {
const struct timeval *tv_null = NULL;
struct timezone tz;
tz.tz_minuteswest = 0;
tz.tz_dsttime = 0; /* DST_NONE*/
const struct timeval *tv_null = NULL;
struct timezone tz;
tz.tz_minuteswest = 0;
tz.tz_dsttime = 0; /* DST_NONE*/
+ /*
+ * The very first time we set the kernel's timezone, it will warp
+ * the clock. Do a dummy call here, so the time warping is sealed
+ * and we set only the time zone with next call.
+ */
if (settimeofday(tv_null, &tz) < 0)
return -errno;
if (settimeofday(tv_null, &tz) < 0)
return -errno;