int vmm_rtcdev_sync_wallclock(struct vmm_rtcdev *rdev) { int rc; struct vmm_timezone tz, utc_tz; struct vmm_timeval tv; struct vmm_rtc_time tm; if (!rdev) { return VMM_EFAIL; } if ((rc = vmm_rtcdev_get_time(rdev, &tm))) { return rc; } if ((rc = vmm_wallclock_get_timezone(&tz))) { return rc; } utc_tz.tz_minuteswest = 0; utc_tz.tz_dsttime = 0; tv.tv_sec = vmm_wallclock_mktime(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); tv.tv_nsec = 0; if ((rc = vmm_wallclock_set_timeofday(&tv, &utc_tz))) { return rc; } if ((rc = vmm_wallclock_set_timezone(&tz))) { return rc; } return VMM_OK; }
static int cmd_wallclock_get_timezone(struct vmm_chardev *cdev) { int rc; struct vmm_timezone tz; if ((rc = vmm_wallclock_get_timezone(&tz))) { vmm_cprintf(cdev, "Error: get_timezone failed\n"); return rc; } if (tz.tz_minuteswest == 0) { vmm_cprintf(cdev, "UTC\n"); } else if (tz.tz_minuteswest < 0) { tz.tz_minuteswest *= -1; vmm_cprintf(cdev, "UTC-%d:%d\n", tz.tz_minuteswest / 60, tz.tz_minuteswest % 60); } else { vmm_cprintf(cdev, "UTC+%d:%d\n", tz.tz_minuteswest / 60, tz.tz_minuteswest % 60); } return VMM_OK; }