vboxadd_timesync.c revision 240f7d7012a5f64bcde850bcf048531a710d81cf
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * VirtualBox timesync daemon for Linux
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * available from http://www.virtualbox.org. This file is free software;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * you can redistribute it and/or modify it under the terms of the GNU
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * General Public License (GPL) as published by the Free Software
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * additional information or have any questions.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic void usage(void)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync " [--daemonize]\n");
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync err = nanosleep(&requestedSleepTime, &remainingSleepTime);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* if the sleep was interrupted, remember remaining sleep time */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* not good... */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* nanosleep completed and took at least the requested time */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* command line parsing */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync c = getopt_long(argc, argv, "i:dh", options, NULL);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if (c == -1)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* unrecognized option (?) or parameter missing (:) */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* open the driver */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync printf("Error opening kernel module! rc = %d\n", errno);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* prepare the request structure */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync vmmdevInitRequest((VMMDevRequestHeader*)&req, VMMDevReq_GetHostTime);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync "(C) 2008 Sun Microsystems, Inc.\n"
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* perform VMM request */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if (ioctl(fd, VBOXGUEST_IOCTL_VMMREQUEST(0), (void*)&req) >= 0)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* Adapt time smoothly and try to prevent negative time differences. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync u64Now = (uint64_t)tv.tv_sec * 1000 + (uint64_t)tv.tv_usec / 1000;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* difference less than 5 minutes => smoothly adapt the guest time */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* adjtime on Linux adjusts the time about 5 ms per 10 seconds, even
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * for very huge differences */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* difference more than 5 minutes => set the time with all consequences */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync printf("Error querying host time! header.rc = %d\n", req.header.rc);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync printf("Error performing VMM request! errno = %d\n", errno);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* wait for the next run */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync } while (1);