Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Originally from http://www.tedunangst.com/flak/post/vmtimed with minimal modification
- #include <sys/param.h>
- #include <sys/sysctl.h>
- #include <sys/sensors.h>
- #include <sys/time.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <syslog.h>
- #include <unistd.h>
- void
- error(const char *msg)
- {
- syslog(LOG_DAEMON | LOG_ERR, "%s", msg);
- exit(1);
- }
- int
- findvmt0(void)
- {
- struct sensordev sdev;
- size_t slen;
- int mib[5];
- int i;
- mib[0] = CTL_HW;
- mib[1] = HW_SENSORS;
- for (i = 0; i < 20; i++) {
- mib[2] = i;
- slen = sizeof(sdev);
- if (sysctl(mib, 3, &sdev, &slen, NULL, 0) == -1)
- break;
- if (strcmp(sdev.xname, "vmmci0") == 0)
- return i;
- }
- return -1;
- }
- void
- timeloop(int vmt0)
- {
- struct sensor sensor;
- size_t slen;
- int mib[5];
- struct timeval tv;
- double delta;
- mib[0] = CTL_HW;
- mib[1] = HW_SENSORS;
- mib[2] = vmt0;
- mib[3] = SENSOR_TIMEDELTA;
- mib[4] = 0;
- while (1) {
- slen = sizeof(sensor);
- if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1)
- err(1, "sysctl");
- delta = sensor.value / 1000000000.0;
- if (delta < -30 || delta > 60) {
- syslog(LOG_DAEMON | LOG_NOTICE,
- "fixing time! %f\n", delta);
- if (gettimeofday(&tv, NULL) == -1)
- error("gettimeofday");
- tv.tv_sec -= delta;
- if (settimeofday(&tv, NULL) == -1)
- error("settimeofday");
- }
- sleep(15);
- }
- }
- int
- main(int argc, char **argv)
- {
- int vmt0;
- vmt0 = findvmt0();
- if (vmt0 == -1)
- error("can't find vmt0");
- timeloop(vmt0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement