home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
tmp9
/
timesync.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-09-12
|
6KB
|
236 lines
/* timesync stuff for leash - 7/28/94 - evanr */
#include <winsock.h>
#include <setjmp.h>
#include <time.h>
#include <dos.h>
#include <stdlib.h>
#include <string.h>
#ifdef WSHELPER
#include <wshelper.h>
#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);
}