int vmm_rtcdev_sync_device(struct vmm_rtcdev *rdev) { int rc; struct vmm_timezone tz; struct vmm_timeval tv; struct vmm_rtc_time tm; if (!rdev) { return VMM_EFAIL; } if ((rc = vmm_wallclock_get_timeofday(&tv, &tz))) { return rc; } tv.tv_sec -= tz.tz_minuteswest * 60; vmm_rtc_time_to_tm((unsigned long)tv.tv_sec, &tm); if ((rc = vmm_rtcdev_set_time(rdev, &tm))) { return rc; } return VMM_OK; }
int cmd_rtcdev_set_time(struct vmm_chardev *cdev, const char * name, int targc, char **targv) { int rc; char * s; struct vmm_rtc_time tm; struct vmm_rtcdev * rtc = vmm_rtcdev_find(name); if (!rtc) { vmm_cprintf(cdev, "Error: cannot find rtc %s\n", name); return VMM_EFAIL; } s = targv[0]; rc = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; while (*s) { if (*s == ':') { rc++; } else if ('0' <= *s && *s <= '9') { switch(rc) { case 0: tm.tm_hour = tm.tm_hour * 10 + (*s - '0'); break; case 1: tm.tm_min = tm.tm_min * 10 + (*s - '0'); break; case 2: tm.tm_sec = tm.tm_sec * 10 + (*s - '0'); break; default: break; }; } s++; } rc = 0; tm.tm_mday = vmm_str2int(targv[1], 10); vmm_str2lower(targv[2]); if (vmm_strcmp(targv[2], "jan") == 0) { tm.tm_mon = 0; } else if (vmm_strcmp(targv[2], "feb") == 0) { tm.tm_mon = 1; } else if (vmm_strcmp(targv[2], "mar") == 0) { tm.tm_mon = 2; } else if (vmm_strcmp(targv[2], "apr") == 0) { tm.tm_mon = 3; } else if (vmm_strcmp(targv[2], "may") == 0) { tm.tm_mon = 4; } else if (vmm_strcmp(targv[2], "jun") == 0) { tm.tm_mon = 5; } else if (vmm_strcmp(targv[2], "jul") == 0) { tm.tm_mon = 6; } else if (vmm_strcmp(targv[2], "aug") == 0) { tm.tm_mon = 7; } else if (vmm_strcmp(targv[2], "sep") == 0) { tm.tm_mon = 8; } else if (vmm_strcmp(targv[2], "oct") == 0) { tm.tm_mon = 9; } else if (vmm_strcmp(targv[2], "nov") == 0) { tm.tm_mon = 10; } else if (vmm_strcmp(targv[2], "dec") == 0) { tm.tm_mon = 11; } else { tm.tm_mon = vmm_str2int(targv[2], 10); } tm.tm_year = vmm_str2int(targv[3], 10) - 1900; if (!vmm_rtc_valid_tm(&tm)) { vmm_cprintf(cdev, "Error: invalid date-time\n"); return VMM_EFAIL; } rc = vmm_rtcdev_set_time(rtc, &tm); if (rc) { vmm_cprintf(cdev, "Error: set_time failed for rtc %s\n", name); return rc; } return VMM_OK; }