chiark / gitweb /
Merge nss-myhostname
[elogind.git] / src / shared / hwclock.c
index 9f8ab08e2bdd0589b9fd5a0d7446c713afbbe5dc..f9adf0369ea71cc38f23315b43b57d8b66a2dc08 100644 (file)
@@ -61,10 +61,11 @@ static int rtc_open(int flags) {
 
         for (;;) {
                 char *p, *v;
-                struct dirent buf, *de;
+                struct dirent *de;
+                union dirent_storage buf;
                 int r;
 
-                r = readdir_r(d, &buf, &de);
+                r = readdir_r(d, &buf.de, &de);
                 if (r != 0)
                         goto fallback;
 
@@ -93,6 +94,11 @@ static int rtc_open(int flags) {
                         continue;
 
                 p = strappend("/dev/", de->d_name);
+                if (!p) {
+                        closedir(d);
+                        return -ENOMEM;
+                }
+
                 fd = open(p, flags);
                 free(p);
 
@@ -154,6 +160,7 @@ int hwclock_set_time(const struct tm *tm) {
 
         return err;
 }
+
 int hwclock_is_localtime(void) {
         FILE *f;
         bool local = false;
@@ -188,18 +195,18 @@ int hwclock_is_localtime(void) {
         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;
-        int minuteswest;
+        int minutesdelta;
         struct timezone tz;
 
         assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
         assert_se(tm = localtime(&ts.tv_sec));
-        minuteswest = tm->tm_gmtoff / 60;
+        minutesdelta = tm->tm_gmtoff / 60;
 
-        tz.tz_minuteswest = -minuteswest;
+        tz.tz_minuteswest = -minutesdelta;
         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)
-                *min = minuteswest;
+                *min = minutesdelta;
         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*/
 
+        /*
+         * 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;