/* timesync stuff for leash - 7/28/94 - evanr */ #include #include #include #include #include #include #ifdef WSHELPER #include #endif #ifdef WIN32 #define _fmemcpy memcpy #endif extern HANDLE hThisInstance; #define TM_OFFSET 2208988800 struct timezone { /* timezone.h has a winsock.h conflict */ int tz_minuteswest; int tz_dsttime; }; #ifdef WIN32 int settimeofday (struct timeval *tv,struct timezone *tz) { SYSTEMTIME systime; struct tm *newtime; int rc = 0; newtime = gmtime((time_t *)&(tv->tv_sec)); systime.wYear = 1900+newtime->tm_year; systime.wMonth = 1+newtime->tm_mon; systime.wDay = newtime->tm_mday; systime.wHour = newtime->tm_hour; systime.wMinute = newtime->tm_min; systime.wSecond = newtime->tm_sec; systime.wMilliseconds = 0; rc = SetSystemTime(&systime); if ( !rc ) return(rc); else return(GetLastError()); } #else int settimeofday (struct timeval *tv,struct timezone *tz) { struct _dostime_t dostime; struct _dosdate_t dosdate; struct tm *newtime; newtime = localtime((time_t *)&(tv->tv_sec)); dostime.hour = newtime->tm_hour; dostime.minute = newtime->tm_min; dostime.second = newtime->tm_sec; dostime.hsecond = 0; dosdate.day = newtime->tm_mday; dosdate.month = 1+newtime->tm_mon; /* burp! Microsft really sucks */ dosdate.year = 1900+newtime->tm_year; /* burp! Microsoft sucks again... */ dosdate.dayofweek = newtime->tm_wday; if (_dos_setdate(&dosdate) == 0 && _dos_settime(&dostime) == 0) return 0; return 1; } #endif int gettimeofday (struct timeval *tv,struct timezone *tz) { time_t long_time; #ifdef COMMENT if (getenv ("TZ") == NULL) /* Default New York, New York, USA time */ { _timezone = 18000; _daylight = 1; _tzname[0] = "EST"; _tzname[1] = "EDT"; } else #endif _tzset(); tz->tz_minuteswest = _timezone; tz->tz_dsttime = _daylight; time(&long_time); tv->tv_sec = long_time; tv->tv_usec = 0; return 0; } int main(int argc, char * argv[]) { char buffer[512]; struct timeval tv; struct timezone tz; jmp_buf top_level; struct sockaddr_in sin; struct servent FAR * sp; struct hostent FAR *host; register int s; long hosttime; register long *nettime; /* used to be an int */ char tmpstr[80], hostname[64], *phostname=NULL; int attempts = 0, cc, host_retry; WORD wVersionRequested; WSADATA wsaData; int err; int check; wVersionRequested = 0x0101; err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { sprintf(tmpstr, "Couldn't initialize WinSock to synchronize time\n\r" "Error Number: %d", err); printf(tmpstr); WSACleanup( ); return(1); } /* OK, now try the resource -- to be added */ sp = getservbyname("time", "udp"); if (sp == 0) sin.sin_port = htons(IPPORT_TIMESERVER); else sin.sin_port = sp->s_port; host_retry = 0; if( argc > 1 ){ strncpy (hostname, argv[1], 64 ); hostname[63] = '\0'; phostname = hostname; } else { hostname[0] = '\0'; phostname = "time"; } get_host: while (host_retry < 5) { host = gethostbyname(phostname); if ((host != NULL) && WSAGetLastError() != WSATRY_AGAIN) { break; } if ( phostname == hostname ) { printf("trouble resolving \"%s\", trying \"time\" ...\n", hostname); phostname = "time"; } else if ( !strcmp(phostname,"time") ) { printf("trouble resolving \"time\", trying \"timehost\" ...\n"); phostname = "timehost"; } else if ( !strcmp(phostname,"timehost") ) { if ( hostname[0] ) { printf("trouble resolving \"timehost\", retrying \"%s\" ...\n", hostname); phostname = hostname; } else { printf("trouble resolving \"timehost\", retrying \"time\" ...\n"); phostname = "time"; } host_retry++; } } if (host == NULL) { sprintf (tmpstr, "The timeserver host cannot be found\n"); printf(tmpstr); WSACleanup(); return(2); } sin.sin_family = host->h_addrtype; _fmemcpy ((struct sockaddr *)&sin.sin_addr, host->h_addr, host->h_length); s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { sprintf(tmpstr, "Couldn't open socket - Error: %d", WSAGetLastError()); printf(tmpstr); WSACleanup(); return(3); } if (connect (s, (struct sockaddr *)&sin, sizeof (sin)) < 0) { sprintf(tmpstr, "Couldn't connect to timeserver - Error: %d", WSAGetLastError()); printf(tmpstr); WSACleanup(); return(4); } setjmp(top_level); if (attempts++ > 5) { closesocket (s); sprintf (tmpstr, "Failed to get time from %s - Error: %d", phostname, WSAGetLastError()); printf(tmpstr); WSACleanup(); return(5); } send (s, buffer, 40, 0); /* Send an empty packet */ if (gettimeofday (&tv, &tz) < 0) { sprintf(tmpstr,"Unable to get local time\n"); printf(tmpstr); WSACleanup(); return(6); } cc = recv (s, buffer, 512, 0); if (cc < 0) { sprintf(tmpstr, "Error receiving time from %s - Error: %d", phostname, WSAGetLastError()); printf(tmpstr); closesocket(s); WSACleanup(); return(7); } if (cc != 4) { closesocket(s); sprintf(tmpstr, "Protocol error -- received %d bytes; expected 4", cc); printf(tmpstr); WSACleanup(); return(8); } nettime = (long *)buffer; hosttime = (long) ntohl (*nettime) - TM_OFFSET; (&tv)->tv_sec = hosttime; if (settimeofday (&tv, &tz) < 0) { printf("Couldn't set local time of day."); WSACleanup(); return(9); } strcpy(tmpstr, ctime((time_t *)&hosttime)); tmpstr[strlen(tmpstr)-1] = '\0'; printf("Local time set to %s",tmpstr); closesocket(s); WSACleanup(); return(0); }