diff -up -r /SourceCache/ntp/ntp-44.3/ntp/include/ntpd.h ./include/ntpd.h --- /SourceCache/ntp/ntp-44.3/ntp/include/ntpd.h 2008-08-27 14:58:46.000000000 -0700 +++ ./include/ntpd.h 2008-12-04 11:19:35.000000000 -0800 @@ -246,6 +246,7 @@ extern int sock_hash P((struct sockaddr extern double old_drift; extern int save_drift_file P((void)); +extern int awoke P((void)); /* * Variable declarations for ntpd. @@ -443,6 +444,7 @@ extern u_char sys_revoke; /* keys revok extern volatile u_long alarm_overflow; extern u_long current_time; /* current time (s) */ extern u_long dns_timer; +extern u_long awake_timer; extern u_long timer_timereset; extern u_long timer_overflows; extern u_long timer_xmtcalls; diff -up -r /SourceCache/ntp/ntp-44.3/ntp/ntpd/Makefile.in ./ntpd/Makefile.in --- /SourceCache/ntp/ntp-44.3/ntp/ntpd/Makefile.in 2008-08-19 14:49:54.000000000 -0700 +++ ./ntpd/Makefile.in 2008-12-04 11:57:36.000000000 -0800 @@ -280,7 +280,7 @@ man_MANS = ntpd.1 ntpdsim.1 # sqrt ntp_control.o # floor refclock_wwv.o # which are (usually) provided by -lm. -ntpd_LDADD = $(LDADD) -lm @LCRYPTO@ $(LIBOPTS_LDADD) ../libntp/libntp.a -framework IOKit -lresolv +ntpd_LDADD = $(LDADD) -lm @LCRYPTO@ $(LIBOPTS_LDADD) ../libntp/libntp.a -framework IOKit -framework CoreFoundation -lresolv ntpdsim_LDADD = $(LDADD) ../libntp/libntpsim.a -lm @LCRYPTO@ $(LIBOPTS_LDADD) ntpdsim_CFLAGS = $(CFLAGS) -DSIM check_y2k_LDADD = $(LDADD) ../libntp/libntp.a diff -up -r /SourceCache/ntp/ntp-44.3/ntp/ntpd/ntp_io.c ./ntpd/ntp_io.c --- /SourceCache/ntp/ntp-44.3/ntp/ntpd/ntp_io.c 2008-08-19 14:49:54.000000000 -0700 +++ ./ntpd/ntp_io.c 2008-12-04 11:46:04.000000000 -0800 @@ -816,6 +816,9 @@ remove_interface(struct interface *inter static void list_if_listening(struct interface *interface, u_short port) { + if (awoke()) { + awake_timer = current_time; + } msyslog(LOG_INFO, "Listening on interface #%d %s, %s#%d %s", interface->ifnum, interface->name, diff -up -r /SourceCache/ntp/ntp-44.3/ntp/ntpd/ntp_timer.c ./ntpd/ntp_timer.c --- /SourceCache/ntp/ntp-44.3/ntp/ntpd/ntp_timer.c 2008-10-21 15:06:04.000000000 -0700 +++ ./ntpd/ntp_timer.c 2008-12-04 11:45:09.000000000 -0800 @@ -50,6 +50,7 @@ static u_long stats_timer; /* stats tim static u_long huffpuff_timer; /* huff-n'-puff timer */ static u_long interface_timer; /* interface update timer */ u_long dns_timer; /* update DNS flags on peers */ +u_long awake_timer; /* Force a time sync after wakeup */ #ifdef OPENSSL static u_long revoke_timer; /* keys revoke timer */ u_char sys_revoke = KEY_REVOKE; /* keys revoke timeout (log2 s) */ @@ -303,6 +304,17 @@ timer(void) #endif /* REFCLOCK */ } + if (awake_timer && awake_timer <= current_time) { + for (n = 0; n < NTP_HASH_SIZE; n++) { + for (peer = peer_hash[n]; peer != 0; peer = peer->next) { + peer->burst = NTP_BURST; + peer->nextdate = current_time; + } + } + allow_panic = TRUE; /* Allow for large time offsets */ + init_loopfilter(); + awake_timer = 0; + } /* * Now dispatch any peers whose event timer has expired. Be careful * here, since the peer structure might go away as the result of diff -up -r /SourceCache/ntp/ntp-44.3/ntp/ntpd/ntp_util.c ./ntpd/ntp_util.c --- /SourceCache/ntp/ntp-44.3/ntp/ntpd/ntp_util.c 2008-09-25 15:50:51.000000000 -0700 +++ ./ntpd/ntp_util.c 2008-12-04 11:18:03.000000000 -0800 @@ -885,3 +885,31 @@ ntp_exit(int retval) exit(retval); } #endif + +#define kMaxUUIDLen 37 + +/* Did we wake up since last check? Use SL API */ +/* for Leopard could trigger off changes to kern.waketime */ +int awoke(void) +{ + static char sleepwakeuuid[kMaxUUIDLen]; + int rc = 0; + io_service_t service = IORegistryEntryFromPath(kIOMasterPortDefault, + kIOPowerPlane ":/IOPowerConnection/IOPMrootDomain"); + CFStringRef uuidString = IORegistryEntryCreateCFProperty( + service, + CFSTR(kIOPMSleepWakeUUIDKey), + kCFAllocatorDefault, 0); + if (uuidString) { + char newuuid[kMaxUUIDLen]; + CFStringGetCString(uuidString, newuuid, sizeof(newuuid), + kCFStringEncodingUTF8); + rc = strncasecmp(newuuid, sleepwakeuuid, sizeof(newuuid)); + if (rc) { + strlcpy(sleepwakeuuid, newuuid, sizeof(sleepwakeuuid)); + } + CFRelease(uuidString); + } + IOObjectRelease(service); + return rc; +}