/* * NetRemoteTOD to get the current GMT time from a Windows NT server. */ int srvsvc_gettime(unsigned long *t) { smb_domainex_t di; struct timeval tv; struct tm tm; if (!smb_domain_getinfo(&di)) return (-1); if (srvsvc_net_remote_tod(di.d_dc, di.d_primary.di_nbname, &tv, &tm) != 0) return (-1); *t = tv.tv_sec; return (0); }
/* * Synchronize the local system clock with the domain controller. */ void srvsvc_timesync(void) { smb_domainex_t di; struct timeval tv; struct tm tm; time_t tsecs; if (!smb_domain_getinfo(&di)) return; if (srvsvc_net_remote_tod(di.d_dc, di.d_primary.di_nbname, &tv, &tm) != 0) return; if (settimeofday(&tv, 0)) smb_tracef("unable to set system time"); tsecs = time(0); (void) localtime_r(&tsecs, &tm); smb_tracef("SrvsvcTimeSync %s", ctime((time_t *)&tv.tv_sec)); }
/* * Compare the time here with the remote time on the server * and report clock skew. */ void ndr_srvsvc_timecheck(char *server, char *domain) { char hostname[MAXHOSTNAMELEN]; struct timeval dc_tv; struct tm dc_tm; struct tm *tm; time_t tnow; time_t tdiff; int priority; if (srvsvc_net_remote_tod(server, domain, &dc_tv, &dc_tm) < 0) { syslog(LOG_DEBUG, "srvsvc_net_remote_tod failed"); return; } tnow = time(NULL); if (tnow > dc_tv.tv_sec) tdiff = (tnow - dc_tv.tv_sec) / SECSPERMIN; else tdiff = (dc_tv.tv_sec - tnow) / SECSPERMIN; if (tdiff != 0) { (void) strlcpy(hostname, "localhost", MAXHOSTNAMELEN); (void) gethostname(hostname, MAXHOSTNAMELEN); priority = (tdiff > 2) ? LOG_NOTICE : LOG_DEBUG; syslog(priority, "DC [%s] clock skew detected: %u minutes", server, tdiff); tm = gmtime(&dc_tv.tv_sec); syslog(priority, "%-8s UTC: %s", server, asctime(tm)); tm = gmtime(&tnow); syslog(priority, "%-8s UTC: %s", hostname, asctime(tm)); } }